Re: Download Dialog

artur <[email protected]> Mon, 05 Apr 2010 12:06:36 +0200
Newsgroups gmane.network.freenet.frost.devel
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------090909040209040306040206
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

Am 04.04.2010 23:29, schrieb artur:
> Hi,
>
> I found some time to do some more coding,.. here are the results:
>
> When adding a new downloads from a post (keys or attachments) a dialog
> will open, where the items can be attributed (currently download dir and
> priority). This dialog also states if the file has already been
> downloaded (download tracking) or if a file with the same name already
> exists in the download target directory.
>
> This patch also enables the tracking from which post / board a download
> was originated. Combined with a new setting (when enabled) the download
> directory will default to a subdirectory of the default download
> directory with the board name. If the target download directory does not
> already exist, it will be created.
>
>
> I attach the langres.properties file, too, because it is not part of the
> patch.
> (Can someone remove the octetstream property of this file? Since it is
> no longer needed for svn...)
>
> The patch is against the new trunk...
>

I have added 3 Buttons to the Dialog, to easy remove all item from the 
list that:
- Match already downloaded files by Key
- Match already downloaded files by Name
- A File already exist in the target dir with the same name.

Cheers

artur


--------------090909040209040306040206
Content-Type: text/plain;
 name="langres.properties"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="langres.properties"

AboutBox.label.openSourceProject=Open Source Project (GPL license)
AboutBox.label.version=Version
AboutBox.text.development=Development:
AboutBox.text.miscCodeContributions=Misc code contributions:
AboutBox.text.splashScreenLogo=Splash Screen Logo:
AboutBox.text.systemTrayExecutables=System Tray Executables:
AboutBox.text.translationSupport=Translation Support:
AboutBox.text.windowsInstaller=Windows Installer:
AboutBox.title=About
AddNewDownloadsDialog.title=Add new Files to download list
AddNewDownloadsDialog.button.changeDownloadDir=Change download target directory
AddNewDownloadsDialog.button.removeDownload=Remove
AddNewDownloadsDialog.changeDirDialog.title=Change target Directory
AddNewDownloadsDialog.table.name=Name
AddNewDownloadsDialog.table.key=Key
AddNewDownloadsDialog.table.priority=Priority
AddNewDownloadsDialog.table.downloadDir=Download Directory
AddNewDownloadsDialog.table.comment=Comment
AddNewDownloadsDialog.table.alreadyDownloaded=File downloaded previously
AddNewDownloadsDialog.table.alreadyDownloadedName=File with same name downloaded previously
AddNewDownloadsDialog.table.alreadyExists=File already exists in Download Directory
AddNewDownloadsDialog.button.removeAlreadyDownloadedButton=Remove already Downloaded
AddNewDownloadsDialog.button.removeAlreadyDownloadedNameButton=Remove already Downloaded by name
AddNewDownloadsDialog.button.removeAlreadyExistsButton=Remove already exists
AddNewDownloadsDialog.buttonTooltip.removeAlreadyDownloadedButton=Remove all files from download list which have been downloaded previously, matching by key
AddNewDownloadsDialog.buttonTooltip.removeAlreadyDownloadedNameButton=Remove all files from download list which have been downloaded previously, matching by name
AddNewDownloadsDialog.buttonTooltip.removeAlreadyExistsButton=Remove all files from download list where a file with the same name already exists in the destination directory
AltEdit.errorDialog.couldNotCreateMessageFile=Could not create message file for alternate editor
AltEdit.errorDialog.couldNotStartEditorUsingCommand=Could not start alternate editor using command
AltEdit.errorDialog.invalidReturnedMessageFile=The message file returned by the alternate editor is invalid.
AltEdit.errorDialog.missingPlaceholder=Configured alternate editor line must contain a '%f' as placeholder for the filename.
AltEdit.errorDialog.noAlternateEditorConfigured=No alternate editor configured.
AltEdit.errorDialogs.title=Error
AltEdit.markerLine.subject=*--- Subject line (changeable) ---*
AltEdit.markerLine.text=*--- Enter your text after this line ---*
AltEdit.textFileMessage.1=>>> This is a Frost alternate editor message file.                <<<
AltEdit.textFileMessage.2=>>> You can edit the subject and add text at the end of the file. <<<
AltEdit.textFileMessage.3=>>> Don't change or delete the marker lines!                      <<<
Board.boardState.invalid=(INVALID, no public key, but private!)
Board.boardState.publicBoard=public board
Board.boardState.readAccess=read access
Board.boardState.writeAccess=write access
BoardInfoFrame.button.close=Close
BoardInfoFrame.button.update=Update view
BoardInfoFrame.button.updateAllBoards=Update all boards
BoardInfoFrame.button.updateSelectedBoard=Update selected boards
BoardInfoFrame.button.removeSelectedBoards=Remove selected boards
BoardInfoFrame.label.boards=Boards
BoardInfoFrame.label.messages=Messages
BoardInfoFrame.popupMenu.copyInfoToClipboard=Copy information to clipboard
BoardInfoFrame.table.board=Board
BoardInfoFrame.table.messages=Messages
BoardInfoFrame.table.messagesToday=Today
BoardInfoFrame.table.messagesFlagged=Flagged
BoardInfoFrame.table.messagesStarred=Starred
BoardInfoFrame.table.messagesUnread=Unread
BoardInfoFrame.table.lastMsgDate=Last Msg
BoardInfoFrame.table.state=State
BoardInfoFrame.title=Board information window
BoardsChooser.title=Choose boards
BoardSettings.button.generateNewKeypair=Generate new keypair
BoardSettings.generateKeyPairErrorDialog.title=Warning
BoardSettings.label.description=Description:
BoardSettings.label.enableAutomaticBoardUpdate=Enable automatic board update
BoardSettings.label.hideBadMessages=Hide messages flagged BAD
BoardSettings.label.hideCheckMessages=Hide messages flagged CHECK
BoardSettings.label.hideObserveMessages=Hide messages flagged OBSERVE
BoardSettings.label.hideUnsignedMessages=Hide unsigned messages
BoardSettings.label.maximumMessageDisplay=Number of days to display
BoardSettings.label.maximumMessageDownload=Number of days to download backwards
BoardSettings.label.no=No
BoardSettings.label.overrideDefaultSettings=Override default settings
BoardSettings.label.privateKey=Private key
BoardSettings.label.publicBoard=Public board
BoardSettings.label.publicKey=Public key
BoardSettings.label.secureBoard=Secure board
BoardSettings.label.setTo=Set to
BoardSettings.label.storeSentMessages=Save sent messages
BoardSettings.label.useDefault=Use default
BoardSettings.label.yes=Yes
BoardSettings.label.hideMessageCountDisplay=Hide messages from identities with fewer than X received messages (0 disables)
BoardSettings.looseKeysWarningDialog.body=If you set this board as public, you will lose its keys. Are you sure you want to do that?
BoardSettings.looseKeysWarningDialog.title=Set Board as Public?
BoardSettings.text.keyNotAvailable=Not available
BoardSettings.title.boardSettings=Settings for board
BoardSettings.title.folderSettings=Settings for all boards in folder
BoardTree.duplicateNewBoardNameError.body=You already have a board with name ''{0}''!\nPlease choose a new name.
BoardTree.duplicateNewBoardNameError.title=Duplicate board name
BoardTree.newFolderDialog.body=Please enter a name for the new folder
BoardTree.newFolderDialog.defaultName=newFolder
BoardTree.newFolderDialog.title=New Folder Name
BoardTree.overWriteBoardConfirmation.body=You already have a board with name ''{0}''!\nDo you really want to overwrite it?\n(This will not delete messages)
BoardTree.overWriteBoardConfirmation.title=Overwrite existing board
BoardTree.popupmenu.addNewBoard=Add new board
BoardTree.popupmenu.addNewFolder=Add new folder
BoardTree.popupmenu.board=board
BoardTree.popupmenu.Board=Board
BoardTree.popupmenu.configureSelectedBoard=Configure selected board
BoardTree.popupmenu.configureSelectedFolder=Configure selected folder
BoardTree.popupmenu.cut=Cut
BoardTree.popupmenu.Folder=Folder
BoardTree.popupmenu.folder=folder
BoardTree.popupmenu.markAllMessagesRead=Mark ALL messages read
BoardTree.popupmenu.paste=Paste
BoardTree.popupmenu.refresh=Refresh
BoardTree.popupmenu.remove=Remove
BoardTree.popupmenu.renameFolder=Rename folder
BoardTree.popupmenu.searchMessages=Search this board
BoardTree.popupmenu.sendMessage=Send message
BoardTree.popupmenu.sortFolder=Sort folder
BoardTree.removeBoardConfirmation.body=Do you really want to delete board ''{0}'' ? All messages in this board will be deleted too.
BoardTree.removeBoardConfirmation.title=Remove board ''{0}''
BoardTree.removeFolderConfirmation.body=Do you really want to delete folder ''{0}'' ?\nNOTE: Removing it will also remove all boards, folders and messages inside this folder!
BoardTree.removeFolderConfirmation.title=Remove folder ''{0}''
Common.browse=Browse
Common.cancel=Cancel
Common.copy=Copy
Common.copyToClipBoard.copyExtendedInfo=Copy extended info
Common.copyToClipBoard.copyKeysWithFilenames=Copy keys with filenames
Common.copyToClipBoard.extendedInfo.bytes=Bytes:
Common.copyToClipBoard.extendedInfo.file=File :
Common.copyToClipBoard.extendedInfo.key=Key  :
Common.copyToClipBoard.extendedInfo.keyNotAvailableYet=Key not available yet
Common.copyToClipBoard=Copy to clipboard
Common.cut=Cut
Common.details=Details
Common.exit=Exit
Common.ignoreMessagesOfThisType=Ignore such messages
Common.ok=Ok
Common.paste=Paste
Common.priority.changePriority=Change priority
Common.priority.priority0=0  (maximum)
Common.priority.priority1=1
Common.priority.priority2=2
Common.priority.priority3=3  (recommended)
Common.priority.priority4=4
Common.priority.priority5=5
Common.priority.priority6=6  (pause)
Common.properties=Properties
Common.suppressConfirmationCheckbox=Show this dialog the next time
Core.init.NodeNotRunningBody=Make sure your node is running and that you have configured Freenet correctly.\nNevertheless, to allow you to read messages, Frost will startup now.\nPlease note that automatic board updates were disabled (Menu 'News')!\nDon't get confused by some error messages ;)\n
Core.init.NodeNotRunningTitle=Error - could not establish a connection to freenet node.
Core.init.TestnetWarningBody=Your freenet node runs in TESTNET mode, no anonymity is provided!
Core.init.TestnetWarningTitle=Freenet node in TESTNET mode
Core.init.UnsupportedFreenetVersionBody=Freenet version is not supported
Core.init.UnsupportedFreenetVersionTitle=Freenet version is not supported
Core.init.FileSharingEnabledBody=Filesharing is enabled. It is vulnerable to spamming and disabling it is highly recommended.\nLeaving it enabled will gradually increase the time it takes to start up Frost (due to filelist.dbs being flooded with junk) and increase both resource and bandwidth usage.\n\nIf you choose to disable it, you should exit Frost and remove filelist.dbs to free up some disk space and decrease startup times.
Core.init.FileSharingEnabledTitle=Filesharing enabled
Core.loadIdentities.ChooseName=Choose an identity name, it doesn't have to be unique\n
Core.loadIdentities.InvalidNameBody=The name is invalid, please choose another name.
Core.loadIdentities.InvalidNameTitle=Invalid identity name
DialogWithDetails.button.less=Less
DialogWithDetails.button.more=More
DownloadPane.fileTable.blocks=Blocks
DownloadPane.fileTable.enabled=Enabled
DownloadPane.fileTable.filename=Filename
DownloadPane.fileTable.isDDA.tooltip=Indicates if the file is stored by the node to the target file.
DownloadPane.fileTable.isDDA=DDA
DownloadPane.fileTable.key=Key
DownloadPane.fileTable.downloadDir=Download directory
DownloadPane.fileTable.lastReceived=Last seen
DownloadPane.fileTable.lastUploaded=Last uploaded
DownloadPane.fileTable.popupmenu.enableDownloads.disableAllDownloads=Disable all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.disableSelectedDownloads=Disable selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads.enableAllDownloads=Enable all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.enableSelectedDownloads=Enable selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads.invertEnabledStateForAllDownloads=Invert enabled state for all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.invertEnabledStateForSelectedDownloads=Invert enabled state for selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads=Enable downloads
DownloadPane.fileTable.popupmenu.remove.removeSelectedDownloads=Remove selected downloads
DownloadPane.fileTable.popupmenu.remove=Remove
DownloadPane.fileTable.popupmenu.removeFromGlobalQueue=Remove from global queue
DownloadPane.fileTable.popupmenu.restartSelectedDownloads=Restart selected downloads
DownloadPane.fileTable.popupmenu.retrieveDirectExternalDownloads=Retrieve direct external downloads into download directory
DownloadPane.fileTable.popupmenu.startSelectedDownloadsNow=Start selected downloads immediately
DownloadPane.fileTable.popupmenu.useThisDownloadDir=Use this download directory
DownloadPane.fileTable.popupmenu.jumpToAssociatedMessage=View associated message
DownloadPane.fileTable.priority=Priority
DownloadPane.fileTable.requested.tooltip=If an icon is shown then this file was requested in the last 24 hours by us or someone else.
DownloadPane.fileTable.requested=File requested
DownloadPane.fileTable.shared.tooltip=An icon indicates a shared file.
DownloadPane.fileTable.shared=Shared file
DownloadPane.fileTable.size=Size
DownloadPane.fileTable.state=State
DownloadPane.fileTable.states.decodingSegment=Decoding segment
DownloadPane.fileTable.states.done=Done
DownloadPane.fileTable.states.downloading=Downloading
DownloadPane.fileTable.states.failed=Failed
DownloadPane.fileTable.states.trying=Trying
DownloadPane.fileTable.states.unknown=Unknown
DownloadPane.fileTable.states.waiting=Waiting
DownloadPane.fileTable.tries=Tries
DownloadPane.invalidKeyDialog.body=Invalid freenet key: {0}
DownloadPane.invalidKeyDialog.title=Invalid key
DownloadPane.alreadyTrackedDialog.title=Key already downloaded
DownloadPane.alreadyTrackedDialog.body=The key has already been downloaded previously:\n{0}\n\nDo you want to download it again?
DownloadPane.removeFinishedDownloads=Remove finished
DownloadPane.showExternalGlobalQueueItems=Show global queue
DownloadPane.toolbar.tooltip.activateDownloading=Activate downloading
DownloadPane.toolbar.tooltip.addKeys=Quickload: enter or paste keys to download, separated by a semicolon ; or one key per line
DownloadPane.toolbar.tooltip.pasteKeys=Add keys from clipboard
DownloadPane.toolbar.tooltip.downloadPrefix=Filename prefix
DownloadPane.toolbar.tooltip.downloadDir=Default download directory for keys added through the quickload text field
DownloadPane.toolbar.tooltip.applyDownloadPrefix=Set download filename prefix for selected files
DownloadPane.toolbar.tooltip.selectDownloadDir=Browse for download directory
DownloadPane.toolbar.tooltip.createDownloadDir=Create directory
DownloadPane.toolbar.tooltip.applyDownloadDir=Set download directory for selected files
DownloadPane.toolbar.tooltip.pauseDownloading=Pause downloading
DownloadPane.toolbar.waiting=Waiting
DownloadPane.toolbar.label.downloadQuickload=Quickload
DownloadPane.toolbar.label.downloadPrefix=Prefix
DownloadPane.toolbar.label.downloadDir=Directory
DownloadPane.toolbar.downloadDirMenu.setDownloadDirTo=Set to...
FileAttachmentUploadThread.fileNotFoundError.text=The message that is currently send (maybe a send retry on next startup of Frost)\ncontains a file attachment that does not longer exist, or it is a 0 byte file!\n\nThe send of the message was aborted and the message file was deleted\nto prevent another upload try on next startup of Frost.\nFile: {0}
FileAttachmentUploadThread.fileNotFoundError.title=Unrecoverable error
FileListFileDetailsDialog.button.close=Close
FileListFileDetailsDialog.popupmenu.searchFilesOfOwner=Search for files of owner
FileListFileDetailsDialog.table.comment=Comment
FileListFileDetailsDialog.table.filename=Filename
FileListFileDetailsDialog.table.key=Key
FileListFileDetailsDialog.table.keywords=Keywords
FileListFileDetailsDialog.table.lastReceived=Last seen
FileListFileDetailsDialog.table.lastUploaded=Last upload
FileListFileDetailsDialog.table.owner=Owner
FileListFileDetailsDialog.table.rating=Rating
FileListFileDetailsDialog.table.state.never=Never
FileListFileDetailsDialog.table.state.unknown=Unknown
FileListFileDetailsDialog.table.trustState=Trust state
FileListFileDetailsDialog.title=File details
FirstStartupDialog.welcomeText.label=<html><br><font size="+2"><center><b>Welcome to Frost!</b></center></font><br><br>Frost will now connect to a Freenet 0.7 node.<br>By default Frost connects to a node on localhost<br>using the standard FCP2 darknet port: 127.0.0.1:9481</html> 
FirstStartupDialog.overrideFcpHost.label=Override Freenet FCP host:port
FirstStartupDialog.title=Frost first startup
Frost.lockFileFound=This indicates that another Frost instance is already running in this directory.\nRunning Frost concurrently will cause data loss.\nIf you are REALLY SURE that Frost is not already running, delete the lockfile:\n
IdentitiesBrowser.button.cleanup.tooltip=Delete all identities without messages or files
IdentitiesBrowser.button.cleanup=Cleanup
IdentitiesBrowser.button.close=Close
IdentitiesBrowser.button.delete.tooltip.multiple=Delete selected identities
IdentitiesBrowser.button.delete.tooltip.single=Delete selected identity
IdentitiesBrowser.button.delete=Delete
IdentitiesBrowser.button.export=Export
IdentitiesBrowser.button.import=Import
IdentitiesBrowser.cleanupDialog.deleteIdentities.body=Cleanup will delete {0} unused identities.
IdentitiesBrowser.cleanupDialog.deleteIdentities.title=Cleanup identities
IdentitiesBrowser.cleanupDialog.nothingToDelete.body=There are no deletable identities.
IdentitiesBrowser.cleanupDialog.nothingToDelete.title=Cleanup identities
IdentitiesBrowser.deleteDialog.body=Delete {0} selected identities?
IdentitiesBrowser.deleteDialog.title=Delete identities
IdentitiesBrowser.exportIdentitiesConfirmXmlFileOverwrite.body=Overwite XML file ''{0}'' ?
IdentitiesBrowser.exportIdentitiesConfirmXmlFileOverwrite.title=Confirm overwrite
IdentitiesBrowser.identitiesExported.body=Exported {0} identities.
IdentitiesBrowser.identitiesExported.title=Identities exported
IdentitiesBrowser.identitiesExportFailed.body=Identities export failed.
IdentitiesBrowser.identitiesExportFailed.title=Export failed
IdentitiesBrowser.identitiesImported.body=<html>Imported {0} identities, skipped {1} duplicate identities.<br>You need to close and reopen this dialog to see the imported identities.</html>
IdentitiesBrowser.identitiesImported.title=Identities imported
IdentitiesBrowser.identitiesTable.files=Files
IdentitiesBrowser.identitiesTable.lastSeen=Last seen
IdentitiesBrowser.identitiesTable.messages=Messages
IdentitiesBrowser.identitiesTable.name=Name
IdentitiesBrowser.identitiesTable.receivedMessages=Received messages
IdentitiesBrowser.identitiesTable.state=State
IdentitiesBrowser.label.filter=Filter
IdentitiesBrowser.label.lookup=Lookup
IdentitiesBrowser.noIdentityToExport.body=No identities to export found.\nOnly GOOD, OBSERVE or BAD identities can be exported.
IdentitiesBrowser.noIdentityToExport.title=No identities to export
IdentitiesBrowser.noIdentityToImport.body=No identities to import found in XML file.
IdentitiesBrowser.noIdentityToImport.title=No identities found
IdentitiesBrowser.popupmenu.copyUniqueName=Copy unique name
IdentitiesBrowser.popupmenu.copyUniqueNameAndPublicKey=Copy unique name and public key
IdentitiesBrowser.popupmenu.exportSelectedIdentities=Export selected identities
IdentitiesBrowser.progressDialog.body=Retrieving identity information from database
IdentitiesBrowser.progressDialog.title=Retrieving identity information
IdentitiesBrowser.title=Identities Browser  ({0} identities)
KnownBoardsFrame.boardsExported.body=Exported {0} known boards to XML file ''{1}''.
KnownBoardsFrame.boardsExported.title=Boards exported
KnownBoardsFrame.boardsImported.body=Loaded {0} boards from XML file ''{1}'', {2} new boards added to list.
KnownBoardsFrame.boardsImported.title=Boards imported
KnownBoardsFrame.button.actions=Actions
KnownBoardsFrame.button.addBoards=Add selected board(s)
KnownBoardsFrame.button.addBoardsToFolder=Add selected board(s) to folder
KnownBoardsFrame.button.close=Close
KnownBoardsFrame.button.export=Export
KnownBoardsFrame.button.hideBoard=Hide board name
KnownBoardsFrame.button.import=Import
KnownBoardsFrame.button.removeBoard=Remove selected board(s)
KnownBoardsFrame.button.unhideBoard=Unhide board name
KnownBoardsFrame.exportFailed.body=Export to XML file failed! Disk full?
KnownBoardsFrame.exportFailed.title=Export failed
KnownBoardsFrame.label.filter=Filter
KnownBoardsFrame.label.lookup=Lookup
KnownBoardsFrame.noBoardsImported.body=No boards found in XML file.
KnownBoardsFrame.noBoardsImported.title=No boards imported
KnownBoardsFrame.table.boardName=Boardname
KnownBoardsFrame.table.description=Description
KnownBoardsFrame.table.privateKey=Private key
KnownBoardsFrame.table.publicKey=Public key
KnownBoardsFrame.title=List of known boards
KnownBoardsFrame.tooltip.showHidden=Show hidden boards
MainFrame.dialog.renameFolder=Please enter the new name
MainFrame.menu.file.statistics=Statistics
MainFrame.menu.file=File
MainFrame.menu.help.aboutFrost=About
MainFrame.menu.help.help=Help
MainFrame.menu.help.showMemoryMonitor=Show memory monitor
MainFrame.menu.help=Help
MainFrame.menu.language.bulgarian=Bulgarian
MainFrame.menu.language.danish=Danish
MainFrame.menu.language.default=Default
MainFrame.menu.language.dutch=Dutch
MainFrame.menu.language.english=English
MainFrame.menu.language.esperanto=Esperanto
MainFrame.menu.language.french=French
MainFrame.menu.language.german=German
MainFrame.menu.language.italian=Italian
MainFrame.menu.language.japanese=Japanese
MainFrame.menu.language.polish=Polish
MainFrame.menu.language.russian=Russian
MainFrame.menu.language.spanish=Spanish
MainFrame.menu.language.swedish=Swedish
MainFrame.menu.language=Language
MainFrame.menu.news.automaticBoardUpdate=Automatic board update
MainFrame.menu.news.displayBoardInformationWindow=Display board information window
MainFrame.menu.news.displayBoardUpdateInformationMenuItem=Display board update informations
MainFrame.menu.news.displayKnownBoards=Display known boards
MainFrame.menu.news.searchMessages=Search messages
MainFrame.menu.news=News
MainFrame.menu.options.manageIdentities=Manage identities
MainFrame.menu.options.manageLocalIdentities=Manage own identities
MainFrame.menu.options.preferences=Preferences
MainFrame.menu.options=Options
MainFrame.menu.plugins.translateFrost=Translate Frost into another language
MainFrame.menu.plugins=Plugins
MainFrame.openCreateMessageWindows.body=Some create message windows are still open.\nDo you want to exit anyway?
MainFrame.openCreateMessageWindows.title=Discard messages
MainFrame.runningUploadsWarning.body=Some messages are still being uploaded.\nDo you want to exit anyway?
MainFrame.runningUploadsWarning.title=Uploads underway
MainFrame.statusBar.downloading=Downloading
MainFrame.statusBar.file=file
MainFrame.statusBar.fileListDownloadQueueSize=FLQ
MainFrame.statusBar.files=files
MainFrame.statusBar.selectedBoard=Selected board
MainFrame.statusBar.TOFDO=TOFDO
MainFrame.statusBar.TOFUP=TOFUP
MainFrame.statusBar.tooltip.fileListDownloadQueueSize=<html>Number of enqueued file lists to download.<br>Once all file lists are downloaded the file search finds the most current files.</html> 
MainFrame.statusBar.uploading=Uploading
MainFrame.tabbedPane.downloads=Downloads
MainFrame.tabbedPane.freetalk=Freetalk
MainFrame.tabbedPane.news=News
MainFrame.tabbedPane.search=Search files
MainFrame.tabbedPane.sharing=My shared files
MainFrame.tabbedPane.uploads=Uploads
MainFrame.toolbar.tooltip.boardInformationWindow=Board Information Window
MainFrame.toolbar.tooltip.configureBoard=Configure board
MainFrame.toolbar.tooltip.displayListOfKnownBoards=Display list of known boards
MainFrame.toolbar.tooltip.minimizeToSystemTray=Minimize to System Tray
MainFrame.toolbar.tooltip.newBoard=New board
MainFrame.toolbar.tooltip.newFolder=New folder
MainFrame.toolbar.tooltip.removeBoard=Remove board
MainFrame.toolbar.tooltip.renameFolder=Rename folder
MainFrame.toolbar.tooltip.searchMessages=Search messages
MainFrameStatusBar.tooltip.tofdn=<html>Updating boards: {0}<br>Board update threads: {1}</html>
MainFrameStatusBar.tooltip.tofup=<html>Uploading messages: {0}<br>Waiting messages: {1}<br>Waiting attachments: {2}</html>
ManageLocalIdentities.button.close=Close
ManageLocalIdentities.button.createNewIdentity=Create Identity
ManageLocalIdentities.button.deleteIdentity=Delete Identity
ManageLocalIdentities.button.editSignature=Edit signature
ManageLocalIdentities.button.exportXml=Export into XML file
ManageLocalIdentities.button.importIdentity=Import from ''identities.xml''
ManageLocalIdentities.button.importXml=Import from XML file
ManageLocalIdentities.cannotDeleteLastIdentity.body=The last existing identity can not be deleted.
ManageLocalIdentities.cannotDeleteLastIdentity.title=Cannot delete last identity
ManageLocalIdentities.deleteIdentitiesSharedFilesConfirmation.body=The identity ''{0}'' shares {1} files which will be removed. Proceed?
ManageLocalIdentities.deleteIdentitiesSharedFilesConfirmation.title=Shared files for identity
ManageLocalIdentities.deleteIdentityConfirmation.body=Do you really want to delete the identity ''{0}''?
ManageLocalIdentities.deleteIdentityConfirmation.title=Confirm identity delete
ManageLocalIdentities.duplicateIdentity.body=Imported identity ''{0}'' is already in list.
ManageLocalIdentities.duplicateIdentity.title=Duplicate identity
ManageLocalIdentities.duplicateLocalIdentity.body=Imported identity ''{0}'' is already in list.
ManageLocalIdentities.duplicateLocalIdentity.title=Duplicate identity
ManageLocalIdentities.exportIdentitiesConfirmXmlFileOverwrite.body=Overwite XML file ''{0}'' ?
ManageLocalIdentities.exportIdentitiesConfirmXmlFileOverwrite.title=Confirm overwrite
ManageLocalIdentities.identitiesExported.body=Exported {0} identities.
ManageLocalIdentities.identitiesExported.title=Identities exported
ManageLocalIdentities.identitiesExportFailed.body=Identities export failed.
ManageLocalIdentities.identitiesExportFailed.title=Export failed
ManageLocalIdentities.identityImported.body=Imported identity ''{0}''.
ManageLocalIdentities.identityImported.title=Identity imported
ManageLocalidentities.listLabel=Own Identities
ManageLocalIdentities.localIdentitiesImported.body=Imported {0} identities.
ManageLocalIdentities.localIdentitiesImported.title=Identities imported
ManageLocalIdentities.noIdentityToImport.body=No identity to import found.
ManageLocalIdentities.noIdentityToImport.title=No identity found
ManageLocalIdentities.noLocalIdentityToImport.body=No identities to import found in XML file.
ManageLocalIdentities.noLocalIdentityToImport.title=No identities found
ManageLocalIdentities.privateKeyExportWarning.body=The private keys of your identities will be contained in the XML file!\nHandle this file carefully.
ManageLocalIdentities.privateKeyExportWarning.title=Private key warning
ManageLocalIdentities.title=Manage own identities
ManageLocalIdentitiesSignatureDialog.title=Edit signature for identity ''{0}''
MessageFrame.attachBoard.sendPrivateKeyConfirmationDialog.body=You have the private key to board ''{0}''. Are you sure you want it attached?\nIf you choose NO, only the public key will be attached.
MessageFrame.attachBoard.sendPrivateKeyConfirmationDialog.title=Include private board key?
MessageFrame.attachmentTables.popupmenu.remove=Remove
MessageFrame.board=Board
MessageFrame.boardAttachmentTable.boardname=Boardname
MessageFrame.boardAttachmentTable.description=Description
MessageFrame.boardAttachmentTable.privateKey=Private key
MessageFrame.boardAttachmentTable.publicKey=Public key
MessageFrame.createMessage.title=Create message
MessageFrame.defaultSubjectWarning.text=Do you want to enter a subject?
MessageFrame.defaultSubjectWarning.title=No subject specified!
MessageFrame.discardMessage.text=Do you want to discard your unsent message?
MessageFrame.discardMessage.title=Discard message
MessageFrame.encryptErrorNoRecipient.body=Can't encrypt the message, no recipient choosed!
MessageFrame.encryptErrorNoRecipient.title=Encrypt error
MessageFrame.fileAttachmentTable.filename=Filename
MessageFrame.fileAttachmentTable.size=Size
MessageFrame.fileChooser.title=Choose file(s) / directory(s) to attach
MessageFrame.from=From
MessageFrame.noContentError.text=You must enter new content below the separator line!
MessageFrame.noContentError.title=No new message content!
MessageFrame.noSenderError.text=You must enter a sender name!
MessageFrame.noSenderError.title=No 'From' specified!
MessageFrame.noSubjectError.text=You must enter a subject!
MessageFrame.noSubjectError.title=No subject specified!
MessageFrame.subject=Subject
MessageFrame.textTooLargeError.text=The text of the message is too large ({0} characters, {1} allowed)!
MessageFrame.textTooLargeError.title=Message text is too large!
MessageFrame.toolbar.encryptFor=Encrypt for
MessageFrame.toolbar.tooltip.addBoardAttachments=Add Board(s)
MessageFrame.toolbar.tooltip.addFileAttachments=Add attachment(s)
MessageFrame.toolbar.tooltip.chooseSmiley=Insert smiley
MessageFrame.toolbar.tooltip.sendMessage=Send message
MessagePane.boardAttachmentTable.accessRights=Access rights
MessagePane.boardAttachmentTable.boardName=Board name
MessagePane.boardAttachmentTable.description=Description
MessagePane.boardAttachmentTable.popupmenu.addBoards=Add Board(s)
MessagePane.boardAttachmentTable.popupmenu.addBoardsToFolder=Add Board(s) to folder
MessagePane.boardAttachmentTable.popupmenu.addBoardsToKnownBoards=Add board(s) to list of known boards
MessagePane.defaultText.noBoardSelected=Select a board to view its content.
MessagePane.defaultText.noMessageSelected=Select a message to view its content.
MessagePane.defaultText.welcomeMessage=Please read this!\n\nTo use Frost, you first need to select a topic from the board information window. You can open this window with the i-button above. You can send messages and files to people using the same board. It will probably take some time until the first boards show up (press the update button).
MessagePane.fileAttachmentTable.filename=Filename
MessagePane.fileAttachmentTable.key=Key
MessagePane.fileAttachmentTable.popupmenu.downloadAttachments=Download attachment(s)
MessagePane.fileAttachmentTable.popupmenu.downloadSelectedAttachment=Download selected attachment
MessagePane.fileAttachmentTable.size=Size
MessagePane.hyperlink.popupmenu.copyAllFileKeysToClipboard=Copy all file keys to clipboard
MessagePane.hyperlink.popupmenu.copyFileKeyToClipboard=Copy file key to clipboard
MessagePane.hyperlink.popupmenu.copyFreesiteLinkToClipboard=Copy freesite link to clipboard
MessagePane.hyperlink.popupmenu.copyKeyToClipboard=Copy key to clipboard
MessagePane.hyperlink.popupmenu.downloadAllFileKeys=Download all file keys
MessagePane.hyperlink.popupmenu.downloadFileKey=Download file key
MessagePane.messageTable.date=Date
MessagePane.messageTable.from=From
MessagePane.messageTable.index=Index
MessagePane.messageTable.popupmenu.collapseAll=Collapse all
MessagePane.messageTable.popupmenu.collapseThread=Collapse thread
MessagePane.messageTable.popupmenu.deleteMessage=Delete message
MessagePane.messageTable.popupmenu.expandAll=Expand all
MessagePane.messageTable.popupmenu.expandThread=Expand thread
MessagePane.messageTable.popupmenu.markAllMessagesRead=Mark ALL messages read
MessagePane.messageTable.popupmenu.markMessageUnread=Mark message unread
MessagePane.messageTable.popupmenu.markSelectedMessagesReadItem=Mark selected messages read
MessagePane.messageTable.popupmenu.markSelectedMessagesUnreadItem=Mark selected messages unread
MessagePane.messageTable.popupmenu.markThreadRead=Mark message thread read
MessagePane.messageTable.popupmenu.setToBad=Mark user BAD
MessagePane.messageTable.popupmenu.setToCheck=Mark user CHECK
MessagePane.messageTable.popupmenu.setToGood=Mark user GOOD
MessagePane.messageTable.popupmenu.setToObserve=Mark user OBSERVE
MessagePane.messageTable.popupmenu.undeleteMessage=Undelete message
MessagePane.messageTable.sig=Sig
MessagePane.messageTable.subject=Subject
MessagePane.messageText.popupmenu.copy=Copy
MessagePane.messageText.popupmenu.saveMessageToDisk=Save message to disk
MessagePane.messageText.saveDialog.title=Save message to disk
MessagePane.messageText.downloadPrefixDialog.title=Filename prefix
MessagePane.messageText.popupmenu.downloadKeysTo=Download keys to...
MessagePane.messageText.popupmenu.browse=Browse...
MessagePane.messageText.downloadPrefixDialog.body=Enter text to prefix filenames with, or leave empty for no prefix
MessagePane.missingBoardError.text=Can't reply, the target board ''{0}'' is not in your boardlist.
MessagePane.missingBoardError.title=Error
MessagePane.missingLocalIdentityError.text=Can't reply encrypted, your identity ''{0}'' that received the original message is missing!
MessagePane.missingLocalIdentityError.title=Error
MessagePane.subjectText.popupmenu.copySubjectText=Copy subject
MessagePane.toolbar.labelAllMessageCount=Msg
MessagePane.toolbar.labelNewMessageCount=New
MessagePane.toolbar.tooltip.isSigned=This message will be sent signed
MessagePane.toolbar.tooltip.isUnsigned=This message will be sent anonymously
MessagePane.toolbar.tooltip.newMessage=New message
MessagePane.toolbar.tooltip.nextUnreadMessage=Next unread message
MessagePane.toolbar.tooltip.reply=Reply
MessagePane.toolbar.tooltip.saveMessage=Save message
MessagePane.toolbar.tooltip.setToBad=Mark user BAD
MessagePane.toolbar.tooltip.setToCheck=Mark user CHECK
MessagePane.toolbar.tooltip.setToGood=Mark user GOOD
MessagePane.toolbar.tooltip.setToObserve=Mark user OBSERVE
MessagePane.toolbar.tooltip.toggleShowHyperlinks=Toggle show keys as hyperlinks
MessagePane.toolbar.tooltip.toggleShowSmileys=Toggle show smileys
MessagePane.toolbar.tooltip.toggleShowThreads=Toggle show message threads
MessagePane.toolbar.tooltip.toggleShowUnreadOnly=Show only unread messages
MessagePane.toolbar.tooltip.toggleShowFlaggedOnly=Show only flagged messages
MessagePane.toolbar.tooltip.toggleShowStarredOnly=Show only starred messages
MessagePane.toolbar.tooltip.update=Update
MessagePane.unknownRecipientError.text=Can't reply encrypted, recipients ''{0}'' public key is missing!
MessagePane.unknownRecipientError.title=Error
MessageUploader.messageToLargeError.text=<html>The data you want to upload is too large (''{0}''), ''{1}'' is allowed.<br>This should never happen, please report this to a Frost developer!</html>
MessageUploader.messageToLargeError.title=Message is too large
MessageUploadFailedDialog.body=Frost was not able to upload your message.
MessageUploadFailedDialog.option.discardMessage=Discard message
MessageUploadFailedDialog.option.retry=Retry
MessageUploadFailedDialog.option.retryOnNextStartup=Retry on next startup
MessageUploadFailedDialog.title=Upload of message failed
MessageWindow.board=Board
MessageWindow.date=Date
MessageWindow.from=From
MessageWindow.subject=Subject
MessageWindow.to=To
MessageWindow.tooltip.reply=Reply
NewBoardDialog.add=Add Board
NewBoardDialog.description=Description (Optional). Do not put private information here:
NewBoardDialog.details=Please enter the details of the new board:
NewBoardDialog.name=Name:
NewBoardDialog.title=Add a new board
Options.boardTree=Board Tree
Options.common.days=days
Options.common.minutes=minutes
Options.common.off=Off
Options.common.on=On
Options.display.boardTree=Board Tree
Options.display.choose=Choose
Options.display.confirmMarkAllMsgsRead=Show confirmation dialog for 'Mark all messages read'
Options.display.enableAntialiasingForMessageBody=Enable antialiasing for message body
Options.display.enableMultilineSelectionsInMessageTable=Enable multiline selections in message table
Options.display.fileList=File List
Options.display.fontChooser.bold=Bold
Options.display.fontChooser.boldItalic=Bold Italic
Options.display.fontChooser.italic=Italic
Options.display.fontChooser.plain=Plain
Options.display.fontChooser.sample=Sample
Options.display.fontChooser.title=Choose a Font
Options.display.fonts=Fonts
Options.display.indicateLowReceivedMessages=Indicate low received messages for identities
Options.display.indicateLowReceivedMessagesCountLightRed=Maximum messages for LIGHTRED indicator
Options.display.indicateLowReceivedMessagesCountRed=Maximum messages for RED indicator
Options.display.messageBody=Message Body
Options.display.messageList=Message List
Options.display.preventBoardtreeReordering=Prevent board tree reordering
Options.display.refreshList=Refresh List
Options.display.saveSortStates=Save information about sorted table columns
Options.display.showBoardtreeFlaggedStarredIndicators=Show flagged/starred indicators in board tree
Options.display.showBoardUpdateCount=Show board update count for session in board tree
Options.display.showCollapsedThreads=Show collapsed message threads (default is expanded)
Options.display.expandRootChildren=Expand all replies (only root thread is collapsed)
Options.display.expandUnreadThreads=Expand unread threads
Options.display.doubleClickShowsMessage=Double clicking a message shows it in a new window
Options.display.showColoredRows=Show colored rows in tables
Options.display.showHorizontalScrollbarInMessageTable=Show horizontal scrollbar in message table
Options.display.showTooltipWithBoardDescriptionInBoardTree=Show tooltip with board description in board tree
Options.display.sortThreadRootMsgsAscending=Sort message thread root messages ascending (oldest topmost)
Options.display=Display
Options.downloads.downloadDirectory=Download directory
Options.downloads.downloadPriority=Download priority
Options.downloads.enforceFrostPriorityFileDownload=Enforce Frosts priority setting (reset external changes) 
Options.downloads.filechooser.title=Select download directory
Options.downloads.logDownloads=Log successful downloads to ''localdata/Frost-Downloads.log''
Options.downloads.maximumNumberOfRetries=Maximum number of retries
Options.downloads.numberOfSimultaneousDownloads=Number of simultaneous downloads
Options.downloads.waittimeAfterEachTry=Waittime after each try
Options.downloads=Downloads
Options.downloads.trackDownloads=Warn if a file has already been downloaded previously 
Options.downloads.downloadExec=Execute program on completion
Options.downloads.useBoardnameDownloadSubfolder=Save files in subfolder with name of the board
Options.expiration.archiveExpiredMessages=Archive expired messages
Options.expiration.cleanupIntervalDays=Cleanup interval
Options.expiration.cleanupNextStartup=Cleanup during next startup
Options.expiration.deleteExpiredMessages=Delete expired messages from keypool
Options.expiration.keepExpiredMessages=Keep expired messages in keypool
Options.expiration.keepFlaggedAndStarredMessages=Don't expire flagged and starred messages
Options.expiration.keepUnreadMessages=Don't expire unread messages
Options.expiration.numberOfDaysBeforeMessageExpires=Number of days before a message expires
Options.expiration.offlineFilesMaxDaysOld=Remove files from an owner after days not seen
Options.expiration.removeOfflineFilesWithKey=Also delete files from an owner when the file has a CHK key
Options.expiration=Expiration
Options.junk.hideJunkMessages=Hide JUNK messages
Options.junk.invalidSubsequentMessagesThreshold=Subsequent invalid messages threshold
Options.junk.markJunkIdentityBad=Mark identity that sent JUNK as BAD (if their current trust state is CHECK)
Options.junk.stopBoardUpdatesWhenDosed=Stop a board update when board is target of a DoS attack
Options.junk=Junk
Options.messages=Messages
Options.miscellaneous.automaticSavingInterval=Automatic saving interval
Options.miscellaneous.autoSaveLocalIdentities=Automatically backup own identities
Options.miscellaneous.compactStoragesDuringNextStartup=Compact storages during next startup
Options.miscellaneous.disableSplashscreen=Disable splashscreen
Options.miscellaneous.enableLogging=Enable logging
Options.miscellaneous.freenetFcpNode=Freenet node you have FCP access to (node:port)
Options.miscellaneous.logFileSizeLimit=Log files size limit  (in KB)
Options.miscellaneous.loggingLevel=Logging level
Options.miscellaneous.logLevel.high=High
Options.miscellaneous.logLevel.low=Low
Options.miscellaneous.logLevel.medium=Medium
Options.miscellaneous.logLevel.veryHigh=Very high
Options.miscellaneous.logLevel.veryLow=Very low
Options.miscellaneous.minimizeToSystray=Always minimize to SysTray
Options.miscellaneous.showSysTrayIcon=Show SysTray icon
Options.miscellaneous.useDDA.tooltip=If enabled Frost tests if direct disk access is possible for a node
Options.miscellaneous.useDDA=Use direct disk access if possible
Options.miscellaneous.useEditorForWritingMessages=Use editor for writing messages
Options.miscellaneous.usePersistence=Use persistence and global queue for uploads and downloads
Options.miscellaneous=Miscellaneous
Options.news.1.alwaysDownloadBackload.tooltip=<html>Enabled: each board update downloads the configured days backwards<br>Disabled: the full backward download of X days is only done every 12 hours</html>
Options.news.1.alwaysDownloadBackload=Always download all days backward
Options.news.1.messageBase=Message base
Options.news.1.messageDownloadPriority=Message download priority
Options.news.1.messageUploadPriority=Message upload priority
Options.news.1.numberOfDaysToDisplay=Number of days to display
Options.news.1.numberOfDaysToDownloadBackwards=Number of days to download backwards
Options.news.1.storeSentMessages=Save sent messages
Options.news.1.useOneConnectionForMessages=Use a single connection for message transfers (requires restart of Frost)
Options.news.2.blockMessagesWithBody=Block messages with body containing (separate by ';' )
Options.news.2.blockMessagesWithSubject=Block messages with subject containing (separate by ';' )
Options.news.2.blockMessagesWithTheseBoards=Block messages with these attached boards (separate by ';' )
Options.news.2.dontAddBoardsFromTrustStates=Don't add boards to known boards list from users with trust states
Options.news.2.hideMessagesWithTrustStates=Hide messages with trust states
Options.news.2.hideMessageCount=Hide messages from identities with fewer than X received messages (0 disables)
Options.news.2.hideMessageCountExcludePrivate=Always show private messages
Options.news.2.trustState.bad=Bad
Options.news.2.trustState.check=Check
Options.news.2.trustState.none=None (unsigned)
Options.news.2.trustState.observe=Observe
Options.news.3.acceptSignatureFormatV1=Accept old signature format (disable for spam prevention)
Options.news.3.automaticBoardUpdate=Automatic board update
Options.news.3.backgroundColorIfUpdatingBoardIsNotSelected=Background color if updating board is not selected
Options.news.3.backgroundColorIfUpdatingBoardIsSelected=Background color if updating board is selected
Options.news.3.choose=Choose
Options.news.3.color=Color
Options.news.3.colorChooserDialog.title.chooseUpdatingColorOfSelectedBoards=Choose updating color of SELECTED boards
Options.news.3.colorChooserDialog.title.chooseUpdatingColorOfUnselectedBoards=Choose updating color of NON-SELECTED boards
Options.news.3.dontHandleOwnMessagesAsNew=Don't show received messages from ME as new
Options.news.3.dontShowOwnMessagesAsMe=Don't show own messages as ME
Options.news.3.minimumUpdateInterval=Minimum update interval of a board
Options.news.3.numberOfConcurrentlyUpdatingBoards=Number of concurrently updating boards
Options.news.3.showBoardUpdateVisualization=Show board update visualization
Options.news.3.showDeletedMessages=Show deleted messages
Options.news.3.silentlyRetryFailedMessages=Silently retry failed message uploads
Options.news=News
Options.search.archiveExtension=Archive Extension
Options.search.audioExtension=Audio Extension
Options.search.disableFilesharing=Disable filesharing
Options.search.documentExtension=Document Extension
Options.search.executableExtension=Executable Extension
Options.search.imageExtension=Image Extension
Options.search.maximumSearchResults=Maximum search results
Options.search.rememberSharedFileDownloaded=Remember if a shared file was downloaded
Options.search.resetHiddenFiles=Reset hidden files status
Options.search.videoExtension=Video Extension
Options.search.confirmResetHiddenFiles.title=Show all hidden files again?
Options.search.confirmResetHiddenFiles.body=Do you really want to reset the hidden state of the search files?
Options.search=Search
Options.title=Options
Options.uploads.enforceFrostPriorityFileUpload=Enforce Frosts priority setting (reset external changes) 
Options.uploads.logUploads=Log manually added successful uploads to ''localdata/Frost-Uploads.log''
Options.uploads.maximumNumberOfRetries=Maximum number of retries
Options.uploads.numberOfSimultaneousUploads=Number of simultaneous uploads
Options.uploads.uploadPriority=Upload priority
Options.uploads.waittimeAfterEachTry=Waittime after each try
Options.uploads=Uploads
Options.uploads.removeNotExistingFiles=Periodically check for and remove non-existent/changed files in upload table
Options.uploads.uploadExec=Execute program on completion
Saver.AutoTask.message=Frost found an error while saving a resource and it will close itself.
Saver.AutoTask.title=Problem found.
SearchMessages.archive.searchInKeypoolAndArchive=Search in keypool and archive
SearchMessages.archive.searchOnlyInArchive=Search only in archive
SearchMessages.archive.searchOnlyInKeypool=Search only in keypool
SearchMessages.archive=Archive
SearchMessages.attachments.messageMustContainBoardAttachments=Message must contain board attachments
SearchMessages.attachments.messageMustContainFileAttachments=Message must contain file attachments
SearchMessages.attachments=Attachments
SearchMessages.boards.chooseBoards=Choose boards
SearchMessages.boards.searchFollowingBoards=Search following boards
SearchMessages.boards.searchInDisplayedBoards=Search in displayed boards
SearchMessages.boards=Boards
SearchMessages.button.close=Close
SearchMessages.button.help=Help
SearchMessages.button.openMessage=Open message
SearchMessages.button.search=Search
SearchMessages.button.stopSearch=Stop search
SearchMessages.date.searchAllDates=Search all dates
SearchMessages.date.searchBetweenDates=Search between dates
SearchMessages.date.searchInMessagesThatWouldBeDisplayed=Search in messages that would be displayed
SearchMessages.date.searchNumberOfDaysBackward=Search number of days backward
SearchMessages.date.to=to
SearchMessages.date=Date
SearchMessages.errorDialog.stopSearchBeforeClose=Please stop the search before closing the window.
SearchMessages.errorDialogs.invalidStartOrEndDate=Invalid start date or end date specified.
SearchMessages.errorDialogs.noBoardsChosen=No boards to search into were chosen.
SearchMessages.errorDialogs.noBoardsToChoose=There are no boards that could be choosed.
SearchMessages.errorDialogs.noTrustStateSelected=No trust state is selected.
SearchMessages.errorDialogs.startDateIsAfterEndDate=Start date is after end date.
SearchMessages.errorDialogs.title=Error
SearchMessages.label.results=Results
SearchMessages.label.searchResult=Search result
SearchMessages.resultTable.board=Board
SearchMessages.resultTable.date=Date
SearchMessages.resultTable.from=From
SearchMessages.resultTable.index=Index
SearchMessages.resultTable.sig=Sig
SearchMessages.resultTable.subject=Subject
SearchMessages.search.content=Content
SearchMessages.search.searchFlaggedMessagesOnly=Flagged messages
SearchMessages.search.searchPrivateMessagesOnly=Private messages
SearchMessages.search.searchRepliedMessagesOnly=Replied messages
SearchMessages.search.searchStarredMessagesOnly=Starred messages
SearchMessages.search.sender=Sender
SearchMessages.search.subject=Subject
SearchMessages.search.tooltip.caseSensitiv=Check to enable case sensitive search
SearchMessages.search=Search
SearchMessages.title=Search messages
SearchMessages.trustState.bad=Bad
SearchMessages.trustState.check=Check
SearchMessages.trustState.good=Good
SearchMessages.trustState.none=None (unsigned)
SearchMessages.trustState.observe=Observe
SearchMessages.trustState.searchAllMessages=Search all messages, no matter which trust state is set
SearchMessages.trustState.searchInMessagesThatWouldBeDisplayed=Search in messages that would be displayed
SearchMessages.trustState.searchOnlyInMessagesWithFollowingTrustState=Search only in messages with following trust state
SearchMessages.trustState.tampered=Tampered
SearchMessages.trustState=Trust state
SearchPane.fileTypes.allFiles=All files
SearchPane.fileTypes.archives=Archives
SearchPane.fileTypes.audio=Audio
SearchPane.fileTypes.documents=Documents
SearchPane.fileTypes.executables=Executables
SearchPane.fileTypes.images=Images
SearchPane.fileTypes.video=Video
SearchPane.resultTable.comment=Comment
SearchPane.resultTable.filename=Filename
SearchPane.resultTable.keywords=Keywords
SearchPane.resultTable.lastReceived=Last seen
SearchPane.resultTable.lastUploaded=Last uploaded
SearchPane.resultTable.popupmenu.downloadAllKeys=Download all keys
SearchPane.resultTable.popupmenu.downloadSelectedKeys=Download selected keys
SearchPane.resultTable.popupmenu.hideSelectedKeys=Hide selected keys
SearchPane.resultTable.rating=Rating
SearchPane.resultTable.size=Size
SearchPane.resultTable.sources.tooltip=<html>Sources for this file. An icon indicates that multiple owners provided additional informations.<br>Doubleclick in this column to show the details.</html>
SearchPane.resultTable.sources=Sources
SearchPane.resultTable.state=State
SearchPane.resultTable.states.downloaded=Downloaded
SearchPane.resultTable.states.downloading=Downloading
SearchPane.resultTable.states.offline=Offline
SearchPane.resultTable.states.sharing=Sharing
SearchPane.toolbar.comment=Comment
SearchPane.toolbar.keywords=Keywords
SearchPane.toolbar.name=Name
SearchPane.toolbar.owner=Owner
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedBad=Hide files from people marked BAD
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedCheck=Hide files from people marked CHECK
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedObserve=Hide files from people marked OBSERVE
SearchPane.toolbar.searchOptions.hideFilesWithoutChk=Hide files without CHK key
SearchPane.toolbar.searchOptionsButton=Options
SearchPane.toolbar.tooltip.clear=Clear textfields
SearchPane.toolbar.tooltip.search=Search
SearchPane.toolbar.tooltip.toggleMode=Toggle between simple and advanced search mode
SentMessages.confirmDeleteMessagesDialog.text=Do you want to permanently delete the {0} selected sent messages?
SentMessages.confirmDeleteMessagesDialog.title=Confirm delete
SentMessages.confirmDeleteOneMessageDialog.text=Do you want to permanently delete the selected sent message?
SentMessages.confirmDeleteOneMessageDialog.title=Confirm delete
SentMessages.folderName=Sent
SentMessages.label=Sent messages
SentMessages.table.board=Board
SentMessages.table.date=Date
SentMessages.table.from=From
SentMessages.table.popup.deleteMessage=Delete
SentMessages.table.subject=Subject
SentMessages.table.to=To
SharedFilesOwnerDialog.askForIdentity=Choose the owner identity for the new shared files
SharedFilesOwnerDialog.askIfToReplace=If file with same checksum does already exist
SharedFilesOwnerDialog.ignoreNewFile=Ignore the new file
SharedFilesOwnerDialog.replaceExistingFilePath=Set the file path to the path of the new file (owner is NOT changed!)
SharedFilesOwnerDialog.title=Choose an owner for the upload files
SharedFilesPane.filechooser.title=Select files to share
SharedFilesPane.fileTable.comment=Comment
SharedFilesPane.fileTable.filename=Filename
SharedFilesPane.fileTable.key=Key
SharedFilesPane.fileTable.keywords=Keywords
SharedFilesPane.fileTable.lastRequest=Last Request
SharedFilesPane.fileTable.lastShared=Last shared
SharedFilesPane.fileTable.lastUpload=Last upload
SharedFilesPane.fileTable.owner=Owner
SharedFilesPane.fileTable.path=Path
SharedFilesPane.fileTable.popupmenu.removeSelectedFiles=Remove selected files
SharedFilesPane.fileTable.popupmenu.uploadSelectedFiles=Upload selected files
SharedFilesPane.fileTable.rating=Rating
SharedFilesPane.fileTable.requestCount=Requests
SharedFilesPane.fileTable.size=Size
SharedFilesPane.fileTable.state.never=Never
SharedFilesPane.fileTable.state.unknown=Unknown
SharedFilesPane.fileTable.uploadCount=Uploads
SharedFilesPane.sizeChangedErrorDialog.text=The size of the choosed file is not the same as the size of the shared file.
SharedFilesPane.sizeChangedErrorDialog.title=Invalid file
SharedFilesPane.toolbar.files=Files
SharedFilesPane.toolbar.tooltip.browse=Add files to share
SmileyChooserDialog.title=Choose a smiley
Splashscreen.message.1=Initializing Mainframe..
Splashscreen.message.2=Leaving the gun..
Splashscreen.message.3=Taking the cannoli..
Splashscreen.message.4=Following the white rabbit..
Splashscreen.message.5=Engage!
StartupMessage.sharedFile.sharedFileLastModifiedChanged.text=<html>Shared file is invalid, remove or reshare the file.<br>Last modified date of shared file changed: {0}</html>
StartupMessage.sharedFile.sharedFileLastModifiedChanged.title=Invalid shared file
StartupMessage.sharedFile.sharedFileNotFound.text=<html>Shared file could not be located, remove or reshare the file.<br>Shared file not found: {0}</html>
StartupMessage.sharedFile.sharedFileNotFound.title=Invalid shared file
StartupMessage.sharedFile.sharedFileSizeChanged.text=<html>Shared file is invalid, remove or reshare the file.<br>Size of shared file changed: {0}</html>
StartupMessage.sharedFile.sharedFileSizeChanged.title=Invalid shared file
StartupMessage.uploadFile.boardsWithObsoleteKeysFound.text=<html>The board ''{0}'' has set an invalid public key whose encryption is not longer supported.<br>Remove the board or set a new public key.</html>
StartupMessage.uploadFile.boardsWithObsoleteKeysFound.title=Board has invalid public key
StartupMessage.uploadFile.uploadFileNotFound.text=<html>Upload file is invalid and was removed.<br>Upload file not found: {0}</html>
StartupMessage.uploadFile.uploadFileNotFound.title=Invalid upload file
StartupMessage.uploadFile.uploadFileSizeChanged.text=<html>Upload file is invalid and was removed.<br>Size of upload file changed: {0}</html>
StartupMessage.uploadFile.uploadFileSizeChanged.title=Invalid upload file
StatisticsDialog.button.close=Close
StatisticsDialog.label.archivedMessages=Archived messages
StatisticsDialog.label.files=Files
StatisticsDialog.label.fileSizes=File sizes
StatisticsDialog.label.identities=Identities
StatisticsDialog.label.messages=Messages
StatisticsDialog.label.sharers=Sharers
StatisticsDialog.title=Statistics
TargetFolderChooser.title=Choose a target folder
TOF.markAllReadConfirmation.board.content=Do you want to mark all messages in board ''{0}'' read?
TOF.markAllReadConfirmation.board.title=Mark all messages read
TOF.markAllReadConfirmation.folder.content=Do you want to mark all messages in all boards below folder ''{0}'' read?
TOF.markAllReadConfirmation.folder.title=Mark all messages read
UnsentMessages.confirmDeleteMessagesDialog.text=Do you want to permanently delete the {0} selected unsent messages?
UnsentMessages.confirmDeleteMessagesDialog.title=Confirm delete
UnsentMessages.confirmDeleteOneMessageDialog.text=Do you want to permanently delete the selected unsent message?
UnsentMessages.confirmDeleteOneMessageDialog.title=Confirm delete
UnsentMessages.deleteNotPossibleDialog.text=The message is currently uploading and cannot be deleted.
UnsentMessages.deleteNotPossibleDialog.title=Message upload already started
UnsentMessages.disableMessageUpload=Disable message upload
UnsentMessages.folderName=Outbox
UnsentMessages.label=Unsent messages
UnsentMessages.table.board=Board
UnsentMessages.table.from=From
UnsentMessages.table.popup.deleteMessage=Delete
UnsentMessages.table.state=State
UnsentMessages.table.stateUploading=Uploading
UnsentMessages.table.stateWaiting=Waiting
UnsentMessages.table.subject=Subject
UnsentMessages.table.timeAdded=Added
UnsentMessages.table.to=To
UploadPane.filechooser.title=Select files to upload
UploadPane.fileTable.blocks=Blocks
UploadPane.fileTable.enabled=Enabled
UploadPane.fileTable.filename=Filename
UploadPane.fileTable.key=Key
UploadPane.fileTable.path=Path
UploadPane.fileTable.popupmenu.enableUploads.disableAllUploads=Disable all uploads
UploadPane.fileTable.popupmenu.enableUploads.disableSelectedUploads=Disable selected uploads
UploadPane.fileTable.popupmenu.enableUploads.enableAllUploads=Enable all uploads
UploadPane.fileTable.popupmenu.enableUploads.enableSelectedUploads=Enable selected uploads
UploadPane.fileTable.popupmenu.enableUploads.invertEnabledStateForAllUploads=Invert enabled state for all uploads
UploadPane.fileTable.popupmenu.enableUploads.invertEnabledStateForSelectedUploads=Invert enabled state for selected uploads
UploadPane.fileTable.popupmenu.enableUploads=Enable uploads
UploadPane.fileTable.popupmenu.remove.removeSelectedFiles=Remove selected files
UploadPane.fileTable.popupmenu.remove=Remove
UploadPane.fileTable.popupmenu.removeFromGlobalQueue=Remove from global queue
UploadPane.fileTable.popupmenu.showSharedFile=Jump to shared file
UploadPane.fileTable.popupmenu.startEncodingOfSelectedFiles=Start encoding of selected files
UploadPane.fileTable.popupmenu.startSelectedUploadsNow=Start selected uploads immediately
UploadPane.fileTable.popupmenu.uploadSelectedFiles=Upload selected files
UploadPane.fileTable.priority=Priority
UploadPane.fileTable.shared.tooltip=An icon indicates a shared file.
UploadPane.fileTable.shared=Shared file
UploadPane.fileTable.size=Size
UploadPane.fileTable.state.done=Done
UploadPane.fileTable.state.encodeRequested=Encode requested
UploadPane.fileTable.state.encodingFile=Encoding file
UploadPane.fileTable.state.failed=Failed
UploadPane.fileTable.state.unknown=Unknown
UploadPane.fileTable.state.uploading=Uploading
UploadPane.fileTable.state.waiting=Waiting
UploadPane.fileTable.state=State
UploadPane.fileTable.tries=Tries
UploadPane.invalidUploadFilesRemoved.text=One or more upload files were not found or its size changed. The files are removed from upload table.
UploadPane.invalidUploadFilesRemoved.title=Invalid upload files
UploadPane.removeFinishedUploads=Remove finished
UploadPane.showExternalGlobalQueueItems=Show global queue
UploadPane.toolbar.tooltip.browse=Add files to upload
UploadPane.toolbar.waiting=Waiting

--------------090909040209040306040206
Content-Type: text/plain;
 name="DownloadDialog.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="DownloadDialog.patch"

SW5kZXg6IHNvdXJjZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRNb2Rl
bC5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0L2ZpbGVUcmFuc2Zlci9k
b3dubG9hZC9Eb3dubG9hZE1vZGVsLmphdmEJKHJldmlzaW9uIDMxOTIpDQorKysgc291cmNl
L2Zyb3N0L2ZpbGVUcmFuc2Zlci9kb3dubG9hZC9Eb3dubG9hZE1vZGVsLmphdmEJKHdvcmtp
bmcgY29weSkNCkBAIC01Nyw3ICs1Nyw3IEBADQogICAgICAgICAJLy8gT25seSBjaGVjayBp
ZiB0aGUgZmlsZSBpcyBub3QgbGluZ2VyaW5nIGFyb3VuZCBpbiBmaW5pc2hlZCBzdGF0ZS4u
LgogICAgICAgICAJaWYoICEgaXRlbVRvQWRkLmlzVHJhY2tlZCgpICl7CiAJICAgICAgICAg
ICAgZmluYWwgVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlIHRyYWNrRG93bmxvYWRLZXlzU3Rv
cmFnZSA9IFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5pbnN0KCk7Ci0JICAgICAgICAgICAg
aWYoIHRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5zZWFyY2hJdGVtKCBpdGVtVG9BZGQuZ2V0
S2V5KCkgKSApIHsKKwkgICAgICAgICAgICBpZiggdHJhY2tEb3dubG9hZEtleXNTdG9yYWdl
LnNlYXJjaEl0ZW1LZXkoIGl0ZW1Ub0FkZC5nZXRLZXkoKSApICkgewogCSAgICAgICAgICAg
IAlmaW5hbCBMYW5ndWFnZSBsYW5ndWFnZSA9IExhbmd1YWdlLmdldEluc3RhbmNlKCk7CiAK
IAkgICAgICAgICAgICAJLy8gQXNrIGlmIHRvIGRvd25sb2FkIGFnYWluCkBAIC03Myw0OCAr
NzMsNDggQEANCiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGdl
dEl0ZW1Db3VudCgpOyB4KyspIHsKLQkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGl0ZW0g
PSAoRnJvc3REb3dubG9hZEl0ZW0pIGdldEl0ZW1BdCh4KTsKLSAgICAgICAgICAgIGZpbmFs
IEZyb3N0RmlsZUxpc3RGaWxlT2JqZWN0IGZsZiA9IGl0ZW0uZ2V0RmlsZUxpc3RGaWxlT2Jq
ZWN0KCk7IC8vIG1heWJlIG51bGwgb2YgbWFudWFsbHkgYWRkZWQKKyAgICAgICAgCWZpbmFs
IEZyb3N0RG93bmxvYWRJdGVtIGl0ZW0gPSAoRnJvc3REb3dubG9hZEl0ZW0pIGdldEl0ZW1B
dCh4KTsKKyAgICAgICAgCWZpbmFsIEZyb3N0RmlsZUxpc3RGaWxlT2JqZWN0IGZsZiA9IGl0
ZW0uZ2V0RmlsZUxpc3RGaWxlT2JqZWN0KCk7IC8vIG1heWJlIG51bGwgb2YgbWFudWFsbHkg
YWRkZWQKIAotICAgICAgICAgICAgaWYoIGZsZlRvQWRkICE9IG51bGwgJiYgZmxmICE9IG51
bGwgKSB7Ci0gICAgICAgICAgICAgICAgaWYoIGZsZlRvQWRkLmdldFNoYSgpLmVxdWFscyhm
bGYuZ2V0U2hhKCkpICkgewotICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGluIG1v
ZGVsIChjb21wYXJlZCBieSBTSEEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIAlpZiggZmxm
VG9BZGQgIT0gbnVsbCAmJiBmbGYgIT0gbnVsbCApIHsKKyAgICAgICAgCQlpZiggZmxmVG9B
ZGQuZ2V0U2hhKCkuZXF1YWxzKGZsZi5nZXRTaGEoKSkgKSB7CisgICAgICAgIAkJCS8vIGFs
cmVhZHkgaW4gbW9kZWwgKGNvbXBhcmVkIGJ5IFNIQSkKKyAgICAgICAgCQkJcmV0dXJuIGZh
bHNlOworICAgICAgICAJCX0KKyAgICAgICAgCX0KIAotICAgICAgICAgICAgLy8gRklYTUU6
IDAuNzogaWYgd2UgYWRkIGEgbmV3IHVyaSBjaGsvbmFtZSBhbHNvIGNoZWNrIGlmIHdlIGFs
cmVhZHkgZG93bmxvYWQgY2hrIQotICAgICAgICAgICAgLy8gUHJvYmxlbTogd2hhdCBpZiBD
SEsgaXMgd3JvbmcsIHRoZW4gd2UgaGF2ZSB0byBhZGQgY2hrL25hbWUuIEJ1dCBpbiB0aGUg
cmV2ZXJzZSBjYXNlCi0gICAgICAgICAgICAvLyAgICAgICAgICB3ZSBhZGQgY2hrL25hbWUg
YW5kIG5hbWUgZ2V0cyBzdHJpcHBlZCBiZWNhdXNlIG5vZGUgcmVwb3J0cyByYz0xMSwgdGhl
biB3ZSBoYXZlIDIgd2l0aCBzYW1lCi0gICAgICAgICAgICAvLyAgICAgICAgICBjaGshID09
PiBpZiBub2RlIHJlcG9ydHMgMTEgdGhlbiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgc2Ft
ZSBwbGFpbiBjaGsuCisgICAgICAgIAkvLyBGSVhNRTogMC43OiBpZiB3ZSBhZGQgYSBuZXcg
dXJpIGNoay9uYW1lIGFsc28gY2hlY2sgaWYgd2UgYWxyZWFkeSBkb3dubG9hZCBjaGshCisg
ICAgICAgIAkvLyBQcm9ibGVtOiB3aGF0IGlmIENISyBpcyB3cm9uZywgdGhlbiB3ZSBoYXZl
IHRvIGFkZCBjaGsvbmFtZS4gQnV0IGluIHRoZSByZXZlcnNlIGNhc2UKKyAgICAgICAgCS8v
ICAgICAgICAgIHdlIGFkZCBjaGsvbmFtZSBhbmQgbmFtZSBnZXRzIHN0cmlwcGVkIGJlY2F1
c2Ugbm9kZSByZXBvcnRzIHJjPTExLCB0aGVuIHdlIGhhdmUgMiB3aXRoIHNhbWUKKyAgICAg
ICAgCS8vICAgICAgICAgIGNoayEgPT0+IGlmIG5vZGUgcmVwb3J0cyAxMSB0aGVuIGNoZWNr
IGlmIHdlIGhhdmUgYWxyZWFkeSBzYW1lIHBsYWluIGNoay4KIAotCQkJaWYgKGl0ZW1Ub0Fk
ZC5nZXRLZXkoKSAhPSBudWxsCi0JCQkJJiYgaXRlbS5nZXRLZXkoKSAhPSBudWxsCi0JCQkJ
JiYgaXRlbS5nZXRLZXkoKS5lcXVhbHMoaXRlbVRvQWRkLmdldEtleSgpKSkKLSAgICAgICAg
ICAgIHsKLQkJCQkvLyBhbHJlYWR5IGluIG1vZGVsIChjb21wYXJlZCBieSBrZXkpCi0JCQkJ
cmV0dXJuIGZhbHNlOwotCQkJfQorICAgICAgICAJaWYgKGl0ZW1Ub0FkZC5nZXRLZXkoKSAh
PSBudWxsCisgICAgICAgIAkJCSYmIGl0ZW0uZ2V0S2V5KCkgIT0gbnVsbAorICAgICAgICAJ
CQkmJiBpdGVtLmdldEtleSgpLmVxdWFscyhpdGVtVG9BZGQuZ2V0S2V5KCkpKQorICAgICAg
ICAJeworICAgICAgICAJCS8vIGFscmVhZHkgaW4gbW9kZWwgKGNvbXBhcmVkIGJ5IGtleSkK
KyAgICAgICAgCQlyZXR1cm4gZmFsc2U7CisgICAgICAgIAl9CiAKLSAgICAgICAgICAgIC8v
IEZJWE1FOiBhbHNvIGNoZWNrIGRvd25sb2FkZGlyIGZvciBzYW1lIGZpbGVuYW1lIGFuZCBi
dWlsZCBuZXcgbmFtZQotICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0RmlsZW5hbWUoKS5lcXVh
bHMoaXRlbVRvQWRkLmdldEZpbGVuYW1lKCkpKSB7Ci0JCQkJLy8gc2FtZSBuYW1lLCBidXQg
ZGlmZmVyZW50IGtleS4gLSByZW5hbWUgcXVpdGVseQotCQkJCWludCBjbnQgPSAyOwotCQkJ
CXdoaWxlICh0cnVlKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyBuZXh0TmV3TmFtZSA9IGl0ZW1U
b0FkZC5nZXRGaWxlbmFtZSgpICsgIl8iICsgY250OwotCQkJCQlpdGVtVG9BZGQuc2V0Rmls
ZU5hbWUobmV4dE5ld05hbWUpOwotCQkJCQlpZiAoYWRkRG93bmxvYWRJdGVtKGl0ZW1Ub0Fk
ZCkgPT0gdHJ1ZSkgewotCQkJCQkJLy8gYWRkZWQgdG8gbW9kZWwKLQkJCQkJCXJldHVybiB0
cnVlOwotCQkJCQl9Ci0JCQkJCWNudCsrOwotCQkJCX0KLQkJCQkvLyB3ZSBzaG91bGQgbmV2
ZXIgY29tZSBoZXJlCi0JCQl9Ci0JCX0KLQkJLy8gbm90IGluIG1vZGVsLCBhZGQKLQkJYWRk
SXRlbShpdGVtVG9BZGQpOwotCQlyZXR1cm4gdHJ1ZTsKKyAgICAgICAgCS8vIEZJWE1FOiBh
bHNvIGNoZWNrIGRvd25sb2FkZGlyIGZvciBzYW1lIGZpbGVuYW1lIGFuZCBidWlsZCBuZXcg
bmFtZQorICAgICAgICAJaWYgKGl0ZW0uZ2V0RmlsZW5hbWUoKS5lcXVhbHMoaXRlbVRvQWRk
LmdldEZpbGVuYW1lKCkpKSB7CisgICAgICAgIAkJLy8gc2FtZSBuYW1lLCBidXQgZGlmZmVy
ZW50IGtleS4gLSByZW5hbWUgcXVpdGVseQorICAgICAgICAJCWludCBjbnQgPSAyOworICAg
ICAgICAJCXdoaWxlICh0cnVlKSB7CisgICAgICAgIAkJCWZpbmFsIFN0cmluZyBuZXh0TmV3
TmFtZSA9IGl0ZW1Ub0FkZC5nZXRGaWxlbmFtZSgpICsgIl8iICsgY250OworICAgICAgICAJ
CQlpdGVtVG9BZGQuc2V0RmlsZU5hbWUobmV4dE5ld05hbWUpOworICAgICAgICAJCQlpZiAo
YWRkRG93bmxvYWRJdGVtKGl0ZW1Ub0FkZCkgPT0gdHJ1ZSkgeworICAgICAgICAJCQkJLy8g
YWRkZWQgdG8gbW9kZWwKKyAgICAgICAgCQkJCXJldHVybiB0cnVlOworICAgICAgICAJCQl9
CisgICAgICAgIAkJCWNudCsrOworICAgICAgICAJCX0KKyAgICAgICAgCQkvLyB3ZSBzaG91
bGQgbmV2ZXIgY29tZSBoZXJlCisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgLy8g
bm90IGluIG1vZGVsLCBhZGQKKyAgICAgICAgYWRkSXRlbShpdGVtVG9BZGQpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKIAl9CiAKICAgICBwdWJsaWMgdm9pZCBhZGRFeHRlcm5hbEl0ZW0o
ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaSkgewpJbmRleDogc291cmNlL2Zyb3N0L2ZpbGVU
cmFuc2Zlci9kb3dubG9hZC9Gcm9zdERvd25sb2FkSXRlbS5qYXZhDQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gc291cmNlL2Zyb3N0L2ZpbGVUcmFuc2Zlci9kb3dubG9hZC9Gcm9zdERvd25sb2Fk
SXRlbS5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9mcm9zdC9maWxlVHJhbnNm
ZXIvZG93bmxvYWQvRnJvc3REb3dubG9hZEl0ZW0uamF2YQkod29ya2luZyBjb3B5KQ0KQEAg
LTM0MSw4ICszNDEsMTMgQEANCiAgICAgICAgIHJldHVybiBkb3dubG9hZERpcjsKICAgICB9
CiAKLSAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZERpcihmaW5hbCBTdHJpbmcgZGlyKSB7
Ci0gICAgCWRvd25sb2FkRGlyID0gRmlsZUFjY2Vzcy5hcHBlbmRTZXBhcmF0b3IoZGlyKTsK
KyAgICBwdWJsaWMgYm9vbGVhbiBzZXREb3dubG9hZERpcihmaW5hbCBTdHJpbmcgZGlyKSB7
CisgICAgCVN0cmluZyBkaXJOYW1lID0gRmlsZUFjY2Vzcy5hcHBlbmRTZXBhcmF0b3IoZGly
KTsKKyAgICAJaWYoIEZpbGVBY2Nlc3MuY3JlYXRlRGlyKG5ldyBqYXZhLmlvLkZpbGUoZGly
TmFtZSkpICkgeworICAgIAkJZG93bmxvYWREaXIgPSBkaXJOYW1lOworICAgIAkJcmV0dXJu
IHRydWU7CisgICAgCX0KKyAgICAJcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHB1Ymxp
YyB2b2lkIHNldEZpbGVuYW1lUHJlZml4KGZpbmFsIFN0cmluZyBuZXdQcmVmaXgpIHsKSW5k
ZXg6IHNvdXJjZS9mcm9zdC9ndWkvQWRkTmV3RG93bmxvYWRzRGlhbG9nLmphdmENCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3QvZ3VpL0FkZE5ld0Rvd25sb2Fkc0RpYWxvZy5q
YXZhCShyZXZpc2lvbiAwKQ0KKysrIHNvdXJjZS9mcm9zdC9ndWkvQWRkTmV3RG93bmxvYWRz
RGlhbG9nLmphdmEJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDQxNSBAQA0KK3BhY2thZ2Ug
ZnJvc3QuZ3VpOworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGph
dmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsK
K2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2
ZW50Lk1vdXNlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBv
cnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5
OworaW1wb3J0IGphdmF4LnN3aW5nLkJveDsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlv
dXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5K
RmlsZUNob29zZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4
LnN3aW5nLkpNZW51OworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKK2ltcG9ydCBq
YXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Citp
bXBvcnQgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsOworaW1wb3J0IGphdmF4LnN3
aW5nLldpbmRvd0NvbnN0YW50czsKKworaW1wb3J0IGZyb3N0LkNvcmU7CitpbXBvcnQgZnJv
c3QuU2V0dGluZ3NDbGFzczsKK2ltcG9ydCBmcm9zdC5maWxlVHJhbnNmZXIuZG93bmxvYWQu
RnJvc3REb3dubG9hZEl0ZW07CitpbXBvcnQgZnJvc3QuZ3VpLm1vZGVsLkFkZE5ld0Rvd25s
b2Fkc1RhYmxlTW9kZWw7CitpbXBvcnQgZnJvc3QuZ3VpLm1vZGVsLlRhYmxlTWVtYmVyOwor
aW1wb3J0IGZyb3N0LnN0b3JhZ2UucGVyc3QuVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlOwor
aW1wb3J0IGZyb3N0LnV0aWwuZ3VpLkpTa2lubmFibGVQb3B1cE1lbnU7CitpbXBvcnQgZnJv
c3QudXRpbC5ndWkudHJhbnNsYXRpb24uTGFuZ3VhZ2U7CisKK3B1YmxpYyBjbGFzcyBBZGRO
ZXdEb3dubG9hZHNEaWFsb2cgZXh0ZW5kcyBqYXZheC5zd2luZy5KRGlhbG9nIHsKKworCXBy
aXZhdGUgZmluYWwgTGFuZ3VhZ2UgbGFuZ3VhZ2U7CisJcHJpdmF0ZSBmaW5hbCBUcmFja0Rv
d25sb2FkS2V5c1N0b3JhZ2UgdHJhY2tEb3dubG9hZEtleXNTdG9yYWdlOworCisJcHJpdmF0
ZSBBZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWw7
CisJcHJpdmF0ZSBTb3J0ZWRUYWJsZSBhZGROZXdEb3dubG9hZHNUYWJsZTsKKwlwcml2YXRl
IEpCdXR0b24gcmVtb3ZlQWxyZWFkeURvd25sb2FkZWRCdXR0b247CisJcHJpdmF0ZSBKQnV0
dG9uIHJlbW92ZUFscmVhZHlEb3dubG9hZGVkTmFtZUJ1dHRvbjsKKwlwcml2YXRlIEpCdXR0
b24gcmVtb3ZlQWxyZWFkeUV4aXN0c0J1dHRvbjsKKwlwcml2YXRlIEpCdXR0b24gb2tCdXR0
b247CisJcHJpdmF0ZSBKQnV0dG9uIGNhbmNlbEJ1dHRvbjsKKwlwcml2YXRlIEpTa2lubmFi
bGVQb3B1cE1lbnUgdGFibGVQb3B1cE1lbnU7CisJCisJcHJpdmF0ZSBib29sZWFuIGFkZERv
d25sb2FkczsgCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25V
SUQgPSAxTDsKKworCXB1YmxpYyBBZGROZXdEb3dubG9hZHNEaWFsb2coSkZyYW1lIGZyYW1l
LCBMaXN0PEZyb3N0RG93bmxvYWRJdGVtPiBmcm9zdERvd25sb2FkSXRlbUxpc3QpIHsKKwkJ
c3VwZXIoZnJhbWUpOworCQlzZXRNb2RhbCh0cnVlKTsKKwkJYWRkRG93bmxvYWRzID0gZmFs
c2U7CisJCWxhbmd1YWdlID0gTGFuZ3VhZ2UuZ2V0SW5zdGFuY2UoKTsKKwkJdHJhY2tEb3du
bG9hZEtleXNTdG9yYWdlID0gVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlLmluc3QoKTsKKwkJ
CisJCXNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRElTUE9TRV9P
Tl9DTE9TRSk7CisKKwkJaW5pdEdVSSgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdEdV
SSgpIHsKKwkJdHJ5IHsKKwkJCXNldFRpdGxlKGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3
RG93bmxvYWRzRGlhbG9nLnRpdGxlIikpOworCQkJc2V0U2l6ZSg4MDAsIDUwMCk7CisJCQl0
aGlzLnNldFJlc2l6YWJsZSh0cnVlKTsKKworCQkJLy8gRG93bmxvYWQgVGFibGUKKwkJCWFk
ZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwgPSBuZXcgQWRkTmV3RG93bmxvYWRzVGFibGVNb2Rl
bCgpOworCQkJYWRkTmV3RG93bmxvYWRzVGFibGUgPSBuZXcgU29ydGVkVGFibGUoIGFkZE5l
d0Rvd25sb2Fkc1RhYmxlTW9kZWwgKTsKKwkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlLnNldFJv
d1NlbGVjdGlvbkFsbG93ZWQodHJ1ZSk7CisJCQlhZGROZXdEb3dubG9hZHNUYWJsZS5zZXRT
ZWxlY3Rpb25Nb2RlKCBMaXN0U2VsZWN0aW9uTW9kZWwuTVVMVElQTEVfSU5URVJWQUxfU0VM
RUNUSU9OICk7CisJCQlhZGROZXdEb3dubG9hZHNUYWJsZS5zZXRSb3dIZWlnaHQoMTgpOwor
CisJCQkvLyBSZW1vdmUgYWxyZWFkeSBEb3dubG9hZGVkIEJ1dHRvbgorCQkJcmVtb3ZlQWxy
ZWFkeURvd25sb2FkZWRCdXR0b24gPSBuZXcgSkJ1dHRvbihsYW5ndWFnZS5nZXRTdHJpbmco
IkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5idXR0b24ucmVtb3ZlQWxyZWFkeURvd25sb2FkZWRC
dXR0b24iKSk7CisJCQlyZW1vdmVBbHJlYWR5RG93bmxvYWRlZEJ1dHRvbi5zZXRUb29sVGlw
VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5idXR0b25U
b29sdGlwLnJlbW92ZUFscmVhZHlEb3dubG9hZGVkQnV0dG9uIikpOworCQkJcmVtb3ZlQWxy
ZWFkeURvd25sb2FkZWRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBqYXZhLmF3dC5l
dmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3Jt
ZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQkJCQlyZW1vdmVBbHJlYWR5RG93bmxvYWRl
ZEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoZSk7CisJCQkJfSAKKwkJCX0pOworCQkJCisJCQkv
LyBSZW1vdmUgYWxyZWFkeSBEb3dubG9hZGVkIGJ5IE5hbWUgQnV0dG9uCisJCQlyZW1vdmVB
bHJlYWR5RG93bmxvYWRlZE5hbWVCdXR0b24gPSBuZXcgSkJ1dHRvbihsYW5ndWFnZS5nZXRT
dHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5idXR0b24ucmVtb3ZlQWxyZWFkeURvd25s
b2FkZWROYW1lQnV0dG9uIikpOworCQkJcmVtb3ZlQWxyZWFkeURvd25sb2FkZWROYW1lQnV0
dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRz
RGlhbG9nLmJ1dHRvblRvb2x0aXAucmVtb3ZlQWxyZWFkeURvd25sb2FkZWROYW1lQnV0dG9u
IikpOworCQkJcmVtb3ZlQWxyZWFkeURvd25sb2FkZWROYW1lQnV0dG9uLmFkZEFjdGlvbkxp
c3RlbmVyKCBuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVi
bGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKKwkJCQkJ
cmVtb3ZlQWxyZWFkeURvd25sb2FkZWROYW1lQnV0dG9uX2FjdGlvblBlcmZvcm1lZChlKTsK
KwkJCQl9IAorCQkJfSk7CisJCQkKKwkJCS8vIFJlbW92ZSBhbHJlYWR5IGV4aXN0cyBCdXR0
b24KKwkJCXJlbW92ZUFscmVhZHlFeGlzdHNCdXR0b24gPSBuZXcgSkJ1dHRvbihsYW5ndWFn
ZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5idXR0b24ucmVtb3ZlQWxyZWFk
eUV4aXN0c0J1dHRvbiIpKTsKKwkJCXJlbW92ZUFscmVhZHlFeGlzdHNCdXR0b24uc2V0VG9v
bFRpcFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cuYnV0
dG9uVG9vbHRpcC5yZW1vdmVBbHJlYWR5RXhpc3RzQnV0dG9uIikpOworCQkJcmVtb3ZlQWxy
ZWFkeUV4aXN0c0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lciggbmV3IGphdmEuYXd0LmV2ZW50
LkFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChm
aW5hbCBBY3Rpb25FdmVudCBlKSB7CisJCQkJCXJlbW92ZUFscmVhZHlFeGlzdHNCdXR0b25f
YWN0aW9uUGVyZm9ybWVkKGUpOworCQkJCX0gCisJCQl9KTsKKwkJCQorCQkJLy8gT0sgQnV0
dG9uCisJCQlva0J1dHRvbiA9IG5ldyBKQnV0dG9uKGxhbmd1YWdlLmdldFN0cmluZygiQ29t
bW9uLm9rIikpOworCQkJb2tCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBqYXZhLmF3
dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJm
b3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQkJCQlhZGREb3dubG9hZHMgPSB0cnVl
OworCQkJCQlkaXNwb3NlKCk7CisJCQkJfSAKKwkJCX0pOworCQkJCisJCQkvLyBDYW5jZWwg
QnV0dG9uCisJCQljYW5jZWxCdXR0b24gPSBuZXcgSkJ1dHRvbihsYW5ndWFnZS5nZXRTdHJp
bmcoIkNvbW1vbi5jYW5jZWwiKSk7CisJCQljYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVu
ZXIoIG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMg
dm9pZCBhY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQkJCQlhZGRO
ZXdEb3dubG9hZHNUYWJsZU1vZGVsLmNsZWFyRGF0YU1vZGVsKCk7CisJCQkJCWRpc3Bvc2Uo
KTsKKwkJCQl9IAorCQkJfSk7CisKKwkJCS8vIEJ1dHRvbiByb3cKKwkJCWZpbmFsIEpQYW5l
bCBidXR0b25zUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCQli
dXR0b25zUGFuZWwuc2V0TGF5b3V0KCBuZXcgQm94TGF5b3V0KCBidXR0b25zUGFuZWwsIEJv
eExheW91dC5YX0FYSVMgKSk7CisKKwkJCWJ1dHRvbnNQYW5lbC5hZGQoIHJlbW92ZUFscmVh
ZHlEb3dubG9hZGVkQnV0dG9uICk7CisJCQlidXR0b25zUGFuZWwuYWRkKEJveC5jcmVhdGVS
aWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwzKSkpOworCQkJYnV0dG9uc1BhbmVsLmFkZCgg
cmVtb3ZlQWxyZWFkeURvd25sb2FkZWROYW1lQnV0dG9uICk7CisJCQlidXR0b25zUGFuZWwu
YWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwzKSkpOworCQkJYnV0
dG9uc1BhbmVsLmFkZCggcmVtb3ZlQWxyZWFkeUV4aXN0c0J1dHRvbiApOworCQkJYnV0dG9u
c1BhbmVsLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMTAsMykpKTsK
KworCQkJYnV0dG9uc1BhbmVsLmFkZCggQm94LmNyZWF0ZUhvcml6b250YWxHbHVlKCkgKTsK
KworCQkJYnV0dG9uc1BhbmVsLmFkZCggY2FuY2VsQnV0dG9uICk7CisJCQlidXR0b25zUGFu
ZWwuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwzKSkpOworCQkJ
YnV0dG9uc1BhbmVsLmFkZCggb2tCdXR0b24gKTsKKwkJCWJ1dHRvbnNQYW5lbC5zZXRCb3Jk
ZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigxMCwwLDAsMCkpOworCisJCQkv
LyBEb3dubG9hZCBUYWJsZQorCQkJZmluYWwgSlNjcm9sbFBhbmUgc2Nyb2xsUGFuZSA9IG5l
dyBKU2Nyb2xsUGFuZShhZGROZXdEb3dubG9hZHNUYWJsZSk7CisJCQlzY3JvbGxQYW5lLnNl
dFdoZWVsU2Nyb2xsaW5nRW5hYmxlZCh0cnVlKTsKKworCQkJLy8gbWFpbiBwYW5lbAorCQkJ
ZmluYWwgSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgp
KTsKKwkJCW1haW5QYW5lbC5hZGQoIHNjcm9sbFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIg
KTsKKwkJCW1haW5QYW5lbC5hZGQoIGJ1dHRvbnNQYW5lbCwgQm9yZGVyTGF5b3V0LlNPVVRI
ICk7CisJCQltYWluUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlC
b3JkZXIoNSw3LDcsNykpOworCisJCQl0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0
KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCQl0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKG1h
aW5QYW5lbCwgbnVsbCk7CisKKwkJCXRoaXMuaW5pdFBvcHVwTWVudSgpOworCisJCX0gY2F0
Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQor
CisJcHVibGljIExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+IHN0YXJ0RGlhbG9nKExpc3Q8RnJv
c3REb3dubG9hZEl0ZW0+IGZvcnN0RG93bmxvYWRJdG1lTGlzdCkgeworCQkvLyBsb2FkIGRh
dGEgaW50byB0YWJsZQorCQl0aGlzLmxvYWROZXdEb3dubG9hZHNJbnRvVGFibGUoZm9yc3RE
b3dubG9hZEl0bWVMaXN0KTsKKwkJCisJCS8vIGRpc3BsYXkgdGFibGUKKwkJc2V0VmlzaWJs
ZSh0cnVlKTsgLy8gYmxvY2tpbmchCisJCQorCQkvLyByZXR1cm4gaXRlbXMgaW4gdGFibGUK
KwkJZm9yc3REb3dubG9hZEl0bWVMaXN0ID0gbmV3IExpbmtlZExpc3Q8RnJvc3REb3dubG9h
ZEl0ZW0+KCk7CisJCWlmKCBhZGREb3dubG9hZHMgKSB7CisJCQlpbnQgbnVtYmVyT2ZSb3dz
ID0gYWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5nZXRSb3dDb3VudCgpOworCQkJZm9yKCBp
bnQgaW5kZXhQb3MgPSAwOyBpbmRleFBvcyA8IG51bWJlck9mUm93czsgaW5kZXhQb3MrKykg
eworCQkJCWZpbmFsIEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyIHJvdyA9IChBZGROZXdE
b3dubG9hZHNUYWJsZU1lbWJlcikgYWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5nZXRSb3co
aW5kZXhQb3MpOworCQkJCWZvcnN0RG93bmxvYWRJdG1lTGlzdC5hZGQoIHJvdy5nZXREb3du
bG9hZEl0ZW0oKSApOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gZm9yc3REb3dubG9hZEl0
bWVMaXN0OworCX0KKworCXByaXZhdGUgdm9pZCBsb2FkTmV3RG93bmxvYWRzSW50b1RhYmxl
KExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+IGZvcnN0RG93bmxvYWRJdG1lTGlzdCkgeworCQl0
aGlzLmFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuY2xlYXJEYXRhTW9kZWwoKTsKKwkJZm9y
KCBGcm9zdERvd25sb2FkSXRlbSBmcm9Eb3dubG9hZEl0ZW0gOiBmb3JzdERvd25sb2FkSXRt
ZUxpc3QpIHsKKwkJCWZpbmFsIEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyIGFkZE5ld0Rv
d25sb2Fkc1RhYmxlTWVtYmVyID0gbmV3IEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyKGZy
b0Rvd25sb2FkSXRlbSk7CisJCQl0aGlzLmFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuYWRk
Um93KGFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyKTsKKwkJfQorCX0KKworCXByaXZhdGUg
dm9pZCBpbml0UG9wdXBNZW51KCkgeworCQl0YWJsZVBvcHVwTWVudSA9IG5ldyBKU2tpbm5h
YmxlUG9wdXBNZW51KCk7CisJCQorCQkvLyBDaGFuZ2UgRG93bmxvYWQgRGlyZWN0b3J5CisJ
CWZpbmFsIEpNZW51SXRlbSBjaGFuZ2VEb3dubG9hZERpciA9IG5ldyBKTWVudUl0ZW0obGFu
Z3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cuYnV0dG9uLmNoYW5nZURv
d25sb2FkRGlyIikpOworCQljaGFuZ2VEb3dubG9hZERpci5hZGRBY3Rpb25MaXN0ZW5lcigg
bmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQg
YWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGFjdGlvbkV2ZW50KSB7CisJCQkJ
Y2hhbmdlRG93bmxvYWREaXJfYWN0aW9uUGVyZm9ybWVkKGFjdGlvbkV2ZW50KTsKKwkJCX0g
CisJCX0pOworCisJCS8vIFJlbW92ZSBpdGVtIGZyb20gbGlzdAorCQlmaW5hbCBKTWVudUl0
ZW0gcmVtb3ZlRG93bmxvYWQgPSBuZXcgSk1lbnVJdGVtKGxhbmd1YWdlLmdldFN0cmluZygi
QWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvbi5yZW1vdmVEb3dubG9hZCIpKTsKKwkJcmVt
b3ZlRG93bmxvYWQuYWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rp
b25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBB
Y3Rpb25FdmVudCBhY3Rpb25FdmVudCkgeworCQkJCXJlbW92ZURvd25sb2FkX2FjdGlvblBl
cmZvcm1lZChhY3Rpb25FdmVudCk7CisJCQl9IAorCQl9KTsKKwkJCisJCS8vIENoYW5nZSBQ
cmlvcml0eQorCQlKTWVudSBjaGFuZ2VQcmlvcml0eU1lbnUgPSBuZXcgSk1lbnUobGFuZ3Vh
Z2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3JpdHkuY2hhbmdlUHJpb3JpdHkiKSk7CisJCWZp
bmFsIGludCBudW1iZXJPZlByaW9yaXRpZXMgPSA3OworCQlKTWVudUl0ZW1bXSBwcmlvSXRl
bUxpc3QgPSBuZXcgSk1lbnVJdGVtW251bWJlck9mUHJpb3JpdGllc107CisJCQorCQlmb3Io
aW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZQcmlvcml0aWVzOyBpKyspIHsKKwkJCWZpbmFsIGlu
dCBwcmlvcml0eSA9IGk7CisJCQlwcmlvSXRlbUxpc3RbcHJpb3JpdHldID0gbmV3IEpNZW51
SXRlbShsYW5ndWFnZS5nZXRTdHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eSIgKyBw
cmlvcml0eSkpOworCQkJY2hhbmdlUHJpb3JpdHlNZW51LmFkZChwcmlvSXRlbUxpc3RbcHJp
b3JpdHldKTsKKwkJCXByaW9JdGVtTGlzdFtwcmlvcml0eV0uYWRkQWN0aW9uTGlzdGVuZXIo
bmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lk
IGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBhY3Rpb25FdmVudCkgeworCQkJ
CQljaGFuZ2VQcmlvcml0eV9hY3Rpb25QZXJmb3JtZWQoYWN0aW9uRXZlbnQsIHByaW9yaXR5
KTsKKwkJCQl9IAorCQkJfSk7CisJCX0KKwkJCisJCS8vIENvbXBvc2UgcG9wdXAgbWVudQor
CQl0YWJsZVBvcHVwTWVudS5hZGQoY2hhbmdlRG93bmxvYWREaXIpOworCQl0YWJsZVBvcHVw
TWVudS5hZGRTZXBhcmF0b3IoKTsKKwkJdGFibGVQb3B1cE1lbnUuYWRkKHJlbW92ZURvd25s
b2FkKTsKKwkJdGFibGVQb3B1cE1lbnUuYWRkU2VwYXJhdG9yKCk7CisJCXRhYmxlUG9wdXBN
ZW51LmFkZChjaGFuZ2VQcmlvcml0eU1lbnUpOworCisJCXRoaXMuYWRkTmV3RG93bmxvYWRz
VGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgVGFibGVQb3B1cE1lbnVNb3VzZUxpc3RlbmVy
KCkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcmVtb3ZlQWxyZWFkeURvd25sb2FkZWRCdXR0
b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGFjdGlvbkV2ZW50KSB7CisJ
CWludCBudW1iZXJPZlJvd3MgPSBhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmdldFJvd0Nv
dW50KCk7CisJCWZvciggaW50IGluZGV4UG9zID0gbnVtYmVyT2ZSb3dzIC0xOyBpbmRleFBv
cyA+PSAwOyBpbmRleFBvcy0tKSB7CisJCQlmaW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1l
bWJlciBhZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciA9IAorCQkJCShBZGROZXdEb3dubG9h
ZHNUYWJsZU1lbWJlcikgYWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5nZXRSb3coaW5kZXhQ
b3MpOworCQkJaWYoIHRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5zZWFyY2hJdGVtS2V5KCBh
ZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlci5nZXREb3dubG9hZEl0ZW0oKS5nZXRLZXkoKSAp
ICkgeworCQkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZGVsZXRlUm93KGFkZE5ld0Rv
d25sb2Fkc1RhYmxlTWVtYmVyKTsKKwkJCX0KKwkJfQorCQlhZGROZXdEb3dubG9hZHNUYWJs
ZS5jbGVhclNlbGVjdGlvbigpOworCX0KKwkJCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUFscmVh
ZHlEb3dubG9hZGVkTmFtZUJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZl
bnQgYWN0aW9uRXZlbnQpIHsKKwkJaW50IG51bWJlck9mUm93cyA9IGFkZE5ld0Rvd25sb2Fk
c1RhYmxlTW9kZWwuZ2V0Um93Q291bnQoKTsKKwkJZm9yKCBpbnQgaW5kZXhQb3MgPSBudW1i
ZXJPZlJvd3MgLTE7IGluZGV4UG9zID49IDA7IGluZGV4UG9zLS0pIHsKKwkJCWZpbmFsIEFk
ZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyID0g
CisJCQkJKEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVyKSBhZGROZXdEb3dubG9hZHNUYWJs
ZU1vZGVsLmdldFJvdyhpbmRleFBvcyk7CisJCQlpZiggdHJhY2tEb3dubG9hZEtleXNTdG9y
YWdlLnNlYXJjaEl0ZW1OYW1lKCBhZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlci5nZXREb3du
bG9hZEl0ZW0oKS5nZXRGaWxlbmFtZSgpICkgKSB7CisJCQkJYWRkTmV3RG93bmxvYWRzVGFi
bGVNb2RlbC5kZWxldGVSb3coYWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIpOworCQkJfQor
CQl9CisJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CisJfQorCQor
CXByaXZhdGUgdm9pZCByZW1vdmVBbHJlYWR5RXhpc3RzQnV0dG9uX2FjdGlvblBlcmZvcm1l
ZChmaW5hbCBBY3Rpb25FdmVudCBhY3Rpb25FdmVudCkgeworCQlpbnQgbnVtYmVyT2ZSb3dz
ID0gYWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5nZXRSb3dDb3VudCgpOworCQlmb3IoIGlu
dCBpbmRleFBvcyA9IG51bWJlck9mUm93cyAtMTsgaW5kZXhQb3MgPj0gMDsgaW5kZXhQb3Mt
LSkgeworCQkJZmluYWwgQWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIgYWRkTmV3RG93bmxv
YWRzVGFibGVNZW1iZXIgPSAKKwkJCQkoQWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIpIGFk
ZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KGluZGV4UG9zKTsKKwkJCWZpbmFsIEZy
b3N0RG93bmxvYWRJdGVtIGZyb3N0RG93bmxvYWRJdGVtID0gYWRkTmV3RG93bmxvYWRzVGFi
bGVNZW1iZXIuZ2V0RG93bmxvYWRJdGVtKCk7CisJCQlpZihuZXcgamF2YS5pby5GaWxlKGZy
b3N0RG93bmxvYWRJdGVtLmdldERvd25sb2FkRGlyKCkgKyBmcm9zdERvd25sb2FkSXRlbS5n
ZXRGaWxlbmFtZSgpKS5leGlzdHMoKSApIHsKKwkJCQlhZGROZXdEb3dubG9hZHNUYWJsZU1v
ZGVsLmRlbGV0ZVJvdyhhZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlcik7CisJCQl9CisJCX0K
KwkJYWRkTmV3RG93bmxvYWRzVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKKwl9CisKKwlwcml2
YXRlIHZvaWQgY2hhbmdlRG93bmxvYWREaXJfYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlv
bkV2ZW50IGFjdGlvbkV2ZW50KSB7CisJCWZpbmFsIGludFtdIHNlbGVjdGVkUm93cyA9IGFk
ZE5ld0Rvd25sb2Fkc1RhYmxlLmdldFNlbGVjdGVkUm93cygpOworCQkKKwkJaWYoIHNlbGVj
dGVkUm93cy5sZW5ndGggPiAwICkgeworCQkJLy8gT3BlbiBjaG9vc2UgRGlyZWN0b3J5IGRp
YWxvZworCQkJSkZpbGVDaG9vc2VyIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7IAor
CQkJY2hvb3Nlci5zZXRDdXJyZW50RGlyZWN0b3J5KAorCQkJCQluZXcgamF2YS5pby5GaWxl
KAorCQkJCQkJCUNvcmUuZnJvc3RTZXR0aW5ncy5nZXREZWZhdWx0VmFsdWUoU2V0dGluZ3ND
bGFzcy5ESVJfRE9XTkxPQUQpCisJCQkJCSkKKwkJCSk7CisJCQljaG9vc2VyLnNldERpYWxv
Z1RpdGxlKGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmNoYW5n
ZURpckRpYWxvZy50aXRsZSIpKTsKKwkJCWNob29zZXIuc2V0RmlsZVNlbGVjdGlvbk1vZGUo
SkZpbGVDaG9vc2VyLkRJUkVDVE9SSUVTX09OTFkpOworCQkJY2hvb3Nlci5zZXRBY2NlcHRB
bGxGaWxlRmlsdGVyVXNlZChmYWxzZSk7CisJCQlpZiAoY2hvb3Nlci5zaG93T3BlbkRpYWxv
Zyh0aGlzKSAhPSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKwkJCQlyZXR1cm47
CisJCQl9CisJCQkKKwkJCS8vIFNldCBuZXcgZGlyIGZvciBzZWxlY3RlZCBpdGVtcworCQkJ
Zm9yKCBpbnQgcm93SW5kZXggOiBzZWxlY3RlZFJvd3MgKSB7CisJCQkJaWYoIHJvd0luZGV4
ID49IGFkZE5ld0Rvd25sb2Fkc1RhYmxlLmdldFJvd0NvdW50KCkgKSB7CisJCQkJCWNvbnRp
bnVlOyAvLyBwYXJhbm9pYQorCQkJCX0KKwkJCQkKKwkJCQkvLyBhZGQgdGhlIGJvYXJkKHMp
IHRvIGJvYXJkIHRyZWUgYW5kIHJlbW92ZSBpdCBmcm9tIHRhYmxlCisJCQkJZmluYWwgQWRk
TmV3RG93bmxvYWRzVGFibGVNZW1iZXIgcm93ID0gKEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVt
YmVyKSBhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmdldFJvdyhyb3dJbmRleCk7CisJCQkJ
cm93LmdldERvd25sb2FkSXRlbSgpLnNldERvd25sb2FkRGlyKGNob29zZXIuZ2V0U2VsZWN0
ZWRGaWxlKCkudG9TdHJpbmcoKSk7CisJCQkJcm93LnVwZGF0ZUNvbW1lbnQoKTsKKwkJCX0K
KwkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9CisJ
CisJcHJpdmF0ZSB2b2lkIHJlbW92ZURvd25sb2FkX2FjdGlvblBlcmZvcm1lZChmaW5hbCBB
Y3Rpb25FdmVudCBlKSB7CisJCWZpbmFsIGludFtdIHNlbGVjdGVkUm93cyA9IGFkZE5ld0Rv
d25sb2Fkc1RhYmxlLmdldFNlbGVjdGVkUm93cygpOworCisJCWlmKCBzZWxlY3RlZFJvd3Mu
bGVuZ3RoID4gMCApIHsKKwkJCWZvciggaW50IHogPSBzZWxlY3RlZFJvd3MubGVuZ3RoIC0g
MTsgeiA+IC0xOyB6LS0gKSB7CisJCQkJZmluYWwgaW50IHJvd0l4ID0gc2VsZWN0ZWRSb3dz
W3pdOworCisJCQkJaWYoIHJvd0l4ID49IGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0
Um93Q291bnQoKSApIHsKKwkJCQkJY29udGludWU7IC8vIHBhcmFub2lhCisJCQkJfQorCisJ
CQkJZmluYWwgQWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIgcm93ID0gKEFkZE5ld0Rvd25s
b2Fkc1RhYmxlTWVtYmVyKSBhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmdldFJvdyhyb3dJ
eCk7CisJCQkJYWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5kZWxldGVSb3cocm93KTsKKwkJ
CX0KKwkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9
CisJCisJcHJpdmF0ZSB2b2lkIGNoYW5nZVByaW9yaXR5X2FjdGlvblBlcmZvcm1lZChmaW5h
bCBBY3Rpb25FdmVudCBlLCBmaW5hbCBpbnQgcHJpb3JpdHkpIHsKKwkJZmluYWwgaW50W10g
c2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0U2VsZWN0ZWRSb3dzKCk7
CisKKwkJaWYoIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwICkgeworCQkJZm9yKCBpbnQgeiA9
IHNlbGVjdGVkUm93cy5sZW5ndGggLSAxOyB6ID4gLTE7IHotLSApIHsKKwkJCQlmaW5hbCBp
bnQgcm93SXggPSBzZWxlY3RlZFJvd3Nbel07CisKKwkJCQlpZiggcm93SXggPj0gYWRkTmV3
RG93bmxvYWRzVGFibGVNb2RlbC5nZXRSb3dDb3VudCgpICkgeworCQkJCQljb250aW51ZTsg
Ly8gcGFyYW5vaWEKKwkJCQl9CisKKwkJCQlmaW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1l
bWJlciByb3cgPSAoQWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fk
c1RhYmxlTW9kZWwuZ2V0Um93KHJvd0l4KTsKKwkJCQlyb3cuZ2V0RG93bmxvYWRJdGVtKCku
c2V0UHJpb3JpdHkocHJpb3JpdHkpOworCQkJfQorCQkJYWRkTmV3RG93bmxvYWRzVGFibGUu
Y2xlYXJTZWxlY3Rpb24oKTsKKwkJfQorCX0KKworCWNsYXNzIEFkZE5ld0Rvd25sb2Fkc1Rh
YmxlTWVtYmVyIGltcGxlbWVudHMgVGFibGVNZW1iZXIgeworCisJCUZyb3N0RG93bmxvYWRJ
dGVtIGZyb3N0RG93bmxvYWRJdGVtOworCQlTdHJpbmcgY29tbWVudDsKKworCQlwdWJsaWMg
QWRkTmV3RG93bmxvYWRzVGFibGVNZW1iZXIoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZnJv
c3REb3dubG9hZEl0ZW0peworCQkJdGhpcy5mcm9zdERvd25sb2FkSXRlbSA9IGZyb3N0RG93
bmxvYWRJdGVtOworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGZpbmFsIGlu
dCBjb2x1bW4pIHsKKwkJCXN3aXRjaCggY29sdW1uICkgeworCQkJCWNhc2UgMDoKKwkJCQkJ
cmV0dXJuIGZyb3N0RG93bmxvYWRJdGVtLmdldEZpbGVuYW1lKCk7CisJCQkJY2FzZSAxOgor
CQkJCQlyZXR1cm4gZnJvc3REb3dubG9hZEl0ZW0uZ2V0S2V5KCk7CisJCQkJY2FzZSAyOgor
CQkJCQlpZiggZnJvc3REb3dubG9hZEl0ZW0uZ2V0UHJpb3JpdHkoKSA9PSAtMSApIHsKKwkJ
CQkJCWZyb3N0RG93bmxvYWRJdGVtLnNldFByaW9yaXR5KCBDb3JlLmZyb3N0U2V0dGluZ3Mu
Z2V0SW50VmFsdWUoU2V0dGluZ3NDbGFzcy5GQ1AyX0RFRkFVTFRfUFJJT19GSUxFX0RPV05M
T0FEICkpOworCQkJCQl9CisJCQkJCVN0cmluZyBwcmlvID0gIkNvbW1vbi5wcmlvcml0eS5w
cmlvcml0eSIgKyBmcm9zdERvd25sb2FkSXRlbS5nZXRQcmlvcml0eSgpOworCQkJCQlyZXR1
cm4gbGFuZ3VhZ2UuZ2V0U3RyaW5nKHByaW8pOworCQkJCWNhc2UgMzoKKwkJCQkJcmV0dXJu
IGZyb3N0RG93bmxvYWRJdGVtLmdldERvd25sb2FkRGlyKCk7CisJCQkJY2FzZSA0OgorCQkJ
CQlpZihjb21tZW50ID09IG51bGwpeworCQkJCQkJdGhpcy51cGRhdGVDb21tZW50KCk7CisJ
CQkJCX0KKwkJCQkJcmV0dXJuIGNvbW1lbnQ7CisJCQkJZGVmYXVsdCA6CisJCQkJCXRocm93
IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIENvbHVtbiBwb3MiKTsKKwkJCX0KKwkJ
fQorCQkKKwkJcHVibGljIHZvaWQgdXBkYXRlQ29tbWVudCgpIHsKKwkJCS8vIEhhcyB0aGlz
IGtleSBhbHJlYWR5IGJlZW4gZG93bmxvYWRlZD8KKwkJCWlmKCB0cmFja0Rvd25sb2FkS2V5
c1N0b3JhZ2Uuc2VhcmNoSXRlbUtleSggZnJvc3REb3dubG9hZEl0ZW0uZ2V0S2V5KCkgKSAp
IHsKKwkJCQljb21tZW50ID0gbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNE
aWFsb2cudGFibGUuYWxyZWFkeURvd25sb2FkZWQiKTsKKwkJCX0gZWxzZSBpZiggdHJhY2tE
b3dubG9hZEtleXNTdG9yYWdlLnNlYXJjaEl0ZW1OYW1lKCBmcm9zdERvd25sb2FkSXRlbS5n
ZXRGaWxlbmFtZSgpICkgKSB7CisJCQkJY29tbWVudCA9IGxhbmd1YWdlLmdldFN0cmluZygi
QWRkTmV3RG93bmxvYWRzRGlhbG9nLnRhYmxlLmFscmVhZHlEb3dubG9hZGVkTmFtZSIpOwor
CQkJfSBlbHNlIGlmKG5ldyBqYXZhLmlvLkZpbGUoZnJvc3REb3dubG9hZEl0ZW0uZ2V0RG93
bmxvYWREaXIoKSArIGZyb3N0RG93bmxvYWRJdGVtLmdldEZpbGVuYW1lKCkpLmV4aXN0cygp
ICkgeworCQkJCWNvbW1lbnQgPSBsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fk
c0RpYWxvZy50YWJsZS5hbHJlYWR5RXhpc3RzIik7CisJCQl9IGVsc2UgeworCQkJCWNvbW1l
bnQgPSAiIjsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBpbnQgY29tcGFyZVRvKGZpbmFsIFRh
YmxlTWVtYmVyIGFuT3RoZXIsIGZpbmFsIGludCB0YWJsZUNvbHVtSW5kZXgpIHsKKwkJCWZp
bmFsIFN0cmluZyBjMSA9IChTdHJpbmcpIGdldFZhbHVlQXQodGFibGVDb2x1bUluZGV4KTsK
KwkJCWZpbmFsIFN0cmluZyBjMiA9IChTdHJpbmcpIGFuT3RoZXIuZ2V0VmFsdWVBdCh0YWJs
ZUNvbHVtSW5kZXgpOworCQkJcmV0dXJuIGMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoYzIpOwor
CQl9CisJCQorCQlwdWJsaWMgRnJvc3REb3dubG9hZEl0ZW0gZ2V0RG93bmxvYWRJdGVtKCl7
CisJCQlyZXR1cm4gZnJvc3REb3dubG9hZEl0ZW07CisJCX0KKwl9CisKKwljbGFzcyBUYWJs
ZVBvcHVwTWVudU1vdXNlTGlzdGVuZXIgaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyIHsKKwkJ
cHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChmaW5hbCBNb3VzZUV2ZW50IGV2ZW50KSB7CisJ
CQltYXliZVNob3dQb3B1cChldmVudCk7CisJCX0KKwkJcHVibGljIHZvaWQgbW91c2VQcmVz
c2VkKGZpbmFsIE1vdXNlRXZlbnQgZXZlbnQpIHsKKwkJCW1heWJlU2hvd1BvcHVwKGV2ZW50
KTsKKwkJfQorCQlwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoZmluYWwgTW91c2VFdmVudCBl
dmVudCkge30KKwkJcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKGZpbmFsIE1vdXNlRXZlbnQg
ZXZlbnQpIHt9CisJCXB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKGZpbmFsIE1vdXNlRXZlbnQg
ZXZlbnQpIHt9CisKKwkJcHJvdGVjdGVkIHZvaWQgbWF5YmVTaG93UG9wdXAoZmluYWwgTW91
c2VFdmVudCBlKSB7CisJCQlpZiggZS5pc1BvcHVwVHJpZ2dlcigpICkgeworCQkJCWlmKCBh
ZGROZXdEb3dubG9hZHNUYWJsZS5nZXRTZWxlY3RlZFJvd0NvdW50KCkgPiAwICkgeworCQkJ
CQkvLyBkb24ndCBzaG93IG1lbnUgaWYgbm90aGluZyBpcyBzZWxlY3RlZAorCQkJCQl0YWJs
ZVBvcHVwTWVudS5zaG93KGFkZE5ld0Rvd25sb2Fkc1RhYmxlLCBlLmdldFgoKSwgZS5nZXRZ
KCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KSW5kZXg6IHNvdXJjZS9mcm9zdC9ndWkv
bW9kZWwvQWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5qYXZhDQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot
LS0gc291cmNlL2Zyb3N0L2d1aS9tb2RlbC9BZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmph
dmEJKHJldmlzaW9uIDApDQorKysgc291cmNlL2Zyb3N0L2d1aS9tb2RlbC9BZGROZXdEb3du
bG9hZHNUYWJsZU1vZGVsLmphdmEJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDU0IEBADQor
cGFja2FnZSBmcm9zdC5ndWkubW9kZWw7CisKK2ltcG9ydCBmcm9zdC51dGlsLmd1aS50cmFu
c2xhdGlvbi5MYW5ndWFnZTsKKworcHVibGljIGNsYXNzIEFkZE5ld0Rvd25sb2Fkc1RhYmxl
TW9kZWwgZXh0ZW5kcyBTb3J0ZWRUYWJsZU1vZGVseworCXByaXZhdGUgc3RhdGljIGZpbmFs
IGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJcHJpdmF0ZSBMYW5ndWFnZSBsYW5n
dWFnZSA9IG51bGw7CisKKwlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBjb2x1bW5O
YW1lc1tdID0gbmV3IFN0cmluZ1s1XTsKKworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgQ2xh
c3M8Pz4gY29sdW1uQ2xhc3Nlc1tdID0gIHsKKwkJU3RyaW5nLmNsYXNzLAorCQlTdHJpbmcu
Y2xhc3MsCisJCVN0cmluZy5jbGFzcywKKwkJU3RyaW5nLmNsYXNzLAorCQlTdHJpbmcuY2xh
c3MKKwl9OworCisJcHVibGljIEFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwoKSB7CisJCXN1
cGVyKCk7CisJCWxhbmd1YWdlID0gTGFuZ3VhZ2UuZ2V0SW5zdGFuY2UoKTsKKwkJcmVmcmVz
aExhbmd1YWdlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlZnJlc2hMYW5ndWFnZSgpIHsK
KwkJY29sdW1uTmFtZXNbMF0gPSBsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fk
c0RpYWxvZy50YWJsZS5uYW1lIik7CisJCWNvbHVtbk5hbWVzWzFdID0gbGFuZ3VhZ2UuZ2V0
U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cudGFibGUua2V5Iik7CisJCWNvbHVtbk5h
bWVzWzJdID0gbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cudGFi
bGUucHJpb3JpdHkiKTsKKwkJY29sdW1uTmFtZXNbM10gPSBsYW5ndWFnZS5nZXRTdHJpbmco
IkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy50YWJsZS5kb3dubG9hZERpciIpOworCQljb2x1bW5O
YW1lc1s0XSA9IGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLnRh
YmxlLmNvbW1lbnQiKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShp
bnQgcm93LCBpbnQgY29sKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgU3Ry
aW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbikgeworCQlpZiggY29sdW1uID49IDAgJiYg
Y29sdW1uIDwgY29sdW1uTmFtZXMubGVuZ3RoICkKKwkJCXJldHVybiBjb2x1bW5OYW1lc1tj
b2x1bW5dOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgaW50IGdldENvbHVtbkNv
dW50KCkgeworCQlyZXR1cm4gY29sdW1uTmFtZXMubGVuZ3RoOworCX0KKworCXB1YmxpYyBD
bGFzczw/PiBnZXRDb2x1bW5DbGFzcyhpbnQgY29sdW1uKSB7CisJCWlmKCBjb2x1bW4gPj0g
MCAmJiBjb2x1bW4gPCBjb2x1bW5DbGFzc2VzLmxlbmd0aCApCisJCQlyZXR1cm4gY29sdW1u
Q2xhc3Nlc1tjb2x1bW5dOworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KSW5kZXg6IHNvdXJj
ZS9mcm9zdC9ndWkvcHJlZmVyZW5jZXMvRG93bmxvYWRQYW5lbC5qYXZhDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gc291cmNlL2Zyb3N0L2d1aS9wcmVmZXJlbmNlcy9Eb3dubG9hZFBhbmVsLmph
dmEJKHJldmlzaW9uIDMxOTIpDQorKysgc291cmNlL2Zyb3N0L2d1aS9wcmVmZXJlbmNlcy9E
b3dubG9hZFBhbmVsLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC02Miw2ICs2Miw4IEBADQog
ICAgIHByaXZhdGUgZmluYWwgSkNoZWNrQm94IGxvZ0Rvd25sb2Fkc0NoZWNrQm94ID0gbmV3
IEpDaGVja0JveCgpOwogICAgIHByaXZhdGUgZmluYWwgSkNoZWNrQm94IHRyYWNrRG93bmxv
YWRzQ2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7CiAKKyAgICBwcml2YXRlIGZpbmFsIEpD
aGVja0JveCB1c2VCb2FyZG5hbWVEb3dubG9hZFN1YmZvbGRlckNoZWNrQm94ID0gbmV3IEpD
aGVja0JveCgpOworCiAgICAgcHJpdmF0ZSBmaW5hbCBKTGFiZWwgd2FpdFRpbWVMYWJlbCA9
IG5ldyBKTGFiZWwoKTsKICAgICBwcml2YXRlIGZpbmFsIEpUZXh0RmllbGQgd2FpdFRpbWVU
ZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCg2KTsKIApAQCAtMTkyLDYgKzE5NCwxMyBAQA0K
ICAgICAgICAgY29uc3RyYWludHMuZ3JpZHggPSAwOwogICAgICAgICBjb25zdHJhaW50cy5n
cmlkd2lkdGggPSAzOwogICAgICAgICBjb25zdHJhaW50cy5pbnNldHMgPSBpbnNldHMwNTU1
OworICAgICAgICBjb25zdHJhaW50cy5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuTk9S
VEhXRVNUOworICAgICAgICBhZGQodXNlQm9hcmRuYW1lRG93bmxvYWRTdWJmb2xkZXJDaGVj
a0JveCwgY29uc3RyYWludHMpOworCisgICAgICAgIGNvbnN0cmFpbnRzLmdyaWR5Kys7Cisg
ICAgICAgIGNvbnN0cmFpbnRzLmdyaWR4ID0gMDsKKyAgICAgICAgY29uc3RyYWludHMuZ3Jp
ZHdpZHRoID0gMzsKKyAgICAgICAgY29uc3RyYWludHMuaW5zZXRzID0gaW5zZXRzMDU1NTsK
ICAgICAgICAgYWRkKGVuZm9yY2VGcm9zdFByaW9yaXR5RmlsZURvd25sb2FkLCBjb25zdHJh
aW50cyk7CiAKICAgICAgICAgY29uc3RyYWludHMuZ3JpZHkrKzsKQEAgLTIyOSw2ICsyMzgs
NyBAQA0KICAgICAgICAgd2FpdFRpbWVUZXh0RmllbGQuc2V0VGV4dCgiIiArIHNldHRpbmdz
LmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRE9XTkxPQURfV0FJVFRJTUUpKTsKICAgICAg
ICAgbG9nRG93bmxvYWRzQ2hlY2tCb3guc2V0U2VsZWN0ZWQoc2V0dGluZ3MuZ2V0Qm9vbFZh
bHVlKFNldHRpbmdzQ2xhc3MuTE9HX0RPV05MT0FEU19FTkFCTEVEKSk7CiAgICAgICAgIHRy
YWNrRG93bmxvYWRzQ2hlY2tCb3guc2V0U2VsZWN0ZWQoc2V0dGluZ3MuZ2V0Qm9vbFZhbHVl
KFNldHRpbmdzQ2xhc3MuVFJBQ0tfRE9XTkxPQURTX0VOQUJMRUQpKTsKKyAgICAgICAgdXNl
Qm9hcmRuYW1lRG93bmxvYWRTdWJmb2xkZXJDaGVja0JveC5zZXRTZWxlY3RlZChzZXR0aW5n
cy5nZXRCb29sVmFsdWUoU2V0dGluZ3NDbGFzcy5VU0VfQk9BUkROQU1FX0RPV05MT0FEX1NV
QkZPTERFUl9FTkFCTEVEKSk7CiAgICAgICAgIHByaW9yaXR5VGV4dEZpZWxkLnNldFRleHQo
c2V0dGluZ3MuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5GQ1AyX0RFRkFVTFRfUFJJT19GSUxF
X0RPV05MT0FEKSk7CiAgICAgICAgIGVuZm9yY2VGcm9zdFByaW9yaXR5RmlsZURvd25sb2Fk
LnNldFNlbGVjdGVkKHNldHRpbmdzLmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLkZDUDJf
RU5GT1JDRV9GUk9TVF9QUklPX0ZJTEVfRE9XTkxPQUQpKTsKICAgICAgICAgZXhlY1RleHRG
aWVsZC5zZXRUZXh0KHNldHRpbmdzLmdldFZhbHVlKFNldHRpbmdzQ2xhc3MuRVhFQ19PTl9E
T1dOTE9BRCkpOwpAQCAtMjQ2LDYgKzI1Niw4IEBADQogCiAgICAgICAgIGxvZ0Rvd25sb2Fk
c0NoZWNrQm94LnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJPcHRpb25zLmRvd25sb2Fk
cy5sb2dEb3dubG9hZHMiKSk7CiAgICAgICAgIHRyYWNrRG93bmxvYWRzQ2hlY2tCb3guc2V0
VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIk9wdGlvbnMuZG93bmxvYWRzLnRyYWNrRG93bmxv
YWRzIikpOworICAgICAgICAKKyAgICAgICAgdXNlQm9hcmRuYW1lRG93bmxvYWRTdWJmb2xk
ZXJDaGVja0JveC5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9h
ZHMudXNlQm9hcmRuYW1lRG93bmxvYWRTdWJmb2xkZXIiKSk7CiAKICAgICAgICAgZGlyZWN0
b3J5TGFiZWwuc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIk9wdGlvbnMuZG93bmxvYWRz
LmRvd25sb2FkRGlyZWN0b3J5IikpOwogICAgICAgICBicm93c2VEaXJlY3RvcnlCdXR0b24u
c2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkNvbW1vbi5icm93c2UiKSArICIuLi4iKTsK
QEAgLTI3Nyw2ICsyODksNyBAQA0KIAogICAgICAgICBzZXR0aW5ncy5zZXRWYWx1ZShTZXR0
aW5nc0NsYXNzLkxPR19ET1dOTE9BRFNfRU5BQkxFRCwgbG9nRG93bmxvYWRzQ2hlY2tCb3gu
aXNTZWxlY3RlZCgpKTsKICAgICAgICAgc2V0dGluZ3Muc2V0VmFsdWUoU2V0dGluZ3NDbGFz
cy5UUkFDS19ET1dOTE9BRFNfRU5BQkxFRCwgdHJhY2tEb3dubG9hZHNDaGVja0JveC5pc1Nl
bGVjdGVkKCkpOworICAgICAgICBzZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLlVT
RV9CT0FSRE5BTUVfRE9XTkxPQURfU1VCRk9MREVSX0VOQUJMRUQsIHVzZUJvYXJkbmFtZURv
d25sb2FkU3ViZm9sZGVyQ2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKICAgICAgICAgc2V0dGlu
Z3Muc2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5GQ1AyX0RFRkFVTFRfUFJJT19GSUxFX0RPV05M
T0FELCBwcmlvcml0eVRleHRGaWVsZC5nZXRUZXh0KCkpOwogICAgICAgICBzZXR0aW5ncy5z
ZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkZDUDJfRU5GT1JDRV9GUk9TVF9QUklPX0ZJTEVfRE9X
TkxPQUQsIGVuZm9yY2VGcm9zdFByaW9yaXR5RmlsZURvd25sb2FkLmlzU2VsZWN0ZWQoKSk7
CiAKSW5kZXg6IHNvdXJjZS9mcm9zdC9tZXNzYWdpbmcvZnJvc3QvZ3VpL01lc3NhZ2VUZXh0
UGFuZS5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0L21lc3NhZ2luZy9m
cm9zdC9ndWkvTWVzc2FnZVRleHRQYW5lLmphdmEJKHJldmlzaW9uIDMxOTIpDQorKysgc291
cmNlL2Zyb3N0L21lc3NhZ2luZy9mcm9zdC9ndWkvTWVzc2FnZVRleHRQYW5lLmphdmEJKHdv
cmtpbmcgY29weSkNCkBAIC03MjksOCArNzI5LDE4IEBADQogICAgICAgICAgKi8KICAgICAg
ICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkQXR0YWNobWVudHMoKSB7CiAgICAgICAgICAgICBm
aW5hbCBJdGVyYXRvcjxGaWxlQXR0YWNobWVudD4gaXQgPSBnZXRJdGVtcygpLml0ZXJhdG9y
KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+
IGZyb3N0RG93bmxvYWRJdGVtTGlzdCA9IG5ldyBMaW5rZWRMaXN0PEZyb3N0RG93bmxvYWRJ
dGVtPigpOworICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEZyb3N0RG93bmxvYWRJdGVt
PiBmcm9zdERvd25sb2FkSXRlbUtleU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRnJvc3RE
b3dubG9hZEl0ZW0+KCk7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRnJvc3REb3du
bG9hZEl0ZW0+IGZyb3N0RG93bmxvYWRJdGVtTmFtZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmlu
ZywgRnJvc3REb3dubG9hZEl0ZW0+KCk7CisgICAgICAgICAgICAKICAgICAgICAgICAgIHdo
aWxlIChpdC5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlQXR0YWNo
bWVudCBmYSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICBpZiggZnJvc3REb3dubG9hZEl0ZW1LZXlNYXAuY29udGFpbnNLZXkoZmEuZ2V0S2V5KCkp
KSB7CisgICAgICAgICAgICAJCWNvbnRpbnVlOworICAgICAgICAgICAgCX0KKyAgICAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmYS5nZXRGaWxl
bmFtZSgpOwogICAgICAgICAgICAgICAgIC8vIG1heWJlIGNvbnZlcnQgaHRtbCBjb2RlcyAo
ZS5nLiAlMmMgLT4gLCApCiAgICAgICAgICAgICAgICAgaWYoIGZpbGVuYW1lLmluZGV4T2Yo
IiUiKSA+IDAgKSB7CkBAIC03NDAsMTIgKzc1MCwzNCBAQA0KICAgICAgICAgICAgICAgICAg
ICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuU0VWRVJFLCAiRGVjb2RlIG9mIEhUTUwgY29kZSBm
YWlsZWQiLCBleCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0gbmV3
IEZyb3N0RG93bmxvYWRJdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUs
Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYS5nZXRLZXkoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGZhLmdldEZpbGVTaXplKCkpOwotICAgICAgICAgICAgICAgIGdldERvd25s
b2FkTW9kZWwoKS5hZGREb3dubG9hZEl0ZW0oZGxJdGVtKTsKKyAgICAgICAgICAgICAgICBp
ZiggZnJvc3REb3dubG9hZEl0ZW1OYW1lTWFwLmNvbnRhaW5zS2V5KGZpbGVuYW1lKSkgewor
ICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZnJvc3REd29ubG9hZEl0ZW0gPSBu
ZXcgRnJvc3REb3dubG9hZEl0ZW0oCisJICAgICAgICAgICAgICAgIGZpbGVuYW1lLAorCSAg
ICAgICAgICAgICAgICBmYS5nZXRLZXkoKSwKKwkgICAgICAgICAgICAgICAgZmEuZ2V0Rmls
ZVNpemUoKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgZnJvc3REd29ubG9hZEl0ZW0uc2V0QXNzb2NpYXRlZE1lc3NhZ2VJZChzZWxl
Y3RlZE1lc3NhZ2UuZ2V0TWVzc2FnZUlkKCkpOworICAgICAgICAgICAgICAgIGZyb3N0RHdv
bmxvYWRJdGVtLnNldEFzc29jaWF0ZWRCb2FyZE5hbWUoc2VsZWN0ZWRNZXNzYWdlLmdldEJv
YXJkKCkuZ2V0Qm9hcmRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiggQ29yZS5m
cm9zdFNldHRpbmdzLmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLlVTRV9CT0FSRE5BTUVf
RE9XTkxPQURfU1VCRk9MREVSX0VOQUJMRUQpICl7CisgICAgICAgICAgICAgICAgCWZyb3N0
RHdvbmxvYWRJdGVtLnNldERvd25sb2FkRGlyKGZyb3N0RHdvbmxvYWRJdGVtLmdldERvd25s
b2FkRGlyKCkuY29uY2F0KGZyb3N0RHdvbmxvYWRJdGVtLmdldEFzc29jaWF0ZWRCb2FyZE5h
bWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcm9zdERvd25s
b2FkSXRlbUxpc3QuYWRkKCBmcm9zdER3b25sb2FkSXRlbSApOworICAgICAgICAgICAgICAg
IGZyb3N0RG93bmxvYWRJdGVtS2V5TWFwLnB1dChmYS5nZXRLZXkoKSwgZnJvc3REd29ubG9h
ZEl0ZW0pOworICAgICAgICAgICAgICAgIGZyb3N0RG93bmxvYWRJdGVtTmFtZU1hcC5wdXQo
ZmlsZW5hbWUsIGZyb3N0RHdvbmxvYWRJdGVtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0ZW1LZXlNYXAuY2xlYXIoKTsKKyAg
ICAgICAgICAgIGZyb3N0RG93bmxvYWRJdGVtTmFtZU1hcC5jbGVhcigpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBmaW5hbCBBZGROZXdEb3dubG9hZHNEaWFsb2cgYWRkTmV3RG93
bmxvYWRzRGlhbG9nID0gbmV3IEFkZE5ld0Rvd25sb2Fkc0RpYWxvZyhtYWluRnJhbWUsIGZy
b3N0RG93bmxvYWRJdGVtTGlzdCk7CisgICAgICAgICAgICBmcm9zdERvd25sb2FkSXRlbUxp
c3QgPSBhZGROZXdEb3dubG9hZHNEaWFsb2cuc3RhcnREaWFsb2coZnJvc3REb3dubG9hZEl0
ZW1MaXN0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGZpbmFsIEZyb3N0RG93
bmxvYWRJdGVtIGZyb3N0RG93bmxvYWRJdGVtIDogZnJvc3REb3dubG9hZEl0ZW1MaXN0ICkg
eworICAgICAgICAgICAgCWdldERvd25sb2FkTW9kZWwoKS5hZGREb3dubG9hZEl0ZW0oZnJv
c3REb3dubG9hZEl0ZW0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAg
LyoqCkBAIC04ODIsMTIgKzkxNCwxOSBAQA0KICAgICAgICAgICAgIGlmKCBpdGVtcyA9PSBu
dWxsICkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgTGlzdDxGcm9zdERvd25sb2FkSXRlbT4gZnJvc3REb3du
bG9hZEl0ZW1MaXN0ID0gbmV3IExpbmtlZExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+KCk7Cisg
ICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRnJvc3REb3dubG9hZEl0ZW0+IGZyb3N0RG93
bmxvYWRJdGVtS2V5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGcm9zdERvd25sb2FkSXRl
bT4oKTsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBGcm9zdERvd25sb2FkSXRlbT4g
ZnJvc3REb3dubG9hZEl0ZW1OYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGcm9zdERv
d25sb2FkSXRlbT4oKTsKIAotICAgICAgICAgICAgZm9yKCBmaW5hbCBTdHJpbmcgaXRlbSA6
IGl0ZW1zICkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgICAgICAg
ICAgLy8gMC43OiB1c2Uga2V5L2ZpbGVuYW1lCi0gICAgICAgICAgICAgICAga2V5ID0gaXRl
bTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGl0ZW0uc3Vic3RyaW5nKGl0ZW0u
bGFzdEluZGV4T2YoIi8iKSsxKTsKKyAgICAgICAgICAgIGZvciggZmluYWwgU3RyaW5nIGtl
eSA6IGl0ZW1zICkgeworICAgICAgICAgICAgCWlmKCBmcm9zdERvd25sb2FkSXRlbUtleU1h
cC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAJCWNvbnRpbnVlOworICAgICAg
ICAgICAgCX0KKyAgICAgICAgICAgIAkKKworICAgICAgICAgICAgCQorICAgICAgICAgICAg
ICAgIFN0cmluZyBuYW1lID0ga2V5LnN1YnN0cmluZyhrZXkubGFzdEluZGV4T2YoIi8iKSsx
KTsKICAgICAgICAgICAgICAgICAvLyBtYXliZSBjb252ZXJ0IGh0bWwgY29kZXMgKGUuZy4g
JTJjIC0+ICwgKQogICAgICAgICAgICAgICAgIGlmKCBuYW1lLmluZGV4T2YoIiUiKSA+IDAg
KSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CkBAIC04OTYsOSArOTM1LDI5IEBADQog
ICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsICJEZWNv
ZGUgb2YgSFRNTCBjb2RlIGZhaWxlZCIsIGV4KTsKICAgICAgICAgICAgICAgICAgICAgfQog
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2Fk
SXRlbSBkbEl0ZW0gPSBuZXcgRnJvc3REb3dubG9hZEl0ZW0obmFtZSwga2V5KTsKLSAgICAg
ICAgICAgICAgICBnZXREb3dubG9hZE1vZGVsKCkuYWRkRG93bmxvYWRJdGVtKGRsSXRlbSk7
CisgICAgICAgICAgICAgICAgaWYoIGZyb3N0RG93bmxvYWRJdGVtTmFtZU1hcC5jb250YWlu
c0tleShuYW1lKSkgeworICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRnJvc3REb3dubG9h
ZEl0ZW0gZnJvc3REd29ubG9hZEl0ZW0gPSBuZXcgRnJvc3REb3dubG9hZEl0ZW0obmFtZSwg
a2V5KTsKKyAgICAgICAgICAgICAgICBmcm9zdER3b25sb2FkSXRlbS5zZXRBc3NvY2lhdGVk
TWVzc2FnZUlkKHNlbGVjdGVkTWVzc2FnZS5nZXRNZXNzYWdlSWQoKSk7CisgICAgICAgICAg
ICAgICAgZnJvc3REd29ubG9hZEl0ZW0uc2V0QXNzb2NpYXRlZEJvYXJkTmFtZShzZWxlY3Rl
ZE1lc3NhZ2UuZ2V0Qm9hcmQoKS5nZXRCb2FyZEZpbGVuYW1lKCkpOworICAgICAgICAgICAg
ICAgIGlmKCBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0Qm9vbFZhbHVlKFNldHRpbmdzQ2xhc3Mu
VVNFX0JPQVJETkFNRV9ET1dOTE9BRF9TVUJGT0xERVJfRU5BQkxFRCkgKXsKKyAgICAgICAg
ICAgICAgICAJZnJvc3REd29ubG9hZEl0ZW0uc2V0RG93bmxvYWREaXIoZnJvc3REd29ubG9h
ZEl0ZW0uZ2V0RG93bmxvYWREaXIoKS5jb25jYXQoZnJvc3REd29ubG9hZEl0ZW0uZ2V0QXNz
b2NpYXRlZEJvYXJkTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIGZyb3N0RG93bmxvYWRJdGVtTGlzdC5hZGQoIGZyb3N0RHdvbmxvYWRJdGVtICk7Cisg
ICAgICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0ZW1LZXlNYXAucHV0KGtleSwgZnJvc3RE
d29ubG9hZEl0ZW0pOworICAgICAgICAgICAgICAgIGZyb3N0RG93bmxvYWRJdGVtTmFtZU1h
cC5wdXQobmFtZSwgZnJvc3REd29ubG9hZEl0ZW0pOwogICAgICAgICAgICAgfQorICAgICAg
ICAgICAgZnJvc3REb3dubG9hZEl0ZW1LZXlNYXAuY2xlYXIoKTsKKyAgICAgICAgICAgIGZy
b3N0RG93bmxvYWRJdGVtTmFtZU1hcC5jbGVhcigpOworICAgICAgICAgICAgCisgICAgICAg
ICAgICBmaW5hbCBBZGROZXdEb3dubG9hZHNEaWFsb2cgYWRkTmV3RG93bmxvYWRzRGlhbG9n
ID0gbmV3IEFkZE5ld0Rvd25sb2Fkc0RpYWxvZyhtYWluRnJhbWUsIGZyb3N0RG93bmxvYWRJ
dGVtTGlzdCk7CisgICAgICAgICAgICBmcm9zdERvd25sb2FkSXRlbUxpc3QgPSBhZGROZXdE
b3dubG9hZHNEaWFsb2cuc3RhcnREaWFsb2coZnJvc3REb3dubG9hZEl0ZW1MaXN0KTsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGZy
b3N0RG93bmxvYWRJdGVtIDogZnJvc3REb3dubG9hZEl0ZW1MaXN0ICkgeworICAgICAgICAg
ICAgCWdldERvd25sb2FkTW9kZWwoKS5hZGREb3dubG9hZEl0ZW0oZnJvc3REb3dubG9hZEl0
ZW0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBMaXN0
PFN0cmluZz4gZ2V0SXRlbXMoZmluYWwgYm9vbGVhbiBnZXRBbGwpIHsKSW5kZXg6IHNvdXJj
ZS9mcm9zdC9TZXR0aW5nc0NsYXNzLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2Uv
ZnJvc3QvU2V0dGluZ3NDbGFzcy5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9m
cm9zdC9TZXR0aW5nc0NsYXNzLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC0yODEsNiArMjgx
LDggQEANCiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDS19ET1dOTE9B
RFNfRU5BQkxFRCA9ICJ0cmFja0Rvd25sb2FkcyI7CiAKKyAgICBwdWJsaWMgc3RhdGljIGZp
bmFsIFN0cmluZyBVU0VfQk9BUkROQU1FX0RPV05MT0FEX1NVQkZPTERFUl9FTkFCTEVEID0g
InVzZUJvYXJkbmFtZURvd25sb2FkU3ViZm9sZGVyIjsKKwogICAgIHB1YmxpYyBTZXR0aW5n
c0NsYXNzKCkgewogICAgICAgICBzZXR0aW5nc0hhc2ggPSBuZXcgSGFzaHRhYmxlPFN0cmlu
ZyxPYmplY3Q+KCk7CiAgICAgICAgIC8vIHRoZSBGSVggY29uZmlnLmRpcgpAQCAtMTA0OCw2
ICsxMDUwLDcgQEANCiAgICAgICAgIGRlZmF1bHRzLnB1dChMT0dfRE9XTkxPQURTX0VOQUJM
RUQsICJmYWxzZSIpOwogICAgICAgICBkZWZhdWx0cy5wdXQoTE9HX1VQTE9BRFNfRU5BQkxF
RCwgImZhbHNlIik7CiAgICAgICAgIGRlZmF1bHRzLnB1dChUUkFDS19ET1dOTE9BRFNfRU5B
QkxFRCwgImZhbHNlIik7CisgICAgICAgIGRlZmF1bHRzLnB1dChVU0VfQk9BUkROQU1FX0RP
V05MT0FEX1NVQkZPTERFUl9FTkFCTEVELCAiZmFsc2UiKTsKIAogCiAgICAgICAgIGRlZmF1
bHRzLnB1dChDT05GSVJNX01BUktfQUxMX01TR1NfUkVBRCwgInRydWUiKTsKSW5kZXg6IHNv
dXJjZS9mcm9zdC9zdG9yYWdlL3BlcnN0L1RyYWNrRG93bmxvYWRLZXlzLmphdmENCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3Qvc3RvcmFnZS9wZXJzdC9UcmFja0Rvd25sb2Fk
S2V5cy5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9mcm9zdC9zdG9yYWdlL3Bl
cnN0L1RyYWNrRG93bmxvYWRLZXlzLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC0xNSw3ICsx
NSw3IEBADQogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBu
b3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogIEZvdW5kYXRpb24sIEluYy4sIDY3
NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLg0KLSovDQorICovDQogcGFj
a2FnZSBmcm9zdC5zdG9yYWdlLnBlcnN0Ow0KIA0KIGltcG9ydCBvcmcuZ2FycmV0LnBlcnN0
Lio7DQpAQCAtMjgsMzggKzI4LDM4IEBADQogCXByaXZhdGUgU3RyaW5nIGNoa0tleTsNCiAJ
cHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7DQogCXByaXZhdGUgU3RyaW5nIGJvYXJkTmFtZTsN
Ci0gICAgcHJpdmF0ZSBsb25nIGZpbGVTaXplOyANCisJcHJpdmF0ZSBsb25nIGZpbGVTaXpl
OyANCiAJcHJpdmF0ZSBsb25nIGRvd25sb2FkRmluaXNoZWRUaW1lOyAvLyB3aGVuIHdhcyB0
aGlzIGRvd25sb2FkIGZpbmlzaGVkDQogDQotICAgIC8vIHVzZWQgYnkgcGVyc3QNCi0gICAg
cHVibGljIFRyYWNrRG93bmxvYWRLZXlzKCkge30NCi0gICAgDQotICAgIHB1YmxpYyBUcmFj
a0Rvd25sb2FkS2V5cyhmaW5hbCBTdHJpbmcgY2hrS2V5LCBmaW5hbCBTdHJpbmcgZmlsZU5h
bWUsIA0KLSAgICAJCWZpbmFsIFN0cmluZyBib2FyZE5hbWUsIGxvbmcgZmlsZVNpemUsIGxv
bmcgZG93bmxvYWRGaW5pc2hlZFRpbWUpIHsNCi0gICAgICAgIHRoaXMuY2hrS2V5ID0gY2hr
S2V5Ow0KLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOw0KLSAgICAgICAgdGhp
cy5ib2FyZE5hbWUgPSBib2FyZE5hbWU7DQotICAgICAgICB0aGlzLmZpbGVTaXplID0gZmls
ZVNpemU7DQotICAgICAgICB0aGlzLmRvd25sb2FkRmluaXNoZWRUaW1lID0gZG93bmxvYWRG
aW5pc2hlZFRpbWU7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBUcmFja0Rvd25sb2Fk
S2V5cyhmaW5hbCBUcmFja0Rvd25sb2FkS2V5cyB0cmFja0Rvd25sb2FkS2V5KSB7DQotICAg
ICAgICB0aGlzLmNoa0tleSA9IHRyYWNrRG93bmxvYWRLZXkuY2hrS2V5Ow0KLSAgICAgICAg
dGhpcy5maWxlTmFtZSA9IHRyYWNrRG93bmxvYWRLZXkuZmlsZU5hbWU7DQotICAgICAgICB0
aGlzLmJvYXJkTmFtZSA9IHRyYWNrRG93bmxvYWRLZXkuYm9hcmROYW1lOw0KLSAgICAgICAg
dGhpcy5maWxlU2l6ZSA9IHRyYWNrRG93bmxvYWRLZXkuZmlsZVNpemU7DQotICAgICAgICB0
aGlzLmRvd25sb2FkRmluaXNoZWRUaW1lID0gdHJhY2tEb3dubG9hZEtleS5kb3dubG9hZEZp
bmlzaGVkVGltZTsNCi0gICAgfQ0KKwkvLyB1c2VkIGJ5IHBlcnN0DQorCXB1YmxpYyBUcmFj
a0Rvd25sb2FkS2V5cygpIHt9DQogDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hrS2V5KCkg
ew0KLSAgICAgICAgcmV0dXJuIGNoa0tleTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGlj
IFN0cmluZyBnZXRGaWxlTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBmaWxlTmFtZTsNCi0g
ICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRCb2FyZE5hbWUoKSB7DQorCXB1
YmxpYyBUcmFja0Rvd25sb2FkS2V5cyhmaW5hbCBTdHJpbmcgY2hrS2V5LCBmaW5hbCBTdHJp
bmcgZmlsZU5hbWUsIA0KKwkJZmluYWwgU3RyaW5nIGJvYXJkTmFtZSwgbG9uZyBmaWxlU2l6
ZSwgbG9uZyBkb3dubG9hZEZpbmlzaGVkVGltZSkgew0KKwkJdGhpcy5jaGtLZXkgPSBjaGtL
ZXk7DQorCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7DQorCQl0aGlzLmJvYXJkTmFtZSA9
IGJvYXJkTmFtZTsNCisJCXRoaXMuZmlsZVNpemUgPSBmaWxlU2l6ZTsNCisJCXRoaXMuZG93
bmxvYWRGaW5pc2hlZFRpbWUgPSBkb3dubG9hZEZpbmlzaGVkVGltZTsNCisJfQ0KKw0KKwlw
dWJsaWMgVHJhY2tEb3dubG9hZEtleXMoZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJhY2tE
b3dubG9hZEtleSkgew0KKwkJdGhpcy5jaGtLZXkgPSB0cmFja0Rvd25sb2FkS2V5LmNoa0tl
eTsNCisJCXRoaXMuZmlsZU5hbWUgPSB0cmFja0Rvd25sb2FkS2V5LmZpbGVOYW1lOw0KKwkJ
dGhpcy5ib2FyZE5hbWUgPSB0cmFja0Rvd25sb2FkS2V5LmJvYXJkTmFtZTsNCisJCXRoaXMu
ZmlsZVNpemUgPSB0cmFja0Rvd25sb2FkS2V5LmZpbGVTaXplOw0KKwkJdGhpcy5kb3dubG9h
ZEZpbmlzaGVkVGltZSA9IHRyYWNrRG93bmxvYWRLZXkuZG93bmxvYWRGaW5pc2hlZFRpbWU7
DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRDaGtLZXkoKSB7DQorCQlyZXR1cm4gY2hr
S2V5Ow0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7DQorCQlyZXR1
cm4gZmlsZU5hbWU7DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRCb2FyZE5hbWUoKSB7
DQogCQlyZXR1cm4gYm9hcmROYW1lOw0KIAl9DQogDQpAQCAtNzIsNiArNzIsNiBAQA0KIAl9
DQogDQogCXB1YmxpYyBsb25nIGdldERvd25sb2FkRmluaXNoZWRUaW1lKCkgew0KLSAgICAg
ICAgcmV0dXJuIGRvd25sb2FkRmluaXNoZWRUaW1lOw0KLSAgICB9DQorCQlyZXR1cm4gZG93
bmxvYWRGaW5pc2hlZFRpbWU7DQorCX0NCiB9DQpJbmRleDogc291cmNlL2Zyb3N0L3N0b3Jh
Z2UvcGVyc3QvVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlLmphdmENCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBzb3VyY2UvZnJvc3Qvc3RvcmFnZS9wZXJzdC9UcmFja0Rvd25sb2FkS2V5c1N0b3Jh
Z2UuamF2YQkocmV2aXNpb24gMzE5MikNCisrKyBzb3VyY2UvZnJvc3Qvc3RvcmFnZS9wZXJz
dC9UcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTE1
LDcgKzE1LDcgQEANCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh
bTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KICAgRm91bmRhdGlvbiwg
SW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuDQotKi8NCisg
Ki8NCiBwYWNrYWdlIGZyb3N0LnN0b3JhZ2UucGVyc3Q7DQogDQogaW1wb3J0IGphdmEudXRp
bC4qOw0KQEAgLTI1LDEwMSArMjUsMTA3IEBADQogDQogcHVibGljIGNsYXNzIFRyYWNrRG93
bmxvYWRLZXlzU3RvcmFnZSBleHRlbmRzIEFic3RyYWN0RnJvc3RTdG9yYWdlIGltcGxlbWVu
dHMgRXhpdFNhdmFibGUgew0KIA0KLSAgICBwcml2YXRlIFRyYWNrRG93bmxvYWRLZXlzU3Rv
cmFnZVJvb3Qgc3RvcmFnZVJvb3QgPSBudWxsOw0KKwlwcml2YXRlIFRyYWNrRG93bmxvYWRL
ZXlzU3RvcmFnZVJvb3Qgc3RvcmFnZVJvb3QgPSBudWxsOw0KIA0KLSAgICBwcml2YXRlIHN0
YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkFHRV9GSUxFTkFNRSA9ICJUcmFja0Rvd25sb2FkS2V5
cy5kYnMiOw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkFHRV9GSUxFTkFN
RSA9ICJUcmFja0Rvd25sb2FkS2V5cy5kYnMiOw0KIA0KLSAgICBwcml2YXRlIHN0YXRpYyBU
cmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UgaW5zdGFuY2UgPSBuZXcgVHJhY2tEb3dubG9hZEtl
eXNTdG9yYWdlKCk7DQorCXByaXZhdGUgc3RhdGljIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFn
ZSBpbnN0YW5jZSA9IG5ldyBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UoKTsNCiANCi0gICAg
cHJvdGVjdGVkIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSgpIHsNCi0gICAgICAgIHN1cGVy
KCk7DQotICAgIH0NCisJcHJvdGVjdGVkIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSgpIHsN
CisJCXN1cGVyKCk7DQorCX0NCiANCi0gICAgcHVibGljIHN0YXRpYyBUcmFja0Rvd25sb2Fk
S2V5c1N0b3JhZ2UgaW5zdCgpIHsNCi0gICAgICAgIHJldHVybiBpbnN0YW5jZTsNCi0gICAg
fQ0KKwlwdWJsaWMgc3RhdGljIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSBpbnN0KCkgew0K
KwkJcmV0dXJuIGluc3RhbmNlOw0KKwl9DQogDQotICAgIHByaXZhdGUgYm9vbGVhbiBhZGRU
b0luZGljZXMoZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJhY2tEb3dubG9hZEtleXMpIHsN
Ci0gICAgCVN5c3RlbS5vdXQucHJpbnQoIkRFQlVHOiBUcmFja0Rvd25sb2FkS2V5c1N0b3Jh
Z2UuYWRkVG9JbmRpY2VzOiAiKTsNCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbih0cmFja0Rv
d25sb2FkS2V5cy5nZXRDaGtLZXkoKSk7DQotICAgICAgICByZXR1cm4gc3RvcmFnZVJvb3Qu
ZG93bmxvYWRLZXlMaXN0LnB1dCh0cmFja0Rvd25sb2FkS2V5cy5nZXRDaGtLZXkoKSwgdHJh
Y2tEb3dubG9hZEtleXMpOw0KLSAgICB9DQorCXByaXZhdGUgYm9vbGVhbiBhZGRUb0luZGlj
ZXMoZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJhY2tEb3dubG9hZEtleXMpIHsNCisJCWlm
KCAhIHN0b3JhZ2VSb290LmRvd25sb2FkS2V5TGlzdC5wdXQodHJhY2tEb3dubG9hZEtleXMu
Z2V0Q2hrS2V5KCksIHRyYWNrRG93bmxvYWRLZXlzKSkgew0KKwkJCXJldHVybiBmYWxzZTsN
CisJCX0NCisJCXJldHVybiBzdG9yYWdlUm9vdC5kb3dubG9hZE5hbWVMaXN0LnB1dCh0cmFj
a0Rvd25sb2FkS2V5cy5nZXRGaWxlTmFtZSgpLCB0cmFja0Rvd25sb2FkS2V5cy5nZXRDaGtL
ZXkoKSk7DQorCX0NCiANCi0gICAgcHVibGljIHZvaWQgc3RvcmVJdGVtKGZpbmFsIFRyYWNr
RG93bmxvYWRLZXlzIHRyYWNrRG93bmxvYWRLZXlzKSB7DQotICAgICAgICBpZiggZ2V0U3Rv
cmFnZSgpID09IG51bGwgKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0K
LSAgICAgICAgaWYoIHRyYWNrRG93bmxvYWRLZXlzLmdldFN0b3JhZ2UoKSA9PSBudWxsICkg
ew0KLSAgICAgICAgCXRyYWNrRG93bmxvYWRLZXlzLm1ha2VQZXJzaXN0ZW50KGdldFN0b3Jh
Z2UoKSk7DQotICAgICAgICAgICAgYWRkVG9JbmRpY2VzKHRyYWNrRG93bmxvYWRLZXlzKTsN
Ci0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAJdHJhY2tEb3dubG9hZEtleXMubW9kaWZ5
KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIHNl
YXJjaEl0ZW0oZmluYWwgU3RyaW5nIGNoa0tleSkgew0KLSAgICAJU3lzdGVtLm91dC5wcmlu
dCgiREVCVUc6IFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5zZWFyY2hJdGVtOiAiKTsNCi0g
ICAgCVN5c3RlbS5vdXQucHJpbnRsbihjaGtLZXkpOw0KLSAgICAJcmV0dXJuIChzdG9yYWdl
Um9vdC5kb3dubG9hZEtleUxpc3QuZ2V0KGNoa0tleSkgIT0gbnVsbCk7DQotICAgIH0NCisJ
cHVibGljIHZvaWQgc3RvcmVJdGVtKGZpbmFsIFRyYWNrRG93bmxvYWRLZXlzIHRyYWNrRG93
bmxvYWRLZXlzKSB7DQorCQlpZiggZ2V0U3RvcmFnZSgpID09IG51bGwgKSB7DQorCQkJcmV0
dXJuOw0KKwkJfQ0KKwkJaWYoIHRyYWNrRG93bmxvYWRLZXlzLmdldFN0b3JhZ2UoKSA9PSBu
dWxsICkgew0KKwkJCXRyYWNrRG93bmxvYWRLZXlzLm1ha2VQZXJzaXN0ZW50KGdldFN0b3Jh
Z2UoKSk7DQorCQkJYWRkVG9JbmRpY2VzKHRyYWNrRG93bmxvYWRLZXlzKTsNCisJCX0gZWxz
ZSB7DQorCQkJdHJhY2tEb3dubG9hZEtleXMubW9kaWZ5KCk7DQorCQl9DQorCX0NCiANCi0g
ICAgcHVibGljIHZvaWQgZXhpdFNhdmUoKSB0aHJvd3MgU3RvcmFnZUV4Y2VwdGlvbiB7DQot
ICAgICAgICBjbG9zZSgpOw0KLSAgICAgICAgc3RvcmFnZVJvb3QgPSBudWxsOw0KLSAgICAg
ICAgU3lzdGVtLm91dC5wcmludGxuKCJJTkZPOiBUcmFja0Rvd25sb2FkS2V5U3RvcmFnZSBj
bG9zZWQuIik7DQotICAgIH0NCisJcHVibGljIGJvb2xlYW4gc2VhcmNoSXRlbUtleShmaW5h
bCBTdHJpbmcgY2hrS2V5KSB7DQorCQlyZXR1cm4gc3RvcmFnZVJvb3QuZG93bmxvYWRLZXlM
aXN0LmdldChjaGtLZXkpICE9IG51bGw7DQorCX0NCiANCi0gICAgQE92ZXJyaWRlDQotICAg
IHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZUZpbGVuYW1lKCkgew0KLSAgICAgICAgcmV0dXJu
IFNUT1JBR0VfRklMRU5BTUU7DQotICAgIH0NCisJcHVibGljIGJvb2xlYW4gc2VhcmNoSXRl
bU5hbWUoZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB7DQorCQlyZXR1cm4gc3RvcmFnZVJvb3Qu
ZG93bmxvYWROYW1lTGlzdC5nZXQoZmlsZU5hbWUpICE9IG51bGw7DQorCX0NCiANCi0gICAg
QE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGluaXRTdG9yYWdlKCkgew0KLSAgICAg
ICAgZmluYWwgU3RyaW5nIGRhdGFiYXNlRmlsZVBhdGggPSBidWlsZFN0b3JhZ2VQYXRoKGdl
dFN0b3JhZ2VGaWxlbmFtZSgpKTsgLy8gcGF0aCB0byB0aGUgZGF0YWJhc2UgZmlsZQ0KLSAg
ICAgICAgZmluYWwgbG9uZyBwYWdlUG9vbFNpemUgPSBnZXRQYWdlUG9vbFNpemUoU2V0dGlu
Z3NDbGFzcy5QRVJTVF9QQUdFUE9PTFNJWkVfU0hBUkVERklMRVNDSEtLRVlTKTsNCisJcHVi
bGljIHZvaWQgZXhpdFNhdmUoKSB0aHJvd3MgU3RvcmFnZUV4Y2VwdGlvbiB7DQorCQljbG9z
ZSgpOw0KKwkJc3RvcmFnZVJvb3QgPSBudWxsOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJJ
TkZPOiBUcmFja0Rvd25sb2FkS2V5U3RvcmFnZSBjbG9zZWQuIik7DQorCX0NCiANCi0gICAg
ICAgIG9wZW4oZGF0YWJhc2VGaWxlUGF0aCwgcGFnZVBvb2xTaXplLCB0cnVlLCB0cnVlLCBm
YWxzZSk7DQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VGaWxlbmFt
ZSgpIHsNCisJCXJldHVybiBTVE9SQUdFX0ZJTEVOQU1FOw0KKwl9DQogDQotICAgICAgICBz
dG9yYWdlUm9vdCA9IChUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290KWdldFN0b3JhZ2Uo
KS5nZXRSb290KCk7DQotICAgICAgICBpZiAoc3RvcmFnZVJvb3QgPT0gbnVsbCkgew0KLSAg
ICAgICAgICAgIC8vIFN0b3JhZ2Ugd2FzIG5vdCBpbml0aWFsaXplZCB5ZXQNCi0gICAgICAg
ICAgICBzdG9yYWdlUm9vdCA9IG5ldyBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290KCk7
DQotICAgICAgICAgICAgLy8gdW5pcXVlIGluZGV4IG9mIGNoa0tleXMNCi0gICAgICAgICAg
ICBzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxpc3QgPSBnZXRTdG9yYWdlKCkuY3JlYXRlSW5k
ZXgoU3RyaW5nLmNsYXNzLCB0cnVlKTsNCi0gICAgICAgICAgICBnZXRTdG9yYWdlKCkuc2V0
Um9vdChzdG9yYWdlUm9vdCk7DQotICAgICAgICAgICAgY29tbWl0KCk7IC8vIGNvbW1pdCB0
cmFuc2FjdGlvbg0KLSAgICAgICAgfQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJ
TkZPOiBUcmFja0Rvd25sb2FkS2V5U3RvcmFnZSBpbml0aWFsaXplZC4iKTsNCi0gICAgICAg
IHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRGVsZXRl
IGFsbCBlbnRyaWVzIHRoYXQgd2VyZSBkb3dubG9hZGVkIG1heERheXNPbGQgZGF5ZXMgYWdv
Lg0KLSAgICAgKiBAcmV0dXJuICBjb3VudCBvZiBkZWxldGVkIHJvd3MNCi0gICAgICovDQot
ICAgIHB1YmxpYyBpbnQgY2xlYW51cFRhYmxlKGZpbmFsIGludCBtYXhEYXlzT2xkKSB7DQor
CUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpbml0U3RvcmFnZSgpIHsNCisJCWZpbmFs
IFN0cmluZyBkYXRhYmFzZUZpbGVQYXRoID0gYnVpbGRTdG9yYWdlUGF0aChnZXRTdG9yYWdl
RmlsZW5hbWUoKSk7IC8vIHBhdGggdG8gdGhlIGRhdGFiYXNlIGZpbGUNCisJCWZpbmFsIGxv
bmcgcGFnZVBvb2xTaXplID0gZ2V0UGFnZVBvb2xTaXplKFNldHRpbmdzQ2xhc3MuUEVSU1Rf
UEFHRVBPT0xTSVpFX1NIQVJFREZJTEVTQ0hLS0VZUyk7DQogDQotICAgICAgICBmaW5hbCBs
b25nIG1pblZhbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gKG1heERheXNPbGQg
KiAyNEwgKiA2MEwgKiA2MEwgKiAxMDAwTCk7DQorCQlvcGVuKGRhdGFiYXNlRmlsZVBhdGgs
IHBhZ2VQb29sU2l6ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOw0KIA0KLSAgICAgICAgLy8gZGVs
ZXRlIGFsbCBpdGVtcyB3aXRoIGxhc3RTZWVuIDwgbWluVmFsLCBidXQgbGFzdFNlZW4gPiAw
DQotICAgICAgICBpbnQgZGVsZXRlZENvdW50ID0gMDsNCisJCXN0b3JhZ2VSb290ID0gKFRy
YWNrRG93bmxvYWRLZXlzU3RvcmFnZVJvb3QpZ2V0U3RvcmFnZSgpLmdldFJvb3QoKTsNCisJ
CWlmIChzdG9yYWdlUm9vdCA9PSBudWxsIHx8IHN0b3JhZ2VSb290LmRvd25sb2FkS2V5TGlz
dCA9PSBudWxsIHx8IHN0b3JhZ2VSb290LmRvd25sb2FkTmFtZUxpc3QgPT0gbnVsbCkgew0K
KwkJCS8vIFN0b3JhZ2Ugd2FzIG5vdCBpbml0aWFsaXplZCB5ZXQNCisJCQlzdG9yYWdlUm9v
dCA9IG5ldyBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290KCk7DQorCQkJLy8gdW5pcXVl
IGluZGV4IG9mIGNoa0tleXMNCisJCQlzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxpc3QgPSBn
ZXRTdG9yYWdlKCkuY3JlYXRlSW5kZXgoU3RyaW5nLmNsYXNzLCB0cnVlKTsNCisJCQkvLyB1
bmlxdWUgaW5kZXggb2YgZG9ud25sb2FkRmlsZW5hbWVzDQorCQkJc3RvcmFnZVJvb3QuZG93
bmxvYWROYW1lTGlzdCA9IGdldFN0b3JhZ2UoKS5jcmVhdGVJbmRleChTdHJpbmcuY2xhc3Ms
IHRydWUpOw0KKwkJCQ0KKwkJCWdldFN0b3JhZ2UoKS5zZXRSb290KHN0b3JhZ2VSb290KTsN
CisJCQljb21taXQoKTsgLy8gY29tbWl0IHRyYW5zYWN0aW9uDQorCQl9DQorCQlTeXN0ZW0u
b3V0LnByaW50bG4oIklORk86IFRyYWNrRG93bmxvYWRLZXlTdG9yYWdlIGluaXRpYWxpemVk
LiIpOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCiANCi0gICAgICAgIGJlZ2luRXhjbHVzaXZl
VGhyZWFkVHJhbnNhY3Rpb24oKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZmlu
YWwgSXRlcmF0b3I8VHJhY2tEb3dubG9hZEtleXM+IGkgPSBzdG9yYWdlUm9vdC5kb3dubG9h
ZEtleUxpc3QuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICB3aGlsZShpLmhhc05leHQoKSkg
ew0KLSAgICAgICAgICAgICAgICBmaW5hbCBUcmFja0Rvd25sb2FkS2V5cyBzZmsgPSBpLm5l
eHQoKTsNCi0gICAgICAgICAgICAgICAgaWYoIHNmay5nZXREb3dubG9hZEZpbmlzaGVkVGlt
ZSgpID4gMCAmJiBzZmsuZ2V0RG93bmxvYWRGaW5pc2hlZFRpbWUoKSA8IG1pblZhbCApIHsN
Ci0gICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7IC8vIHJlbW92ZSBmcm9tIGl0ZXJh
dGVkIGluZGV4DQotICAgICAgICAgICAgICAgICAgICBzZmsuZGVhbGxvY2F0ZSgpOyAvLyBy
ZW1vdmUgZnJvbSBTdG9yYWdlDQotICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ291bnQr
KzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZmlu
YWxseSB7DQotICAgICAgICAgICAgZW5kVGhyZWFkVHJhbnNhY3Rpb24oKTsNCi0gICAgICAg
IH0NCisJLyoqDQorCSAqIERlbGV0ZSBhbGwgZW50cmllcyB0aGF0IHdlcmUgZG93bmxvYWRl
ZCBtYXhEYXlzT2xkIGRheWVzIGFnby4NCisJICogQHJldHVybiAgY291bnQgb2YgZGVsZXRl
ZCByb3dzDQorCSAqLw0KKwlwdWJsaWMgaW50IGNsZWFudXBUYWJsZShmaW5hbCBpbnQgbWF4
RGF5c09sZCkgew0KIA0KLSAgICAgICAgcmV0dXJuIGRlbGV0ZWRDb3VudDsNCi0gICAgfQ0K
KwkJZmluYWwgbG9uZyBtaW5WYWwgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtICht
YXhEYXlzT2xkICogMjRMICogNjBMICogNjBMICogMTAwMEwpOw0KKw0KKwkJLy8gZGVsZXRl
IGFsbCBpdGVtcyB3aXRoIGxhc3RTZWVuIDwgbWluVmFsLCBidXQgbGFzdFNlZW4gPiAwDQor
CQlpbnQgZGVsZXRlZENvdW50ID0gMDsNCisNCisJCWJlZ2luRXhjbHVzaXZlVGhyZWFkVHJh
bnNhY3Rpb24oKTsNCisJCXRyeSB7DQorCQkJZmluYWwgSXRlcmF0b3I8VHJhY2tEb3dubG9h
ZEtleXM+IGkgPSBzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxpc3QuaXRlcmF0b3IoKTsNCisJ
CQl3aGlsZShpLmhhc05leHQoKSkgew0KKwkJCQlmaW5hbCBUcmFja0Rvd25sb2FkS2V5cyBz
ZmsgPSBpLm5leHQoKTsNCisJCQkJaWYoIHNmay5nZXREb3dubG9hZEZpbmlzaGVkVGltZSgp
ID4gMCAmJiBzZmsuZ2V0RG93bmxvYWRGaW5pc2hlZFRpbWUoKSA8IG1pblZhbCApIHsNCisJ
CQkJCWkucmVtb3ZlKCk7IC8vIHJlbW92ZSBmcm9tIGl0ZXJhdGVkIGluZGV4DQorCQkJCQlz
ZmsuZGVhbGxvY2F0ZSgpOyAvLyByZW1vdmUgZnJvbSBTdG9yYWdlDQorCQkJCQlkZWxldGVk
Q291bnQrKzsNCisJCQkJfQ0KKwkJCX0NCisJCX0gZmluYWxseSB7DQorCQkJZW5kVGhyZWFk
VHJhbnNhY3Rpb24oKTsNCisJCX0NCisNCisJCXJldHVybiBkZWxldGVkQ291bnQ7DQorCX0N
CiB9DQpJbmRleDogc291cmNlL2Zyb3N0L3N0b3JhZ2UvcGVyc3QvVHJhY2tEb3dubG9hZEtl
eXNTdG9yYWdlUm9vdC5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0L3N0
b3JhZ2UvcGVyc3QvVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlUm9vdC5qYXZhCShyZXZpc2lv
biAzMTkyKQ0KKysrIHNvdXJjZS9mcm9zdC9zdG9yYWdlL3BlcnN0L1RyYWNrRG93bmxvYWRL
ZXlzU3RvcmFnZVJvb3QuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTIxLDggKzIxLDkgQEAN
CiBpbXBvcnQgb3JnLmdhcnJldC5wZXJzdC4qOw0KIA0KIHB1YmxpYyBjbGFzcyBUcmFja0Rv
d25sb2FkS2V5c1N0b3JhZ2VSb290IGV4dGVuZHMgUGVyc2lzdGVudCB7DQotICAgIA0KLSAg
ICBwdWJsaWMgVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlUm9vdCgpIHt9DQotICAgIA0KLSAg
ICBJbmRleDxUcmFja0Rvd25sb2FkS2V5cz4gZG93bmxvYWRLZXlMaXN0Ow0KKwkNCisJcHVi
bGljIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZVJvb3QoKSB7fQ0KKwkNCisJSW5kZXg8VHJh
Y2tEb3dubG9hZEtleXM+IGRvd25sb2FkS2V5TGlzdDsNCisJSW5kZXg8U3RyaW5nPiBkb3du
bG9hZE5hbWVMaXN0Ow0KIH0NCkluZGV4OiBzb3VyY2UvZnJvc3QvdXRpbC9GaWxlQWNjZXNz
LmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3QvdXRpbC9GaWxlQWNjZXNz
LmphdmEJKHJldmlzaW9uIDMxOTIpDQorKysgc291cmNlL2Zyb3N0L3V0aWwvRmlsZUFjY2Vz
cy5qYXZhCSh3b3JraW5nIGNvcHkpDQpAQCAtNDY2LDYgKzQ2NiwyMyBAQA0KICAgICAgICAg
Ly8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0CiAgICAgICAgIHJl
dHVybiBkaXIuZGVsZXRlKCk7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICogQ3JlYXRl
IGdpdmVuIGRpcmVjdG9yeQorICAgICovCisgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3Jl
YXRlRGlyKGZpbmFsIGphdmEuaW8uRmlsZSBkaXIpIHsKKyAgICAgICBpZiggZGlyLmlzRGly
ZWN0b3J5KCkgKSB7CisgICAgCSAgIHJldHVybiB0cnVlOworICAgICAgIH0KKyAgICAgICAK
KyAgICAgICBpZiggZGlyLmV4aXN0cygpKSB7CisgICAgCSAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICB9CisgICAgICAgCisgICAgICAgcmV0dXJuIGRpci5ta2RpcnMoKTsKKyAgIH0KKyAg
ICAKKyAgICAKIAogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGNvcGllcyB0aGUgY29u
dGVudHMgb2Ygb25lIGZpbGUgdG8gYW5vdGhlci4gSWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUg
ZGlkbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkLiBJZgpAQCAtNTg1LDggKzYwMiw4IEBADQog
CiAgICAgCWlmICghcGF0aC5lbmRzV2l0aChzZXBhcmF0b3IpKSB7CiAgICAgCQlyZXR1cm4g
cGF0aCArIHNlcGFyYXRvcjsKLQkJfQorICAgIAl9CiAKLQkJcmV0dXJuIHBhdGg7Ci0JfQor
ICAgIAlyZXR1cm4gcGF0aDsKKyAgICB9CiB9CkluZGV4OiBzb3VyY2UvaTE4bi9sYW5ncmVz
LnByb3BlcnRpZXMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0NCkNhbm5vdCBkaXNwbGF5OiBmaWxlIG1hcmtl
ZCBhcyBhIGJpbmFyeSB0eXBlLg0Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0
LXN0cmVhbQ0K
--------------090909040209040306040206
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--------------090909040209040306040206
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Jtcfrost-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jtcfrost-devl

--------------090909040209040306040206--