update JSDoc and re-published to https://privatebin.info/jsdoc/

This commit is contained in:
El RIDO 2017-03-13 20:24:18 +01:00
parent ee43557a4f
commit 5bf25f227e
No known key found for this signature in database
GPG key ID: 0F5C940A6BD81F92
3 changed files with 148 additions and 134 deletions

View file

@ -36,6 +36,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* static Helper methods
*
* @name Helper
* @class
*/
var Helper = (function () {
@ -45,6 +46,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* character to HTML entity lookup table
*
* @see {@link https://github.com/janl/mustache.js/blob/master/mustache.js#L60}
* @name Helper.entityMap
* @private
* @enum {Object}
* @readonly
@ -63,6 +65,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* cache for script location
*
* @name Helper.baseUri
* @private
* @enum {string|null}
*/
@ -299,7 +302,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* resets state, used for unit testing
*
* @name Model.reset
* @name Helper.reset
* @function
*/
me.reset = function()
@ -313,6 +316,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* internationalization module
*
* @name I18n
* @param {object} window
* @param {object} document
* @class
@ -323,6 +327,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* const for string of loaded language
*
* @name I18n.languageLoadedEvent
* @private
* @prop {string}
* @readonly
@ -332,6 +337,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* supported languages, minus the built in 'en'
*
* @name I18n.supportedLanguages
* @private
* @prop {string[]}
* @readonly
@ -341,6 +347,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* built in language
*
* @name I18n.language
* @private
* @prop {string|null}
*/
@ -349,15 +356,14 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* translation cache
*
* @name I18n.translations
* @private
* @enum {Object}
*/
var translations = {};
/**
* translate a string, alias for I18n.translate()
*
* for a full description see me.translate
* translate a string, alias for I18n.translate
*
* @name I18n._
* @function
@ -553,6 +559,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* handles everything related to en/decryption
*
* @name CryptTool
* @class
*/
var CryptTool = (function () {
@ -561,7 +568,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* compress a message (deflate compression), returns base64 encoded data
*
* @name cryptToolcompress
* @name CryptTool.compress
* @function
* @private
* @param {string} message
@ -575,7 +582,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* decompress a message compressed with cryptToolcompress()
*
* @name cryptTooldecompress
* @name CryptTool.decompress
* @function
* @private
* @param {string} data - base64 data
@ -638,9 +645,9 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
/**
* checks whether the crypt tool is ready.
* checks whether the crypt tool has collected enough entropy
*
* @name CryptTool.isReady
* @name CryptTool.isEntropyReady
* @function
* @return {bool}
*/
@ -650,9 +657,9 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
/**
* checks whether the crypt tool is ready.
* add a listener function, triggered when enough entropy is available
*
* @name CryptTool.isReady
* @name CryptTool.addEntropySeedListener
* @function
* @param {function} func
*/
@ -673,29 +680,13 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
return sjcl.codec.base64.fromBits(sjcl.random.randomWords(8, 0), 0);
}
/**
* initialize crypt tool
*
* @name CryptTool.init
* @function
*/
me.init = function()
{
// will fail earlier as sjcl is already passed as a parameter
// if (typeof sjcl !== 'object') {
// Alert.showError(
// I18n._('The library %s is not available.', 'sjcl') +
// I18n._('Messages cannot be decrypted or encrypted.')
// );
// }
}
return me;
})();
/**
* (Model) Data source (aka MVC)
*
* @name Model
* @class
*/
var Model = (function () {
@ -857,6 +848,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*
* everything directly UI-related, which fits nowhere else
*
* @name UiHelper
* @param {object} window
* @param {object} document
* @class
@ -869,6 +861,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*
* currently this does only handle redirects to the home page.
*
* @name UiHelper.historyChange
* @private
* @function
* @param {Event} event
@ -902,8 +895,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* checks whether the element is currently visible in the viewport (so
* the user can actually see it)
*
* THanks to https://stackoverflow.com/a/40658647
*
* @see {@link https://stackoverflow.com/a/40658647}
* @name UiHelper.isVisible
* @function
* @param {jQuery} $element The link hash to move to.
@ -922,9 +914,9 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* scrolls to a specific element
*
* Based on code by @hanoo: https://stackoverflow.com/questions/4198041/jquery-smooth-scroll-to-an-anchor#answer-12714767
*
* @see {@link https://stackoverflow.com/questions/4198041/jquery-smooth-scroll-to-an-anchor#answer-12714767}
* @name UiHelper.scrollTo
* @function
* @param {jQuery} $element The link hash to move to.
* @param {(number|string)} animationDuration passed to jQuery .animate, when set to 0 the animation is skipped
* @param {string} animationEffect passed to jQuery .animate
@ -992,6 +984,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* Alert/error manager
*
* @name Alert
* @param {object} window
* @param {object} document
* @class
@ -1023,6 +1016,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* forwards a request to the i18n module and shows the element
*
* @name Alert.handleNotification
* @private
* @function
* @param {int} id - id of notification
@ -1260,6 +1254,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* handles paste status/result
*
* @name PasteStatus
* @param {object} window
* @param {object} document
* @class
@ -1275,6 +1270,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* forward to URL shortener
*
* @name PasteStatus.sendToShortener
* @private
* @function
* @param {Event} event
@ -1291,7 +1287,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* This is necessary as browsers will not reload the page when it is
* already loaded (which is fake as it is set via history.pushState()).
*
* @name Controller.pasteLinkClick
* @name PasteStatus.pasteLinkClick
* @function
* @param {Event} event
*/
@ -1391,7 +1387,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*
* preloads jQuery elements
*
* @name Alert.init
* @name PasteStatus.init
* @function
*/
me.init = function()
@ -1411,6 +1407,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* password prompt
*
* @name Prompt
* @param {object} window
* @param {object} document
* @class
@ -1424,10 +1421,31 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
var password = '';
/**
* submit a password in the modal dialog
*
* @name Prompt.submitPasswordModal
* @private
* @function
* @param {Event} event
*/
function submitPasswordModal(event)
{
event.preventDefault();
// get input
password = $passwordDecrypt.val();
// hide modal
$passwordModal.modal('hide');
PasteDecrypter.run();
}
/**
* ask the user for the password and set it
*
* @name Prompt.requestPassword()
* @name Prompt.requestPassword
* @function
*/
me.requestPassword = function()
@ -1469,33 +1487,12 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
return password;
}
/**
* submit a password in the modal dialog
*
* @private
* @function
* @param {Event} event
*/
function submitPasswordModal(event)
{
event.preventDefault();
// get input
password = $passwordDecrypt.val();
// hide modal
$passwordModal.modal('hide');
PasteDecrypter.run();
}
/**
* init status manager
*
* preloads jQuery elements
*
* @name Controller.init
* @name Prompt.init
* @function
*/
me.init = function()
@ -1522,6 +1519,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*
* Note that the actual preview is handled by PasteViewer.
*
* @name Editor
* @param {object} window
* @param {object} document
* @class
@ -1735,6 +1733,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* (view) Parse and show paste.
*
* @name PasteViewer
* @param {object} window
* @param {object} document
* @class
@ -1755,6 +1754,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* apply the set format on paste and displays it
*
* @name PasteViewer.parsePaste
* @private
* @function
*/
@ -1809,6 +1809,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* displays the paste
*
* @name PasteViewer.showPaste
* @private
* @function
*/
@ -1860,7 +1861,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* returns the current format
*
* @name PasteViewer.setFormat
* @name PasteViewer.getFormat
* @function
* @return {string}
*/
@ -1951,7 +1952,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*
* preloads jQuery elements
*
* @name Editor.init
* @name PasteViewer.init
* @function
*/
me.init = function()
@ -1985,6 +1986,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* (view) Show attachment and preview if possible
*
* @name AttachmentViewer
* @param {object} window
* @param {object} document
* @class
@ -2065,9 +2067,9 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* hides the attachment
*
* This will not hide the preview {@see me.hideAttachmentPreview}
* nor will it hide the attachment link if it was moved somewhere
* else {@see moveAttachmentTo}.
* This will not hide the preview (see AttachmentViewer.hideAttachmentPreview
* for that) nor will it hide the attachment link if it was moved somewhere
* else (see AttachmentViewer.moveAttachmentTo).
*
* @name AttachmentViewer.hideAttachment
* @function
@ -2119,7 +2121,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*
* It is advisable to hide the attachment afterwards (AttachmentViewer.hideAttachment)
*
* @name AttachmentViewer.setClonedAttachment
* @name AttachmentViewer.moveAttachmentTo
* @function
* @param {jQuery} $element - the wrapper/container element where this should be moved to
* @param {string} label - the text to show (%s will be replaced with the file name), will automatically be translated
@ -2154,6 +2156,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* (view) Shows discussion thread and handles replies
*
* @name DiscussionViewer
* @param {object} window
* @param {object} document
* @class
@ -2174,6 +2177,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* initializes the templates
*
* @name DiscussionViewer.initTemplates
* @private
* @function
*/
@ -2188,6 +2192,35 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$commentTail = Model.getTemplate('commenttail');
}
/**
* open the comment entry when clicking the "Reply" button of a comment
*
* @name DiscussionViewer.openReply
* @private
* @function
* @param {Event} event
*/
function openReply(event)
{
var $source = $(event.target);
// clear input
$replyMessage.val('');
$replyNickname.val('');
// get comment id from source element
replyCommentId = $source.parent().prop('id').split('_')[1];
// move to correct position
$source.after($reply);
// show
$reply.removeClass('hidden');
$replyMessage.focus();
event.preventDefault();
}
/**
* custom handler for displaying notifications in own status message area
*
@ -2221,34 +2254,6 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
return $replyStatus;
}
/**
* open the comment entry when clicking the "Reply" button of a comment
*
* @private
* @function
* @param {Event} event
*/
function openReply(event)
{
var $source = $(event.target);
// clear input
$replyMessage.val('');
$replyNickname.val('');
// get comment id from source element
replyCommentId = $source.parent().prop('id').split('_')[1];
// move to correct position
$source.after($reply);
// show
$reply.removeClass('hidden');
$replyMessage.focus();
event.preventDefault();
}
/**
* adds another comment
*
@ -2439,6 +2444,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* Manage top (navigation) bar
*
* @name TopNav
* @param {object} window
* @param {object} document
* @class
@ -2472,6 +2478,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* set the expiration on bootstrap templates in dropdown
*
* @name TopNav.updateExpiration
* @private
* @function
* @param {Event} event
*/
@ -2491,6 +2498,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* set the format on bootstrap templates in dropdown
*
* @name TopNav.updateFormat
* @private
* @function
* @param {Event} event
*/
@ -2516,6 +2524,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* when "burn after reading" is checked, disable discussion
*
* @name TopNav.changeBurnAfterReading
* @private
* @function
*/
function changeBurnAfterReading()
@ -2535,6 +2544,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* when discussion is checked, disable "burn after reading"
*
* @name TopNav.changeOpenDiscussion
* @private
* @function
*/
function changeOpenDiscussion()
@ -2554,6 +2564,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* return raw text
*
* @name TopNav.rawText
* @private
* @function
* @param {Event} event
*/
@ -2588,6 +2599,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
* saves the language in a cookie and reloads the page
*
* @name TopNav.setLanguage
* @private
* @function
* @param {Event} event
*/
@ -2600,6 +2612,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* hides all messages and creates a new paste
*
* @name TopNav.clickNewPaste
* @private
* @function
* @param {Event} event
@ -2613,6 +2626,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* removes the existing attachment
*
* @name TopNav.removeAttachment
* @private
* @function
* @param {Event} event
@ -2633,17 +2647,6 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
event.preventDefault();
}
/**
* Loads the default options for creating a paste.
*
* @name TopNav.loadDefaults
* @function
*/
me.loadDefaults = function()
{
// @TODO
}
/**
* Shows all elements belonging to viwing an existing pastes
*
@ -2940,7 +2943,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$burnAfterReading.change(changeBurnAfterReading);
$openDiscussionOption.change(changeOpenDiscussion);
$newButton.click(clickNewPaste);
$sendButton.click(PasteEncrypter.submitPaste);
$sendButton.click(PasteEncrypter.sendPaste);
$cloneButton.click(Controller.clonePaste);
$rawTextButton.click(rawText);
$fileRemoveButton.click(removeAttachment);
@ -2955,8 +2958,6 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// get default value from template or fall back to set value
pasteExpiration = Model.getExpirationDefault() || pasteExpiration;
me.loadDefaults();
}
return me;
@ -2965,6 +2966,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* Responsible for AJAX requests, transparently handles encryption
*
* @name Uploader
* @class
*/
var Uploader = (function () {
@ -2980,6 +2982,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* public variable ('constant') for errors to prevent magic numbers
*
* @name Uploader.error
* @readonly
* @enum {Object}
*/
@ -2993,6 +2996,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* ajaxHeaders to send in AJAX requests
*
* @name Uploader.ajaxHeaders
* @private
* @readonly
* @enum {Object}
@ -3002,6 +3006,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* called after successful upload
*
* @name Uploader.checkCryptParameters
* @private
* @function
* @throws {string}
@ -3034,6 +3039,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* called after successful upload
*
* @name Uploader.success
* @private
* @function
* @param {int} status
@ -3053,6 +3059,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* called after a upload failure
*
* @name Uploader.fail
* @private
* @function
* @param {int} status - internal code
@ -3267,7 +3274,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*
* Does upload, encryption is done transparently by Uploader.
*
* @name state
* @name PasteEncrypter
* @class
*/
var PasteEncrypter = (function () {
@ -3278,6 +3285,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* checks whether there is a suitable amount of entrophy
*
* @name PasteEncrypter.checkRequirements
* @private
* @function
* @param {function} retryCallback - the callback to execute to retry the upload
@ -3305,6 +3313,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* called after successful paste upload
*
* @name PasteEncrypter.showCreatedPaste
* @private
* @function
* @param {int} status
@ -3329,13 +3338,14 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
Editor.hide();
// parse and show text
// (preparation already done in me.submitPaste())
// (preparation already done in me.sendPaste())
PasteViewer.run();
}
/**
* called after successful comment upload
*
* @name PasteEncrypter.showUploadedComment
* @private
* @function
* @param {int} status
@ -3357,6 +3367,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* adds attachments to the Uploader
*
* @name PasteEncrypter.encryptAttachments
* @private
* @function
* @param {File|null|undefined} file - optional, falls back to cloned attachment
@ -3476,10 +3487,10 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* sends a new paste to server
*
* @name PasteEncrypter.submitPaste
* @name PasteEncrypter.sendPaste
* @function
*/
me.submitPaste = function()
me.sendPaste = function()
{
// hide previous (error) messages
Controller.hideStatusMessages();
@ -3506,7 +3517,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// check entropy
if (!checkRequirements(function () {
me.submitPaste();
me.sendPaste();
})) {
return; // to prevent multiple executions
}
@ -3570,7 +3581,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*
* Only decryption, no download.
*
* @name state
* @name PasteDecrypter
* @class
*/
var PasteDecrypter = (function () {
@ -3579,13 +3590,14 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* decrypt data or prompts for password in cvase of failure
*
* @name PasteDecrypter.decryptOrPromptPassword
* @private
* @function
* @param {string} key
* @param {string} password - optional, may be an empty string
* @param {string} cipherdata
* @throws {string}
* @return {false|string} - false, when unsuccessful or string (decrypted data)
* @return {false|string} false, when unsuccessful or string (decrypted data)
*/
function decryptOrPromptPassword(key, password, cipherdata)
{
@ -3619,13 +3631,14 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* decrypt the actual paste text
*
* @name PasteDecrypter.decryptOrPromptPassword
* @private
* @function
* @param {object} paste - paste data in object form
* @param {string} key
* @param {string} password
* @param {bool} ignoreError - ignore decryption errors iof set to true
* @return {bool} - whether action was successful
* @return {bool} whether action was successful
* @throws {string}
*/
function decryptPaste(paste, key, password, ignoreError)
@ -3656,12 +3669,13 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* decrypts any attachment
*
* @name PasteDecrypter.decryptAttachment
* @private
* @function
* @param {object} paste - paste data in object form
* @param {string} key
* @param {string} password
* @return {bool} - whether action was successful
* @return {bool} whether action was successful
* @throws {string}
*/
function decryptAttachment(paste, key, password)
@ -3698,12 +3712,13 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* decrypts all comments and shows them
*
* @name PasteDecrypter.decryptComments
* @private
* @function
* @param {object} paste - paste data in object form
* @param {string} key
* @param {string} password
* @return {bool} - whether action was successful
* @return {bool} whether action was successful
*/
function decryptComments(paste, key, password)
{
@ -3802,6 +3817,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* (controller) main PrivateBin logic
*
* @name Controller
* @param {object} window
* @param {object} document
* @class
@ -3840,7 +3856,6 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
Editor.show();
Editor.focusInput();
TopNav.loadDefaults();
TopNav.showCreateButtons();
Alert.hideLoading();
}
@ -3991,7 +4006,6 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
Model.init();
AttachmentViewer.init();
CryptTool.init();
DiscussionViewer.init();
Editor.init();
PasteDecrypter.init();

View file

@ -69,7 +69,7 @@ if ($MARKDOWN):
<?php
endif;
?>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-hGJxoiUhU8ByJ5Q8QsnfUzrb202C8og2STIg8P/y+ZgEo7zUOZSSRvH9JT6p9TnEmgulqaLOZ16sQBBpLaTdpQ==" crossorigin="anonymous"></script>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-GOaX9dYEiAHPJo3ce3YLGURq41BlQGBEeCVbeZ6EpDqKDaJDdPgNf5eYrRSAmEF+ZgkVbv3j5H6gbY5kDDSlcQ==" crossorigin="anonymous"></script>
<!--[if lt IE 10]>
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
<![endif]-->

View file

@ -47,7 +47,7 @@ if ($MARKDOWN):
<?php
endif;
?>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-hGJxoiUhU8ByJ5Q8QsnfUzrb202C8og2STIg8P/y+ZgEo7zUOZSSRvH9JT6p9TnEmgulqaLOZ16sQBBpLaTdpQ==" crossorigin="anonymous"></script>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-GOaX9dYEiAHPJo3ce3YLGURq41BlQGBEeCVbeZ6EpDqKDaJDdPgNf5eYrRSAmEF+ZgkVbv3j5H6gbY5kDDSlcQ==" crossorigin="anonymous"></script>
<!--[if lt IE 10]>
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
<![endif]-->