summaryrefslogtreecommitdiff
path: root/frontend/gamma
authorGiulio Cesare Solaroli <giulio.cesare@clipperz.com>2011-10-02 23:56:18 (UTC)
committer Giulio Cesare Solaroli <giulio.cesare@clipperz.com>2011-10-02 23:56:18 (UTC)
commitef68436ac04da078ffdcacd7e1f785473a303d45 (patch) (unidiff)
treec403752d66a2c4775f00affd4fa8431b29c5b68c /frontend/gamma
parent597ecfbc0249d83e1b856cbd558340c01237a360 (diff)
downloadclipperz-ef68436ac04da078ffdcacd7e1f785473a303d45.zip
clipperz-ef68436ac04da078ffdcacd7e1f785473a303d45.tar.gz
clipperz-ef68436ac04da078ffdcacd7e1f785473a303d45.tar.bz2
First version of the newly restructured repository
Diffstat (limited to 'frontend/gamma') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/css/clipperz/clipperz.css4520
-rw-r--r--frontend/gamma/css/clipperz/compact.css162
-rw-r--r--frontend/gamma/css/clipperz/iPhone.css464
-rw-r--r--frontend/gamma/css/clipperz/ie.css356
-rw-r--r--frontend/gamma/graphics/CoverActions.opacitybin0 -> 25547 bytes
-rw-r--r--frontend/gamma/graphics/Features.opacitybin0 -> 140849 bytes
-rw-r--r--frontend/gamma/graphics/GridSorting.opacitybin0 -> 14681 bytes
-rw-r--r--frontend/gamma/graphics/Logo.opacitybin0 -> 10647 bytes
-rw-r--r--frontend/gamma/graphics/Marks.opacitybin0 -> 25340 bytes
-rw-r--r--frontend/gamma/graphics/RegisterButton.opacitybin0 -> 44806 bytes
-rw-r--r--frontend/gamma/graphics/Star.opacitybin0 -> 16210 bytes
-rw-r--r--frontend/gamma/graphics/Tips.opacitybin0 -> 46046 bytes
-rw-r--r--frontend/gamma/html/exitPage_template.html140
-rw-r--r--frontend/gamma/html/index_template.html62
-rw-r--r--frontend/gamma/html/mobile_template.html87
-rw-r--r--frontend/gamma/js/Bookmarklet.js801
-rw-r--r--frontend/gamma/js/BookmarkletHash.js47
-rw-r--r--frontend/gamma/js/Bookmarklet_1.js400
-rw-r--r--frontend/gamma/js/Bookmarklet_2.js767
-rw-r--r--frontend/gamma/js/Bookmarklet_IE.js23
-rw-r--r--frontend/gamma/js/Clipperz/Async.js707
-rw-r--r--frontend/gamma/js/Clipperz/Base.js531
-rw-r--r--frontend/gamma/js/Clipperz/ByteArray.js1501
-rw-r--r--frontend/gamma/js/Clipperz/CSVProcessor.js349
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/AES.js869
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/Base.js1852
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/BigInt.js1760
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js1649
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js550
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js526
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js67
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js386
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js239
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/PRNG.js855
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/RSA.js151
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/SHA.js301
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/SRP.js331
-rw-r--r--frontend/gamma/js/Clipperz/DOM.js139
-rw-r--r--frontend/gamma/js/Clipperz/Date.js305
-rw-r--r--frontend/gamma/js/Clipperz/KeePassExportProcessor.js196
-rw-r--r--frontend/gamma/js/Clipperz/KeyValueObjectStore.js176
-rw-r--r--frontend/gamma/js/Clipperz/Logging.js42
-rw-r--r--frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js196
-rw-r--r--frontend/gamma/js/Clipperz/PM/Connection.js619
-rw-r--r--frontend/gamma/js/Clipperz/PM/Crypto.js513
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js1076
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js125
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js107
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js203
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js551
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js357
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js167
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js336
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.js881
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js187
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js128
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js53
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js705
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.js817
-rw-r--r--frontend/gamma/js/Clipperz/PM/Date.js201
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy.js172
-rwxr-xr-xfrontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js94
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js811
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js67
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js167
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings.js295
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js389
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js390
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js1341
-rw-r--r--frontend/gamma/js/Clipperz/PM/Toll.js194
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js120
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js208
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js209
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js237
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js1719
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js310
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js68
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js65
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js280
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js391
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js438
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js403
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js153
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js156
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js163
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js611
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js108
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js64
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js91
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js164
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js140
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js73
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js282
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js69
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js216
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js170
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js267
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js143
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js188
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js31
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js59
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js148
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js78
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js109
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js881
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js182
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js190
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js203
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js71
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js111
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js72
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js70
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js90
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js168
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js481
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js179
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js271
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js89
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js262
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js68
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js92
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js203
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js206
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js155
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js430
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js71
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js71
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js184
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js164
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js324
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js193
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js53
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js113
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js184
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js346
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js329
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js652
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js207
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js611
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js145
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js158
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js374
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js259
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js218
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js469
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js166
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js204
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js181
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js372
-rw-r--r--frontend/gamma/js/Clipperz/Set.js167
-rw-r--r--frontend/gamma/js/Clipperz/Signal.js71
-rw-r--r--frontend/gamma/js/Clipperz/Style.js94
-rw-r--r--frontend/gamma/js/Clipperz/Visual.js368
-rw-r--r--frontend/gamma/js/Clipperz/YUI/DomHelper.js481
-rw-r--r--frontend/gamma/js/Clipperz/YUI/DomQuery.js714
-rw-r--r--frontend/gamma/js/Clipperz/YUI/Utils.js98
-rw-r--r--frontend/gamma/js/JSON/json2.js481
-rw-r--r--frontend/gamma/js/MochiKit/Async.js640
-rw-r--r--frontend/gamma/js/MochiKit/Base.js1452
-rw-r--r--frontend/gamma/js/MochiKit/Color.js832
-rw-r--r--frontend/gamma/js/MochiKit/DOM.js1144
-rw-r--r--frontend/gamma/js/MochiKit/DateTime.js173
-rw-r--r--frontend/gamma/js/MochiKit/DragAndDrop.js766
-rw-r--r--frontend/gamma/js/MochiKit/Format.js309
-rw-r--r--frontend/gamma/js/MochiKit/Iter.js790
-rw-r--r--frontend/gamma/js/MochiKit/Logging.js262
-rw-r--r--frontend/gamma/js/MochiKit/LoggingPane.js327
-rw-r--r--frontend/gamma/js/MochiKit/MochiKit.js136
-rw-r--r--frontend/gamma/js/MochiKit/MockDOM.js115
-rw-r--r--frontend/gamma/js/MochiKit/Position.js218
-rw-r--r--frontend/gamma/js/MochiKit/Selector.js387
-rw-r--r--frontend/gamma/js/MochiKit/Signal.js888
-rw-r--r--frontend/gamma/js/MochiKit/Sortable.js569
-rw-r--r--frontend/gamma/js/MochiKit/Style.js558
-rw-r--r--frontend/gamma/js/MochiKit/Test.js144
-rw-r--r--frontend/gamma/js/MochiKit/Text.js577
-rw-r--r--frontend/gamma/js/MochiKit/Visual.js1975
-rw-r--r--frontend/gamma/js/MochiKit/__package__.js18
-rw-r--r--frontend/gamma/js/main.js109
-rw-r--r--frontend/gamma/js/main_iPhone.js60
-rw-r--r--frontend/gamma/properties/creditsAndCopyrights.txt336
-rw-r--r--frontend/gamma/properties/gamma.properties.json189
-rw-r--r--frontend/gamma/properties/mobile.properties.json119
-rw-r--r--frontend/gamma/tests/SimpleTest/SimpleTest.Async.js169
-rw-r--r--frontend/gamma/tests/SimpleTest/SimpleTest.js424
-rw-r--r--frontend/gamma/tests/SimpleTest/TestRunner.js233
-rw-r--r--frontend/gamma/tests/SimpleTest/test.css28
-rwxr-xr-xfrontend/gamma/tests/index.html56
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css201
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Fail.html113
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Twitter.html113
-rwxr-xr-xfrontend/gamma/tests/tests/Bookmarklet/ZeroClipboard.swfbin0 -> 1071 bytes
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/background.pngbin0 -> 10335 bytes
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/close.pngbin0 -> 3984 bytes
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/close_selected.pngbin0 -> 3995 bytes
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/copy.pngbin0 -> 5241 bytes
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/copy_selected.pngbin0 -> 5169 bytes
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/error.pngbin0 -> 4682 bytes
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/hint.pngbin0 -> 3999 bytes
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/index.html42
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/info.pngbin0 -> 4781 bytes
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Async.html53
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Async.test.js687
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Base.html55
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Base.test.js367
-rw-r--r--frontend/gamma/tests/tests/Clipperz/ByteArray.html71
-rw-r--r--frontend/gamma/tests/tests/Clipperz/ByteArray.test.js893
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/AES.html292
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html344
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/Base.html428
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html478
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html155
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html209
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html183
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html496
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html160
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html70
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js418
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html117
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html90
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html175
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js84
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html161
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html122
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/index.html58
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js1577
-rw-r--r--frontend/gamma/tests/tests/Clipperz/DOM.html58
-rw-r--r--frontend/gamma/tests/tests/Clipperz/DOM.test.js82
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Date.html54
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Date.test.js66
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js910
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html59
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js141
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html52
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js255
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html59
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js132
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js841
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.html71
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js255
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto.html281
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html153
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html169
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html103
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js195
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js33
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html66
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js225
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html105
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js198
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html98
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js1285
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js1941
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js172
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html106
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js2082
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html47
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Date.html59
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Date.test.js90
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Proxy.html65
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js117
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Toll.html62
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js202
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html64
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js90
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html46
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html45
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/index.html45
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/index.html56
-rw-r--r--frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html210
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Set.html54
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Set.test.js165
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index.html49
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index_googleCode.html50
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index_testECC.html50
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js238
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js1881
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js128
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/index.html133
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js977
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js127
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/index.html117
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/README.txt1
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/User.data.js1044
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/index.html243
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/main_test.js114
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js119
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js102
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/User.data.js977
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/index.html135
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/test.css43
-rw-r--r--frontend/gamma/tests/tests/Components/ProgressBar/index.html120
-rw-r--r--frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js125
-rw-r--r--frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html115
-rw-r--r--frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js95
-rw-r--r--frontend/gamma/tests/tests/Components/Tooltips/index.html143
-rw-r--r--frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js117
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js977
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/index.html117
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js136
-rw-r--r--frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js66
-rw-r--r--frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html73
-rw-r--r--frontend/gamma/tests/tests/index.html48
303 files changed, 95919 insertions, 0 deletions
diff --git a/frontend/gamma/css/clipperz/clipperz.css b/frontend/gamma/css/clipperz/clipperz.css
new file mode 100644
index 0000000..dba4d57
--- a/dev/null
+++ b/frontend/gamma/css/clipperz/clipperz.css
@@ -0,0 +1,4520 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29/* @override
30 https://www.example.com/DEVELOPMENT/css/clipperz.css
31 http://www.example.com/DEVELOPMENT/css/clipperz.css
32 https://www.clipperz.com/gamma/css/clipperz.css
33 https://www.example.com/iPHONE/css/clipperz.css
34*/
35
36/*
37Color list:
38- login box:
39 light#ff9955
40 dark#ff6622
41- login button:
42 regular#dd5500
43 hover#773311
44- login translations:
45 box: #cc6622;
46 not-selected:
47 color: #ddaa99
48 background:#994422
49 selected: #772211;
50
51*/
52
53html {
54 height: 100%;
55}
56
57body {
58 /*margin-left: 15px; margin-right: 15px;*/
59 font-family: Helvetica, Arial, Geneva, sans-serif;
60 margin: 0px;
61/*
62 min-width: 600px;
63*/
64 height: 100%;
65}
66
67img.favicon {
68 height: 16px;
69 width: 16px;
70}
71
72/* @group Misc */
73
74.clear {
75 clear: both;
76}
77
78.hidden_none {
79 display: none;
80 visibility: hidden;
81}
82
83.keepTogether {
84 display: inline-block;
85 white-space: nowrap;
86}
87
88body.ext-gecko .keepTogether {
89 display: -moz-inline-box;
90 }
91
92/* @end */
93
94/* @group Loading */
95
96div#loading {
97 margin-left: auto;
98 margin-right: auto;
99 text-align: center;
100 margin-top: 60px;
101 width: 200px;
102}
103
104div#loading img {
105 border: 0px;
106}
107
108div#loading h5 {
109 font-size: 16pt;
110 padding: 0px;
111 color: #333366;
112}
113
114div#loading h2 {
115 padding-left: 20px;
116 color: #ff9200;
117}
118
119
120/* @end */
121
122/* @group Login page */
123
124/* @group Header */
125
126div.pageHeader {
127 background-color: #1f2148;
128 min-width: 1013px;
129}
130
131div#logoFrame {
132 padding: 16px 16px 60px 16px;
133 min-height: 44px;
134}
135
136
137div#logoFrame div#logo {
138 background: url(../images/old/logo.png);
139 width: 150px;
140 height: 39px;
141}
142
143
144div#loading div#logo {
145 background: url(../images/old/logo_blue.png);
146 width: 193px;
147 height: 58px;
148 display: block;
149}
150
151h5.clipperzPayoff {
152 color: white;
153 font-size: 13pt;
154 font-weight: normal;
155 padding-left: 20px;
156 white-space: nowrap;
157 margin: 0px;
158 padding-left: 4px;
159}
160
161
162/* @group Misc links */
163
164div#miscLinks {
165 float: right;
166}
167
168div#miscLinks ul {
169 margin: 12px 0px 0px;
170 padding: 15px;
171}
172
173div#miscLinks ul li {
174 display: inline;
175 margin: 0px; padding: 0px; border: 0px;
176}
177
178div#miscLinks ul li a {
179/*
180 color: #ccccff;
181*/
182 color: white;
183 margin: 0px; padding: 0px; border: 0px;
184 font-weight: normal;
185 text-decoration: none;
186 font-size: 12pt;
187 border-left: 1px solid #45486b;
188 padding: 15px;
189 margin: 0px;
190 min-width: 70px;
191}
192
193div#miscLinks ul li a#donateHeaderLink {
194 border-left: 0px;
195}
196
197div#miscLinks ul li a:hover {
198 color: #ff9200;
199}
200
201
202
203/* @end */
204
205
206/* @group Features Tabs */
207#featureTabs table {
208 width: 100%;
209 padding: 6px;
210 padding-bottom: 46px;
211}
212
213#featureTabs table tr td {
214 width: 25%;
215 vertical-align: top;
216 font-size: 11pt;
217 color: white;
218}
219
220#featureTabs table tr td img {
221 float: left;
222}
223
224#featureTabs table tr td span {
225 display: block;
226 padding: 5 10 5 85;
227}
228
229div#featureTabs canvas.featureIcon {
230 width: 76px;
231 height: 76px;
232 display: block;
233 float: left;
234
235 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
236 background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
237
238 -webkit-border-radius: 38px;
239 -moz-border-radius: 38px;
240 border-radius: 38px;
241}
242/*
243div#featureTabs div.featureIcon.storeIcon {
244 background-image: url(../images/old/home/features/store.png);
245}
246
247div#featureTabs div.featureIcon.protectIcon {
248 background-image: url(../images/old/home/features/protect.png);
249}
250
251div#featureTabs div.featureIcon.directLoginIcon {
252 background-image: url(../images/old/home/features/directLogin.png);
253}
254
255div#featureTabs div.featureIcon.shareIcon {
256 background-image: url(../images/old/home/features/share.png);
257}
258*/
259/*
260./images/home/features/store.png
261./images/home/features/protect.png
262./images/home/features/directLogin.png
263./images/home/features/share.png
264*/
265
266/* @end */
267
268/* @group Feature bullets */
269
270div#featurePoints {
271 min-width: 400px;
272 padding-left: 20px;
273 padding-right: 330px;
274 padding-top: 15px;
275 padding-bottom: 20px;
276}
277
278div#featurePoints table tbody tr td {
279 width: 50%;
280 vertical-align: top;
281}
282
283div#featurePoints table tbody tr td.separator {
284 width: 1px;
285 border-left: 1px solid #bebebe;
286}
287
288div#featurePoints div.block {
289 padding: 10px;
290 color: #8e8e8e;
291}
292
293div#featurePoints div.block h3 {
294 font-weight: normal;
295 font-size: 12pt;
296 margin: 0px;
297 padding: 5px 0px;
298}
299
300div#featurePoints div.block ul {
301 margin: 0px;
302 margin-left: 20px;
303 padding: 0px;
304 list-style-position: outside;
305 list-style-image: url(../images/old/home/features/bullet.png);
306}
307
308div#featurePoints div.block ul li {
309 font-size: 10pt;
310 padding: 3px 0px;
311}
312
313/* @end */
314
315
316
317/* @end */
318
319/* @group Login box */
320
321div#loginBox {
322 width: 273px;
323 /* z-index: 40000;*/
324 z-index: 19000;
325 position: relative;
326 top: -30px;
327 right: 30px;
328 float: right;
329}
330
331div#loginBox div.header {
332 height: 25px;
333 width: 273px;
334 /* background-image: url(../images/old/home/box/box_top.png);*/
335 /* background-color: #fe965f;*/
336 background-color: #ff9955;
337
338 -webkit-border-top-left-radius: 20px;
339 -webkit-border-top-right-radius: 20px;
340 -moz-border-radius-topleft: 20px;
341 -moz-border-radius-topright: 20px;
342 border-top-left-radius: 20px;
343 border-top-right-radius: 20px;
344}
345
346div#loginBox div.body {
347 background-color: #ff9955;
348
349 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
350 background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
351
352 /*background: url(../images/old/home/box/box_body.png) repeat-x; */
353}
354
355div#loginBox div.body h3.loading {
356 margin: 0px;
357 text-align: center;
358 padding-top: 60px;
359 color: white;
360 font-size: 30pt;
361 padding-left: 20px;
362}
363
364div#loginBox div.footer {
365 height: 37px;
366 width: 273px;
367 /* background-image: url(../images/old/home/box/box_bottom.png);*/
368 background-color: #ff6622;
369
370 -webkit-border-bottom-left-radius: 20px;
371 -webkit-border-bottom-right-radius: 20px;
372 -moz-border-radius-bottomleft: 20px;
373 -moz-border-radius-bottomright: 20px;
374 border-bottom-left-radius: 20px;
375 border-bottom-right-radius: 20px;
376}
377
378/* @group Login form */
379
380div#loginBox h4 {
381 color: white;
382 font-size: 16pt;
383 font-weight: normal;
384 padding-left: 20px;
385 margin: 0px;
386}
387
388div#loginBox form.loginForm {
389 padding: 5px 20px 0px;
390 margin-bottom: 0px;
391}
392
393div#loginBox form.loginForm label {
394 color: white;
395 font-size: 10pt;
396 display: block;
397 padding-top: 5px;
398}
399
400div#loginBox form.loginForm input {
401 width: 230px;
402 font-size: 14pt;
403 border: 1px solid #bb4924;
404 color: #333366;
405 background-color: white;
406 padding: 2px 5px;
407 height: 28px;
408}
409
410div#loginBox form.loginForm label.checkbox {
411 display: inline;
412}
413
414div#loginBox form.loginForm .checkbox:hover {
415 cursor: pointer;
416}
417
418div#loginBox form.loginForm input.checkbox {
419 margin: 10px 8px 0px 0px;
420 height: auto;
421 width: auto;
422 border: 0px;
423}
424
425div#loginBox form.loginForm ul {
426 list-style-type: none;
427 padding: 0px;
428 margin: 0px;
429}
430
431div#loginBox form.loginForm ul li {
432 display: block;
433}
434
435div#loginBox form.loginForm input.otp {
436 width: 57px;
437 display: inline;
438 padding-left: 0px;
439 padding-right: 0px;
440 height: 28px;
441 font: 8pt monospace;
442}
443
444
445
446div#loginBox form.loginForm input.submit {
447 margin: 0px 45px;
448 width: 140px;
449 border: 1px solid white;
450 color: white;
451 background-color: #dd5500;
452 padding: 6px;
453 font-size: 12pt;
454 height: auto;
455}
456
457div#loginBox form.loginForm input.submit:hover {
458 background-color: #773311;
459 color: white;
460 cursor: pointer;
461}
462
463
464/* @group language chooser */
465
466div#loginBox form.loginForm div.translations {
467 margin: 15px -20px;
468 background-color: #cc6622;
469}
470
471div#loginBox form.loginForm div.translations h4 {
472 font-size: 9pt;
473 padding: 6px 20px 0px;
474}
475
476div#loginBox form.loginForm div.translations ul {
477 margin: 0px;
478 padding: 5px 10px 10px;
479 margin-bottom: 15px;
480}
481
482div#loginBox form.loginForm div.translations ul li {
483 font-size: 8pt;
484 color: #ddaa99;
485 display: inline-block;
486 padding: 2px 4px;
487 background-color: #994422;
488 margin: 1px;
489}
490
491body.ext-gecko div#loginBox form.loginForm div.translations ul li {
492 display: -moz-inline-box;
493}
494
495div#loginBox form.loginForm div.translations ul li.selected {
496 background-color: #772211;
497 color: white;
498}
499
500div#loginBox form.loginForm div.translations ul li.selected:hover {
501 cursor: default;
502}
503
504div#loginBox form.loginForm div.translations ul li:hover {
505 cursor: pointer;
506 color: white;
507}
508
509/* @end */
510
511/* @end */
512
513/* @end */
514
515/* @group Create/Look/Offline */
516
517div.activeFeatures {
518 float: left;
519 margin-left: 20px;
520 height: 100px;
521}
522
523div.activeFeatures a {
524 display: inline-block;
525
526 padding-left: 46px;
527 color: #ff5906;
528 text-decoration: none;
529 font-size: 10pt;
530}
531
532
533div.activeFeatures .keepTogether a {
534 padding-left: 0px;
535}
536
537div.activeFeatures a span.payoff {
538 display: block;
539 font-size: 13pt;
540 font-weight: lighter;
541 color: #9b9689;
542 margin: 0px;
543 padding: 0px;
544}
545
546/*body.ext-gecko div.activeFeatures a {
547 display: -moz-inline-box;
548}*/
549div.activeFeatures a:hover span.payoff {
550 color: #666666;
551}
552
553div.activeFeatures a:hover span.link {
554 /*font-weight: bold;*/
555}
556
557div.activeFeatures div.keepTogether div {
558 display: inline-block;
559 padding-right: 15px;
560}
561
562/*body.ext-gecko div.activeFeatures div.keepTogether div {
563 display: -moz-inline-box;
564}*/
565
566div.activeFeatures div.createAccountLink {
567 display: inline-block;
568 width: 282;
569 height: 65px;
570 /* background-image: url(../images/old/home/register.png);*/
571 margin-right: 20px;
572}
573
574/*body.ext-gecko div.activeFeatures div.createAccountLink {
575 display: -moz-inline-box;
576}*/
577
578div.activeFeatures a.createAccountLink {
579 position: relative;
580 top: -92px;
581 left: 5px;
582}
583
584div.activeFeatures div.createAccountLink a.createAccountLink span.payoff {
585 margin-top: 23px;
586 margin-left: 40px;
587 font-size: 17pt;
588 color: #64626c;
589}
590
591div.activeFeatures div.createAccountLink a.createAccountLink span.link {
592 padding-left: 40px;
593 padding-right: 50px;
594 padding-bottom: 10px;
595 font-size: 12pt;
596}
597
598div.activeFeatures div.createAccountLink:hover {
599 /*background-image: url(../images/old/home/register_selected.png);*/
600}
601
602div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff {
603 color: #54535a;
604}
605
606div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link {
607 color: white;
608}
609
610/*
611div.activeFeatures div.screenshotLink {
612 background: url(../images/old/home/look.png) no-repeat 0 -3px;
613}
614
615div.activeFeatures div.offlineLink {
616 background: url(../images/old/home/download.png) no-repeat 10px -4px;
617}
618*/
619
620div.createAccountLink canvas {
621 width: 282px;
622 height: 93px;
623}
624div.activeFeatures .keepTogether canvas {
625 width: 46px;
626 height: 46px;
627 vertical-align: bottom;
628}
629
630/* @end */
631
632
633
634/* @end */
635
636/* @group Footer */
637
638div.pageHeaderAndBody {
639 height: 100%;
640}
641
642body > div.pageHeaderAndBody {
643 height: auto; min-height: 100%;
644}
645
646div#pageBody {
647 min-width: 1013px;
648 padding-bottom: 90px;
649}
650
651
652
653div.pageFooter {
654 margin-top: -90px;
655 height: 90px;
656 clear: both;
657}
658
659div.footerWrapper {
660 clear: both;
661 padding-top: 10px;
662}
663div.footerContent {
664 background-color: #eaebe6;
665 padding: 20px;
666 font-size: 8pt;
667}
668
669/*div.pageFooter div.footerContent div.footerStarIcon {*/
670div.pageFooter div.footerContent canvas.footerStarIcon {
671 /* background-image: url(../images/old/footer/star.png);*/
672 width: 40px;
673 height: 40px;
674 float: left;
675}
676
677div.pageFooter div.footerContent span.copyright {
678 padding-left: 10px;
679 color: #a0a0a0;
680}
681
682div.pageFooter div.footerContent a {
683 padding-left: 50px;
684 display: block;
685 color: #888888;
686 font-weight: bold;
687 text-decoration: none;
688}
689
690div.pageFooter div.footerContent span.applicationVersion {
691 padding: 8px;
692 color: #888888;
693 background-color: #d2d2d2;
694 position: relative;
695 top: -40px;
696 float: right;
697}
698
699
700/* @end */
701
702/* @group Javascript Alert */
703
704div#javaScriptAlert div.mask {
705 position: fixed;
706 top: 0px;
707 left: 0px;
708 right: 0px;
709 bottom: 0px;
710
711 background-color: black;
712 z-index:1001;
713 -moz-opacity: 0.7;
714 opacity:.70;
715 filter: alpha(opacity=70);
716}
717
718 div#javaScriptAlert div.header {
719 height: 34px;
720 width: 468;
721 background-image: url(../images/old/alert/header.png);
722}
723
724 div#javaScriptAlert div.body {
725 background-image: url(../images/old/alert/body.png);
726 padding: 0px 20px 10px 20px;
727}
728/*
729div#javaScriptAlert div.body div.alert {
730 padding-left: 100px;
731 background: url(../images/old/alert/alert.png) no-repeat;
732}
733*/
734
735/*div#javaScriptAlert div.body img.alert {*/
736div#javaScriptAlert div.body div.alertLogo {
737 float: left;
738 background-image: url(../images/old/alert/alert.png);
739 width: 88px;
740 height: 88px;
741}
742
743div#javaScriptAlert div.body div.alert {
744 padding-left: 100px;
745}
746
747 div#javaScriptAlert div.footer {
748 height: 34px;
749 width: 468;
750 background-image: url(../images/old/alert/footer.png);
751}
752
753
754
755div#javaScriptAlert div.message {
756 position: relative;
757 top: -150px;
758 z-index:1002;
759/*
760 left: 100px;
761 right: 100px;
762*/
763 margin-left: auto;
764 margin-right: auto;
765 max-width: 468px;
766}
767
768div#javaScriptAlert div.message h1 {
769 font-size: 16pt;
770 margin: 0px;
771 color: #ff5930;
772}
773
774div#javaScriptAlert div.message p {
775 margin-top: 0px;
776 color: #999999;
777}
778
779div#javaScriptAlert div.message h3 {
780 font-size: 12pt;
781 margin-bottom: 0px;
782 color: #ff5930;
783}
784
785div#javaScriptAlert div.message h5 {
786 margin: 0px;
787 color: #999999;
788}
789
790/* @end */
791
792/* @group Components
793 */
794
795
796/* @group LoginProgress */
797
798div.LoginProgress {
799 position: relative;
800 left: -190px;
801 top: -100px;
802 width: 380px;
803 height: 200px;
804 /* background: url(../images/old/loginProgress/background.png);*/
805 background-color: #d7d7c0;
806 -webkit-border-radius: 20px;
807 -moz-border-radius: 20px;
808 border-radius: 20px;
809
810 -webkit-box-shadow: 5px 5px 7px rgba(0,0,0,0.6);
811 -moz-box-shadow: 5px 5px 7px rgba(0,0,0,0.6);
812 box-shadow: 5px 5px 7px rgba(0,0,0,0.6);
813}
814
815div.LoginProgress div.header {
816 height: 40px;
817}
818
819div.LoginProgress div.header h3 {
820 font-size: 12pt;
821 font-weight: normal;
822 margin: 0px;
823 color: #777777;
824 padding-top: 13px;
825 padding-left: 18px;
826}
827
828div.LoginProgress div.body {
829 height: 120px;
830 overflow: auto;
831 padding-left: 20px;
832 padding-right: 20px;
833
834 background-color: #f1f1e9;
835/*
836 margin-left: 19px;
837 margin-right: 18px;
838*/
839}
840
841div.LoginProgress div.body div.img {
842 margin: 10px;
843 width: 50px;
844 height: 50px;
845 float: left;
846}
847
848div.LoginProgress div.body div.img.ALERT {
849 /* background-image: url(../images/old/simpleMessageBox/Alert.png);*/
850 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
851 background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
852 -webkit-border-radius: 25px;
853 -moz-border-radius: 25px;
854 border-radius: 25px;
855
856}
857
858div.LoginProgress div.body div.img.ALERT canvas {
859 width: 50px;
860 height: 50px;
861 /*background-image: url(../images/old/simpleMessageBox/excalmationPoint.png); */
862}
863
864div.LoginProgress div.body div.loadingBar {
865 position: relative;
866 top: 51px;
867 left: 60px;
868}
869
870div.LoginProgress div.body div.errorBox p {
871 color: #787872;
872 padding-top: 20px;
873 padding-left: 80px;
874}
875
876div.LoginProgress div.footer {
877 margin-left: 19px;
878 margin-right: 18px;
879}
880
881div.LoginProgress div.footer a {
882 text-decoration: none;
883 text-align: center;
884 color: #787872;
885 display: block;
886 font-weight: bold;
887 font-size: 11pt;
888 width: 100px;
889 margin-top: 11px;
890 margin-left: auto;
891 margin-right: auto;
892}
893
894div.LoginProgress div.footer div.button.default {
895 text-decoration: underline;
896}
897
898div.LoginProgress div.buttonArea {
899 text-align: center;
900}
901
902div.LoginProgress div.button {
903 display: inline-block;
904}
905
906div.LoginProgress div.footer a:hover {
907 color: #515247;
908}
909
910
911
912/* @end */
913
914/* @group SimpleMessagePanel */
915
916div.SimpleMessagePanel {
917 position: relative;
918 left: -225px;
919 top: -70px;
920 width: 450px;
921 height: 140px;
922/*
923 background: url(../images/old/loginProgress/background.png);
924*/
925}
926
927div.SimpleMessagePanel div.header {
928 height: 17px;
929 background: url(../images/old/simpleMessageBox/background_header.png) no-repeat;
930}
931
932div.SimpleMessagePanel div.body {
933/*
934 height: 120px;
935 overflow: auto;
936 margin-left: 19px;
937 margin-right: 18px;
938*/
939 background: url(../images/old/simpleMessageBox/background_body.png) repeat-y;
940 padding-left: 25px;
941 padding-right: 25px;
942 padding-top: 10px;
943}
944
945div.SimpleMessagePanel div.body h3 {
946 font-size: 14pt;
947 font-weight: normal;
948 margin: 0px;
949 padding-top: 4px;
950 color: #787872;
951}
952
953div.SimpleMessagePanel div.body div.img {
954 width: 66px;
955 height: 60px;
956 float: left;
957}
958
959div.SimpleMessagePanel div.body p {
960 margin: 0;
961 font-size: 10pt;
962 font-weight: normal;
963 color: #787872;
964 padding-top: 10px;
965 padding-bottom: 5px;
966 line-height: 1.3;
967}
968
969div.SimpleMessagePanel div.body div.img.ALERT {
970 background: url(../images/old/simpleMessageBox/Alert.png) no-repeat;
971}
972
973div.SimpleMessagePanel div.body div.img.INFO {
974 background: url(../images/old/simpleMessageBox/Info.png) no-repeat;
975}
976
977div.SimpleMessagePanel div.body div.buttonArea {
978 height: 40px;
979 clear: both;
980}
981
982div.SimpleMessagePanel div.body div.buttonArea > div {
983 float: right;
984 margin-left: 15px;
985 margin-top: 10px;
986}
987
988div.SimpleMessagePanel div.footer {
989 height: 25px;
990 background: url(../images/old/simpleMessageBox/background_footer.png) no-repeat;
991}
992
993div.SimpleMessagePanel div.passphrase {
994 padding-left: 65px;
995}
996
997div.SimpleMessagePanel div.passphrase input {
998 width: 250px;
999 font-size: 14pt;
1000 border: 1px solid #bb4924;
1001 color: #333366;
1002 background-color: white;
1003 padding: 2px 5px;
1004 height: 28px;
1005}
1006
1007div.SimpleMessagePanel div.progressBarWrapper {
1008 margin-left: 80px;
1009}
1010
1011/* @end */
1012
1013/* @group Button */
1014
1015div.button_wrapper {
1016 height: 32px;
1017 background: url(../images/old/button/default_left.png) no-repeat;
1018 cursor: pointer;
1019}
1020
1021div.button_wrapper.hover {
1022 background: url(../images/old/button/hover_left.png) no-repeat;
1023}
1024
1025div.button_wrapper.clicked {
1026 background: url(../images/old/button/clicked_left.png) no-repeat;
1027}
1028
1029div.button_bodyWrapper {
1030 height: 32px;
1031 margin-left: 6px;
1032 padding-right: 6px;
1033 background: url(../images/old/button/default_main.png) repeat-x right 0;
1034}
1035
1036div.button_wrapper.hover div.button_bodyWrapper {
1037 background: url(../images/old/button/hover_main.png) repeat-x right 0;
1038}
1039
1040div.button_wrapper.clicked div.button_bodyWrapper {
1041 background: url(../images/old/button/clicked_main.png) repeat-x right 0;
1042}
1043
1044div.button_body {
1045 text-align: center;
1046 min-width: 60px;
1047 padding: 0px 7px;
1048 padding-top: 8px;
1049}
1050
1051div.button_body span {
1052 font-size: 11pt;
1053 color: white;
1054}
1055
1056div.button_wrapper.default div.button_body span {
1057 font-weight: bold;
1058}
1059
1060/*
1061div.button_footer {
1062 margin: 0px;
1063 height: 31px;
1064 width: 6px;
1065 background: green url(../images/old/button/default_right.png) no-repeat;
1066}
1067*/
1068/* @end */
1069
1070/* @group Password enthropy */
1071
1072input.entropyLevelIndicator {
1073 background: url(../images/old/passwordField/background.png) no-repeat 0 26px;
1074}
1075
1076div.passwordEntropyWrapper {
1077 padding: 0px;
1078 border: 1px solid #bb4924;
1079 border-top: 0px;
1080 margin-bottom: 4px;
1081 background-color: white;
1082 margin-right: 3px;
1083 margin-top: -2;
1084}
1085
1086div.passwordEntropy {
1087 height: 4px;
1088 font-size: 1pt;
1089 background: url(../images/old/entropyBackground.gif) repeat-x 0 0;
1090 line-height: 3px;
1091}
1092
1093
1094
1095/* @end */
1096
1097
1098
1099/* @end */
1100
1101/* @group Main page */
1102
1103/* @group User Info Box */
1104
1105div.userInfoBox {
1106 position: absolute;
1107 width: 160px;
1108 height: 120px;
1109
1110 top: 100px;
1111 left: 15px;
1112 /*background-image: url(../images/old/main/userInfoBackground.png); */
1113
1114 background-color: #ff9955;
1115 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723), color-stop(1,#333333));
1116 background: -moz-linear-gradient(0% 100% 90deg,#ff6723, #ff9a56);
1117
1118 -webkit-border-radius: 10px;
1119 -moz-border-radius: 10px;
1120 border-radius: 10px;
1121
1122 -webkit-box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
1123 -moz-box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
1124 box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
1125
1126 color: white;
1127}
1128
1129div.userInfoBox div.body {
1130 padding: 0px 12px;
1131}
1132
1133div.userInfoBox div.header {
1134 height: 30px;
1135}
1136
1137div.userInfoBox div.header h1 {
1138 font-size: 8pt;
1139 font-weight: normal;
1140 margin: 0px;
1141 padding-top: 12px;
1142 padding-left: 12px;
1143}
1144
1145div.userInfoBox div.header a.lockButton {
1146 position: absolute;
1147 top: 8px;
1148 right: 12px;
1149 display: block;
1150 width: 15px;
1151 height: 20px;
1152 text-decoration: none;
1153 background: url(../images/old/lock/unlocked.png) no-repeat -5px -2px;
1154}
1155
1156div.userInfoBox div.header a.lockButton:hover {
1157 background: url(../images/old/lock/unlocked_hover.png) no-repeat -5px -2px;
1158}
1159
1160div.userInfoBox.locked {
1161 z-index:19001;
1162}
1163
1164div.modalDialogMask.userInfoBoxMask {
1165 -moz-opacity: 0.0;
1166 opacity: .0;
1167 filter: alpha(opacity=0);
1168 z-index:19000;
1169}
1170
1171div.userInfoBox.locked div.header a.lockButton {
1172 background: url(../images/old/lock/locked.png) no-repeat -5px -2px;
1173}
1174
1175div.userInfoBox.locked div.header a.lockButton:hover {
1176 background: url(../images/old/lock/locked_hover.png) no-repeat -5px -2px;
1177}
1178
1179div.userInfoBox div.body h3 {
1180 font-size: 11pt;
1181 font-weight: bold;
1182 margin: 0px;
1183}
1184
1185div.userInfoBox div.body ul {
1186 /* #####*/
1187 list-style-image: url(../images/old/main/userInfoBullet.png);
1188 font-size: 8pt;
1189 padding: 0px;
1190 margin: 4px 0px;
1191 list-style-position: inside;
1192 text-shadow: #000000 0 0 0;
1193}
1194
1195div.userInfoBox div.body ul li span.number {
1196 font-weight: bold;
1197 padding-right: 3px;
1198}
1199
1200div.userInfoBox div.body a {
1201 display: block;
1202 margin-top: 8
1203 px;
1204 border-top: 1px solid white;
1205 padding-top: 6px;
1206 font-size: 10pt;
1207 font-weight: bold;
1208 color: #d15a22;
1209 text-decoration: none;
1210 border-color: #fe9a5f;
1211}
1212
1213div.userInfoBox div.body a:hover {
1214 color: #8c3b15;
1215}
1216
1217div.userInfoBox.locked div.body a {
1218 display: none;
1219}
1220
1221/* @end */
1222
1223
1224/* @group Message Box */
1225
1226div.messageBox {
1227 position: absolute;
1228 width: 409px;
1229 height: 29px;
1230 top: 23px;
1231 left: 204px;
1232 background: url(../images/old/main/messageBoxBackground.png);
1233}
1234
1235div.messageBox h3 {
1236 display: inline-block;
1237 color: #342f6b;
1238 font-weight: bold;
1239 margin: 7px 2px 0px 12px;
1240 font-size: 10pt;
1241
1242}
1243
1244body.ext-gecko div.messageBox h3 {
1245 display: -moz-inline-box;
1246}
1247
1248div.messageBox h1 {
1249 color: #342f6b;
1250 display: inline;
1251 font-weight: normal;
1252 margin: 0px 1px;
1253 font-size: 9pt;
1254}
1255
1256div.messageBox a {
1257 display: block;
1258 width: 20px;
1259 height: 20px;
1260 float: right;
1261 position: absolute;
1262 right: 5px;
1263 top: 4px;
1264 background-image: url(../images/old/main/messageBoxCloseButton.png);
1265}
1266
1267div.messageBox a:hover {
1268 background-image: url(../images/old/main/messageBoxCloseButtonActive.png);
1269}
1270
1271/* @end */
1272
1273/* @group Side panels */
1274
1275div.sidePanels {
1276/*
1277 position: relative;
1278 top: 110px;
1279*/
1280 float: left;
1281 margin-top: 106px;
1282 margin-left: 20px;
1283 width: 160px;
1284
1285}
1286
1287/* @group Tab Side Panel */
1288
1289div.tabSidePanel {
1290 margin-right: -10px;
1291/*
1292 position: absolute;
1293 width: 250px;
1294 height: 250px;
1295 top: 250px;
1296 left: 10px;
1297*/
1298}
1299
1300div.tabSidePanel ul {
1301 margin: 0px;
1302 padding-left: 0px;
1303 list-style-type: none;
1304 color: #f78b46;
1305}
1306
1307/* @group Main tabs */
1308
1309div.tabSidePanel ul.mainTabs {
1310 margin: 0px;
1311}
1312
1313div.tabSidePanel ul.mainTabs li {
1314 /*margin-bottom: 6px;*/
1315}
1316
1317div.tabSidePanel ul.mainTabs li a {
1318 display: block;
1319 line-height: 30px;
1320 height: 43px;
1321 padding-left: 40px;
1322 color: #ff6621;
1323 margin: 0px;
1324 font-weight: normal;
1325 font-size: 13pt;
1326 text-decoration: none;
1327}
1328
1329div.tabSidePanel ul.mainTabs li div.selectionHighlighter {
1330 display: none;
1331}
1332
1333div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter {
1334 display: block;
1335 position: absolute;
1336 left: 154px;
1337 margin-top: -43px;
1338}
1339
1340/*
1341div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter div.selectionHighlighterIcon {
1342 background-image: url(../images/main/tabs/selectionHighligher.png);
1343 width: 50px;
1344 height: 34px;
1345 float: left;
1346 z-index: 35000;
1347 border: 1px solid red;
1348}
1349*/
1350
1351div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add {
1352 font-size: 14pt;
1353 font-weight: bold;
1354 position: relative;
1355 top: -34px;
1356 right: 16px;
1357 background: none;
1358 color: #c0531b;
1359 padding-left: 15px;
1360}
1361
1362div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add:hover {
1363 color: white;
1364}
1365
1366div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add span {
1367 font-size: 8pt;
1368 vertical-align: middle;
1369}
1370
1371div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add h3 {
1372 display: inline;
1373 padding-left: 5px;
1374}
1375
1376div.tabSidePanel ul.mainTabs li.cards.selected a {
1377 margin-left: -10px;
1378 padding-left: 50px;
1379 color: white;
1380 background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px;
1381}
1382
1383div.tabSidePanel ul.mainTabs li.cards.selected a:hover {
1384 background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px;
1385}
1386
1387div.tabSidePanel ul.mainTabs li.cards a {
1388 background: url(../images/old/main/tabs/cardsBackground.png) -19px -63px;
1389}
1390
1391div.tabSidePanel ul.mainTabs li.cards a:hover {
1392 background: url(../images/old/main/tabs/cardsBackground.png) -19px -110px;
1393}
1394
1395
1396
1397div.tabSidePanel ul.mainTabs li.directLogins.selected a {
1398 margin-left: -10px;
1399 padding-left: 50px;
1400 color: white;
1401 /* background: url(../images/old/main/tabs/directLoginBackground.png) 0 -1px;*/
1402 background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px;
1403}
1404
1405div.tabSidePanel ul.mainTabs li.directLogins.selected a:hover {
1406 color: white;
1407 /* background: url(../images/old/main/tabs/directLoginBackground.png) 0 -1px;*/
1408 background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px;
1409}
1410
1411div.tabSidePanel ul.mainTabs li.directLogins a {
1412 /* background: url(../images/old/main/tabs/directLoginBackground.png) 0 -34px;*/
1413 background: url(../images/old/main/tabs/directLoginBackground.png) -19px -63px;
1414}
1415
1416div.tabSidePanel ul.mainTabs li.directLogins a:hover {
1417 /* background: url(../images/old/main/tabs/directLoginBackground.png) 0 -67px;*/
1418 background: url(../images/old/main/tabs/directLoginBackground.png) -19px -110px;
1419}
1420
1421
1422
1423
1424
1425/* @end */
1426
1427/* @group Other tabs */
1428
1429div.tabSidePanel ul.otherTabs {
1430 margin: 10px 0px;
1431}
1432
1433div.tabSidePanel ul.otherTabs li {
1434 margin-top: -4px;
1435}
1436
1437div.tabSidePanel ul.otherTabs li div.selectionHighlighter {
1438 display: none;
1439}
1440
1441div.tabSidePanel ul.otherTabs li.selected div.selectionHighlighter {
1442 display: block;
1443 position: absolute;
1444 left: 154px;
1445 margin-top: -42px;
1446}
1447
1448div.tabSidePanel ul.otherTabs a {
1449 display: block;
1450 line-height: 36px;
1451 height: 43px;
1452 padding-left: 40px;
1453 color: #ff6621;
1454 text-decoration: none;
1455 /* background: url(../images/old/main/tabs/itemsBackground.png) -10px -49px;*/
1456}
1457
1458div.tabSidePanel ul.otherTabs li.selected a {
1459 /*background: url(../images/old/main/tabs/itemsBackground.png) 0 -1px; */
1460 /*background: url(../images/old/main/tabs/itemsBackground.png) 0 -67px; */
1461 margin-left: -10px;
1462 padding-left: 50px;
1463 background: url(../images/old/main/tabs/itemsBackground.png) 1px -96px;
1464 color: white;
1465}
1466
1467div.tabSidePanel ul.otherTabs a:hover {
1468 /*background: url(../images/old/main/tabs/itemsBackground.png) 0 -34px; */
1469 background: url(../images/old/main/tabs/itemsBackground.png) -10px -49px;
1470}
1471
1472/* @end */
1473
1474/* @end */
1475
1476/* @group Tag Side Panel */
1477
1478div.tagSidePanel {
1479/*
1480 position: relative;
1481 width: 250px;
1482 min-height: 100px;
1483 left: 10px;
1484*/
1485
1486 margin-right: -8px;
1487}
1488
1489div.tagSidePanel div.header {
1490 height: 50px;
1491 background-image: url(../images/old/main/tabs/tagsBackground.png);
1492}
1493
1494div.tagSidePanel div.header h1 {
1495 padding-left: 52px;
1496 padding-top: 14px;
1497 font-size: 14pt;
1498 font-weight: normal;
1499 color: #888888;
1500}
1501
1502div.tagSidePanel div.body {
1503 background: url(../images/old/main/tabs/tagsBackground.png) -255px;
1504}
1505
1506div.tagSidePanel div.footer {
1507 height: 10px;
1508 background: url(../images/old/main/tabs/tagsBackground.png) -510px -40px;
1509}
1510
1511div.tagSidePanel ul.tags {
1512 margin: 0px;
1513 list-style-type: none;
1514 padding: 0px;
1515}
1516
1517div.tagSidePanel ul.tags li a {
1518 display: block;
1519 font-size: 9pt;
1520 text-decoration: none;
1521 color: #ff6621;
1522 padding: 0px 4px 0px 15px;
1523 line-height: 20px;
1524}
1525
1526div.tagSidePanel ul.tags li a:hover {
1527 background-color: #dddddd;
1528}
1529
1530div.tagSidePanel ul.tags li.selected a:hover {
1531}
1532
1533div.tagSidePanel ul.tags li span.tagCardinality {
1534 float: right;
1535 font-size: 8pt;
1536 color: #999999;
1537 margin-right: 15px;
1538 margin-top: -17px;
1539}
1540
1541div.tagSidePanel ul.tags li.selected a {
1542 background-color: #d4d5cf;
1543}
1544
1545div.tagSidePanel ul.tags li.selected a:hover {
1546 background-color: #d4d5cf;
1547}
1548
1549div.tagSidePanel ul.tags li.selected a {
1550 font-weight: bold;
1551}
1552
1553/* @end */
1554
1555
1556/* @group Group Side Panel */
1557
1558div.groupSidePanel {
1559 margin-right: -10px;
1560/*
1561 position: relative;
1562 width: 250px;
1563 min-height: 100px;
1564 left: 10px;
1565*/
1566}
1567
1568div.groupSidePanel div.header {
1569 height: 50px;
1570 background-image: url(../images/old/main/tabs/groupsBackground.png);
1571}
1572
1573div.groupSidePanel div.header h1 {
1574 padding-left: 52px;
1575 padding-top: 14px;
1576 font-size: 14pt;
1577 font-weight: normal;
1578 color: white;
1579}
1580
1581div.groupSidePanel div.header a {
1582 float: right;
1583 margin-top: -30px;
1584 margin-right: 20px;
1585 text-decoration: none;
1586 color: #666666;
1587 font-size: 9pt;
1588 line-height: 18px;
1589}
1590
1591div.groupSidePanel div.header a:hover {
1592 color: #444444;
1593}
1594
1595div.groupSidePanel div.body {
1596 background: url(../images/old/main/tabs/groupsBackground.png) -255px;
1597}
1598
1599div.groupSidePanel div.footer {
1600 height: 10px;
1601 background: url(../images/old/main/tabs/groupsBackground.png) -510px -39px;
1602}
1603
1604
1605
1606div.groupSidePanel ul.groups {
1607 margin: 0px;
1608 list-style-type: none;
1609 padding: 0px;
1610}
1611
1612div.groupSidePanel ul.groups li a {
1613 display: block;
1614 font-size: 9pt;
1615 text-decoration: none;
1616 color: white;
1617 padding: 0px 4px 0px 15px;
1618 line-height: 20px;
1619}
1620
1621div.groupSidePanel ul.groups li a:hover {
1622 background-color: #aaaaaa;
1623}
1624
1625div.groupSidePanel ul.groups li.selected a:hover {
1626}
1627
1628div.groupSidePanel ul.groups li span.groupCardinality {
1629 float: right;
1630 font-size: 8pt;
1631 color: #dddddd;
1632 margin-right: 15px;
1633 margin-top: -17px;
1634}
1635
1636div.groupSidePanel ul.groups li.selected a {
1637 background-color: #bbbbbb;
1638}
1639
1640div.groupSidePanel ul.groups li.selected a:hover {
1641 background-color: #bbbbbb;
1642}
1643
1644div.groupSidePanel ul.groups li.selected a {
1645 font-weight: bold;
1646}
1647
1648/* @end */
1649
1650
1651
1652/* @end */
1653
1654/* @group MainPanels */
1655
1656div.mainPanels {
1657 float: left;
1658 width: 833px;
1659 margin-top: -38px;
1660/*
1661 position: relative;
1662 width: 100%;
1663 min-height: 600px;
1664 top: -40px;
1665 left: 250px;
1666*/
1667}
1668
1669div.mainFooter {
1670 clear: both;
1671}
1672
1673/* @end */
1674
1675/* @group Grids */
1676
1677/* @group grid Component */
1678
1679/* @group delete */
1680
1681div.gridComponent table.rows tbody tr td.delete {
1682}
1683
1684/*div.body div.rows table.rows tbody tr td.delete */
1685div.delete,
1686div.new {
1687 padding-left: 5px;
1688 height: 19px;
1689}
1690
1691div.new span,
1692div.delete span {
1693 margin: 0px;
1694 padding: 0px;
1695 border: 0px;
1696 display: inline-block;
1697 height: 19px;
1698 padding-right: 6px;
1699}
1700
1701div.new span a,
1702div.delete span a {
1703 white-space: nowrap;
1704}
1705
1706div.delete:hover {
1707 background: url(../images/old/delete_background_left.png) no-repeat 0;
1708}
1709div.delete:hover span {
1710 background: url(../images/old/delete_background.png) no-repeat right 0;
1711}
1712
1713div.new:hover {
1714 background: url(../images/old/new_background_left.png) no-repeat 0;
1715}
1716div.new:hover span {
1717 background: url(../images/old/new_background.png) no-repeat right 0;
1718}
1719
1720/*
1721tr.selected div.delete {
1722 background: url(../images/old/delete_background_left.png) no-repeat 0;
1723}
1724tr.selected div.delete span {
1725 background: url(../images/old/delete_background.png) no-repeat right 0;
1726}
1727*/
1728div.body div.rows table.rows tbody tr td.delete div.delete span a {
1729 visibility: hidden;
1730 font-size: 8pt;
1731 vertical-align: -13px;
1732 color: black;
1733}
1734
1735div.body div.rows table.rows tbody tr.selected td.delete div.delete span a {
1736 visibility: visible;
1737}
1738
1739div.body div.rows table.rows tbody tr:hover td.delete div.delete span a {
1740 visibility: visible;
1741}
1742
1743div.body div.rows table.rows tbody tr:hover td.delete div.delete:hover span a {
1744 color: white;
1745}
1746/*
1747div.body div.rows table.rows tbody tr.selected td.delete div.delete span a {
1748 color: white;
1749}
1750*/
1751/* @end */
1752
1753/* @group header */
1754
1755div.gridComponent table.rows thead tr th {
1756 text-align: left;
1757 height: 30px;
1758 vertical-align: bottom;
1759}
1760
1761div.gridComponent table.rows thead tr th.sortable span {
1762 cursor: pointer;
1763}
1764
1765div.gridComponent table.rows thead tr th.sortable span a {
1766 margin-left: 5px;
1767 padding-left: 10px;
1768}
1769
1770div.gridComponent table.rows thead tr th.directLoginTH {
1771 width: 420px;
1772}
1773
1774div.gridComponent table.rows thead tr th.latestUpdateTH {
1775 width: 100px;
1776}
1777
1778div.gridComponent table.rows thead tr th.commandsTH {
1779 width: 150px;
1780}
1781
1782div.gridComponent table.rows thead a {
1783 text-decoration: none;
1784}
1785
1786div.gridComponent table.rows thead span {
1787 font-weight: normal;
1788 font-size: 9pt;
1789 line-height: 20px;
1790}
1791
1792div.gridComponent div.header div.headerSlot {
1793 float: right;
1794}
1795
1796/* @end */
1797
1798div.mainPanels div.gridComponent div.body table.rows td.favicon {
1799 padding-left: 25px;
1800}
1801
1802div.mainPanels div.gridComponent div.body table.rows td.favicon img {
1803 width: 16px;
1804 height: 16px;
1805 border: 0px;
1806}
1807
1808
1809
1810/* @end */
1811
1812/* @group Card Grid */
1813
1814/* @group DirectLogin links */
1815
1816div.gridComponent th.directLoginTH span {
1817 margin-left: 7px;
1818}
1819
1820td.card_directLogins div {
1821 display: inline-table;
1822}
1823
1824td.card_directLogins span {
1825 display: inline-block;
1826}
1827/*
1828td.card_directLogins a {
1829 display: inline-table;
1830 height: 19px;
1831
1832 padding-right: 7px;
1833}
1834
1835td.card_directLogins a:hover {
1836 background: url(../images/old/directLink_background.png) right 0;
1837}
1838*/
1839
1840div.card_directLogin {
1841 display: inline-block;
1842 height: 19px;
1843 padding-left: 7px;
1844}
1845
1846div.card_directLogin_ellipses span {
1847 padding-bottom: 2px;
1848}
1849
1850div.card_directLogin div.card_directLogin_body {
1851 display: inline-block;
1852 height: 19px;
1853 padding-right: 8px;
1854 background-position: left;
1855}
1856
1857div.card_directLogin div.card_directLogin_body a{
1858 vertical-align: -14px;
1859}
1860
1861/*div.card_directLogin:hover {*/
1862div.card_directLogin:hover {
1863 background: url(../images/old/directLink_background_left.png) no-repeat 0 0;
1864}
1865
1866/*div.card_directLogin:hover div {*/
1867div.card_directLogin:hover div.card_directLogin_body {
1868 background: url(../images/old/directLink_background.png) right 0;
1869}
1870
1871/* @group DirectLogin Popup */
1872
1873div.DirectLoginListPopup {
1874 position: absolute;
1875 width: 184px;
1876}
1877
1878div.DirectLoginListPopup div.DirectLoginListPopup_body {
1879 background-image: url(../images/old/directLogins_background.png);
1880 padding-top: 8px;
1881}
1882
1883div.DirectLoginListPopup div.DirectLoginListPopup_footer {
1884 height: 8px;
1885 background-image: url(../images/old/directLogins_background_bottom.png);
1886}
1887
1888div.DirectLoginListPopup div.DirectLoginListPopup_body ul {
1889 margin: 0px;
1890 padding-left: 13px;
1891 list-style: none;
1892}
1893
1894div.DirectLoginListPopup div.DirectLoginListPopup_body ul li {
1895 padding-top: 4px;
1896 height: 20px;
1897 padding-right: 10px;
1898 white-space: nowrap;
1899}
1900
1901div.DirectLoginListPopup div.DirectLoginListPopup_body ul li div {
1902 padding-right: 10px;
1903 overflow: hidden;
1904}
1905div.DirectLoginListPopup div.DirectLoginListPopup_body ul li img.favicon {
1906 padding-left: 9px;
1907 padding-right: 5px;
1908}
1909
1910div.DirectLoginListPopup div.DirectLoginListPopup_body ul li a {
1911 text-decoration: none;
1912 color: white;
1913 font-weight: normal;
1914 font-size: 10pt;
1915 vertical-align: 3px;
1916 white-space: nowrap;
1917 padding-right:8px;
1918}
1919
1920div.DirectLoginListPopup div.DirectLoginListPopup_body ul li:hover {
1921 /* background-color: #a5a696;*/
1922 /* background-color: #7b7d70;*/
1923 background-color: rgba(123,125,112,0.5);
1924}
1925
1926div.DirectLoginListPopup div.DirectLoginListPopup_body ul li:hover a {
1927 background: url(../images/old/directLink_no_background.png) right;
1928}
1929
1930/* @end */
1931
1932
1933/* @end */
1934
1935div.mainPanels div.gridComponent div.header {
1936/*
1937 height: 90px;
1938 background: url(../images/old/main/blocks/cardGridBackground.png) no-repeat;
1939*/
1940 background: url(../images/old/main/blocks/cardGridBackground.png) no-repeat;
1941 padding-left: 40px;
1942 padding-right: 40px;
1943 padding-top: 20px;
1944 padding-bottom: 10px;
1945}
1946
1947div.mainPanels div.gridComponent div.header form.search {
1948 height: 32px;
1949 margin: 0px;
1950}
1951
1952div.mainPanels div.gridComponent div.header form.search div.clearSearchButton {
1953 position: absolute;
1954 margin-left: 192px;
1955 width: 22px;
1956 height: 22px;
1957 margin-top: 6px;
1958 background: url(../images/old/filter/clearFilter_notSelected.png) no-repeat;
1959}
1960
1961div.mainPanels div.gridComponent div.header form.search div.clearSearchButton:hover {
1962 background: url(../images/old/filter/clearFilter_selected.png) no-repeat;
1963 cursor: pointer;
1964}
1965
1966div.mainPanels div.gridComponent div.header form.search div.search {
1967 display: block;
1968 float: left;
1969 width: 217px;
1970}
1971
1972div.mainPanels div.gridComponent div.header form.search input.search {
1973 border: 1px solid #76786a;
1974 color: #666666;
1975 font-size: 12pt;
1976 width: 100%;
1977 padding: 4px;
1978 padding-left: 24px;
1979 padding-right: 26px;
1980 background: #e8ecde url(../images/old/main/grid/search.png) no-repeat 2px 4px;
1981}
1982
1983div.mainPanels div.gridComponent div.header form.search input.search.disabled {
1984 disabled:disabled;
1985}
1986
1987div.mainPanels div.gridComponent div.header form.search input.search.running {
1988 background: #e8ecde url(../images/old/main/grid/running_search.gif) no-repeat 4px 5px;
1989}
1990
1991div.mainPanels div.gridComponent div.body {
1992 clear: both;
1993 background: url(../images/old/main/blocks/cardGridBackground.png) repeat-y -836px;
1994}
1995
1996div.mainPanels div.gridComponent div.footer {
1997 background: url(../images/old/main/blocks/cardGridBackground.png) 834px -28px;
1998 height: 35px;
1999}
2000
2001div.mainPanels div.gridComponent div.body h1 {
2002 margin: 0px;
2003}
2004
2005div.mainPanels div.gridComponent div.body div.rows {
2006 margin-left: 9px;
2007 margin-right: 6px;
2008 min-height: 582px;
2009 background: url(../images/old/main/blocks/cardGridStripes.png) 0 7px;
2010}
2011
2012div.mainPanels div.gridComponent.noRows div.body table.rows thead,
2013div.mainPanels div.gridComponent.empty div.body table.rows thead {
2014 visibility: hidden;
2015}
2016
2017div.mainPanels div.gridComponent.empty div.body div.rows {
2018 background: #eaebe6 url(../images/old/lock/background_star.png) no-repeat center center;
2019}
2020
2021div.mainPanels div.gridComponent.noRows div.body div.rows {
2022 background: #eaebe6;
2023}
2024
2025div.mainPanels div.gridComponent div.body table.rows {
2026 display: block;
2027 width: 100%;
2028}
2029
2030div.mainPanels div.gridComponent div.body table.rows tbody tr.odd.selected {
2031 background-color: #a5a696;
2032}
2033
2034div.mainPanels div.gridComponent div.body table.rows tbody tr.even.selected {
2035 background-color: #a5a696;
2036}
2037
2038div.mainPanels div.gridComponent div.body table.rows tbody tr.selected td a {
2039 color: #f3f4eb;
2040}
2041
2042
2043div.mainPanels div.gridComponent div.body table.rows tbody tr.odd {
2044 background-color: #d4d5cf;
2045}
2046
2047div.mainPanels div.gridComponent div.body table.rows tbody tr.even {
2048 background-color: #eaebe6;
2049}
2050
2051div.mainPanels div.gridComponent div.body table.rows tbody tr.odd:hover {
2052 background-color: #a5a696;
2053}
2054
2055div.mainPanels div.gridComponent div.body table.rows tbody tr.even:hover {
2056 background-color: #a5a696;
2057}
2058
2059div.mainPanels div.gridComponent div.body table.rows tbody tr td {
2060 height: 23px;
2061 max-height: 23px;
2062/*
2063 white-space: nowrap;
2064 overflow: hidden;
2065*/
2066}
2067
2068div.mainPanels div.gridComponent div.body table.rows tbody tr td span {
2069 color: #828479;
2070 font-size: 10pt;
2071}
2072
2073div.mainPanels div.gridComponent div.body table.rows tbody tr td a {
2074 color: #828479;
2075 font-size: 10pt;
2076 text-decoration: none;
2077}
2078
2079div.mainPanels div.gridComponent div.body table.rows tbody tr:hover td span {
2080 color: #f3f4eb;
2081}
2082
2083div.mainPanels div.gridComponent div.body table.rows tbody tr.selected td span {
2084 color: #f3f4eb;
2085}
2086
2087div.mainPanels div.gridComponent div.body table.rows tbody tr:hover td a {
2088 color: #f3f4eb;
2089}
2090
2091div.mainPanels div.gridComponent div.body table.rows tbody tr td.title a {
2092 font-weight: bold;
2093}
2094
2095div.mainPanels div.gridComponent div.body table.rows tbody tr td img.favicon {
2096 float: right;
2097 padding-right: 6px;
2098}
2099
2100/* @group header */
2101
2102div.gridComponent table.rows thead img {
2103 padding-left: 10px;
2104 vertical-align: middle;
2105}
2106
2107div.gridComponent table.rows thead tr th {
2108 background-color: #eaebe6;
2109 border-bottom: 1px solid #b3b4af;
2110}
2111
2112div.gridComponent table.rows thead span {
2113 color: #8c8f7e;
2114}
2115
2116div.gridComponent table.rows thead tr th.unsorted span.sortable a {
2117 background-image: url(../images/old/main/grid/unsorted.png);
2118}
2119
2120div.gridComponent table.rows thead tr th.descending span.sortable a {
2121 background-image: url(../images/old/main/grid/descending.png);
2122}
2123
2124div.gridComponent table.rows thead tr th.ascending span.sortable a {
2125 background-image: url(../images/old/main/grid/ascending.png);
2126}
2127
2128div.gridComponent table.rows thead tr th.faviconTH {
2129 width: 53px;
2130}
2131
2132div.gridComponent table.rows thead tr th.titleTH {
2133 width: 200px;
2134 max-width: 200px;
2135}
2136
2137div.gridComponent table.rows thead tr th.deleteTH {
2138 width: 50px;
2139}
2140
2141
2142/* @end */
2143
2144
2145/* @end */
2146
2147/* @group Direct login Grid */
2148/*
2149div.mainPanels div.directLoginGrid div.header {
2150/*
2151 height: 90px;
2152 background: url(../images/old/main/blocks/cardGridBackground.png) no-repeat;
2153* /
2154}
2155
2156div.mainPanels div.directLoginGrid div.header form.search {
2157 background: url(../images/old/main/blocks/directLoginGridBackground.png) no-repeat;
2158 padding-left: 40px;
2159 padding-top: 20px;
2160 padding-bottom: 10px;
2161 margin: 0px;
2162}
2163
2164div.mainPanels div.directLoginGrid div.header form.search input.search {
2165 border: 1px solid #76786a;
2166 color: #666666;
2167 font-size: 12pt;
2168 padding: 4px;
2169 background-color: #e8ecde;
2170}
2171
2172div.mainPanels div.directLoginGrid div.header form.search input.searchButton {
2173 background-color: #858877;
2174 border: 0px;
2175 color: white;
2176 font-size: 10pt;
2177}
2178
2179div.mainPanels div.directLoginGrid div.body {
2180 background: url(../images/old/main/blocks/directLoginGridBackground.png) repeat-y -836px;
2181}
2182
2183div.mainPanels div.directLoginGrid div.footer {
2184 background: url(../images/old/main/blocks/directLoginGridBackground.png) 834px -28px;
2185 height: 35px;
2186}
2187
2188div.mainPanels div.directLoginGrid div.body h1 {
2189 margin: 0px;
2190}
2191
2192div.mainPanels div.directLoginGrid div.body div.rows {
2193 margin-left: 9px;
2194 margin-right: 6px;
2195 min-height: 582px;
2196 background: url(../images/old/main/blocks/directLoginGridStripes.png) 0 7px;
2197}
2198
2199div.mainPanels div.directLoginGrid div.body table.rows {
2200 display: block;
2201 width: 100%;
2202}
2203
2204div.mainPanels div.directLoginGrid div.body table.rows img {
2205 border: 0px;
2206}
2207
2208div.mainPanels div.directLoginGrid div.body table.rows tbody tr.even {
2209 background-color: #787666;
2210}
2211
2212div.mainPanels div.directLoginGrid div.body table.rows tbody tr.odd {
2213 background-color: #646351;
2214}
2215
2216div.mainPanels div.directLoginGrid div.body table.rows tbody tr.odd:hover {
2217 background-color: #d1d4c6;
2218}
2219
2220div.mainPanels div.directLoginGrid div.body table.rows tbody tr.even:hover {
2221 background-color: #d1d4c6;
2222}
2223
2224div.mainPanels div.directLoginGrid div.body table.rows tbody tr td {
2225 height: 23px;
2226 color: #e1e0d6;
2227 font-size: 10pt;
2228}
2229
2230div.mainPanels div.directLoginGrid div.body table.rows tbody tr:hover td {
2231 color: #777867;
2232}
2233
2234div.mainPanels div.directLoginGrid div.body table.rows tbody tr td.title {
2235 font-weight: bold;
2236}
2237
2238div.directLoginGrid div.body table.rows tbody tr a {
2239 color: #e1e0d6;
2240 text-decoration: none;
2241}
2242
2243div.directLoginGrid div.body table.rows tbody tr:hover a {
2244 color: #777867;
2245}
2246*/
2247
2248/* @group DirectLogin links */
2249/*
2250td.card_directLogins div {
2251 display: inline-table;
2252}
2253
2254td.card_directLogins span {
2255 display: inline-table;
2256}
2257*/
2258div.directLogin_directLogin {
2259 display: inline-block;
2260 height: 19px;
2261 padding-left: 7px;
2262}
2263
2264div.directLogin_directLogin div.directLogin_directLogin_body {
2265 display: inline-block;
2266 height: 19px;
2267 padding-right: 8px;
2268 background-position: left;
2269}
2270
2271div.directLogin_directLogin div.directLogin_directLogin_body a {
2272 vertical-align: -14px;
2273}
2274
2275div.directLogin_directLogin:hover {
2276 background: url(../images/old/directLink_background_left.png) no-repeat 0 0;
2277}
2278
2279div.directLogin_directLogin:hover div.directLogin_directLogin_body {
2280 background: url(../images/old/directLink_background.png) right 0;
2281}
2282
2283table.rows tbody tr td div.directLogin_directLogin:hover div.directLogin_directLogin_body a {
2284 color: #f3f4eb;
2285}
2286
2287
2288
2289/* @end */
2290
2291
2292
2293/* @group header */
2294
2295div.directLoginGrid table.rows thead span {
2296 color: #e1e0d6;
2297}
2298
2299div.directLoginGrid table.rows thead tr th {
2300 background-color: #787762;
2301 border-bottom: 1px solid #999883;
2302}
2303
2304div.directLoginGrid table.rows thead tr th.faviconTH {
2305 min-width: 53px;
2306 width: 53px;
2307}
2308
2309div.directLoginGrid table.rows thead tr th.titleTH {
2310 min-width: 250px;
2311 width: 250px;
2312}
2313
2314div.directLoginGrid table.rows thead tr th.titleTH span {
2315 margin-left: 7px;
2316}
2317
2318div.directLoginGrid table.rows thead tr th.strengthTH {
2319 width: 100px;
2320}
2321
2322div.directLoginGrid table.rows thead tr th.cardTitleTH {
2323 width: 400px;
2324}
2325
2326div.directLoginGrid table.rows thead tr th.bookmarkableLinkTH {
2327 width: 64px;
2328}
2329
2330div.directLoginGrid table.rows thead tr th.deleteTH {
2331 width: 50px;
2332}
2333
2334div.directLoginGrid table.rows thead tr th.latestAccessTH {
2335 width: 100px;
2336}
2337
2338div.directLoginGrid table.rows thead tr th.commandsTH {
2339 width: 100px;
2340}
2341/*
2342div.directLoginGrid table.rows thead a {
2343 font-weight: normal;
2344 text-decoration: none;
2345 color: #e9e9df;
2346 font-size: 9pt;
2347 line-height: 20px;
2348}
2349*/
2350div.directLoginGrid table.rows thead img {
2351 padding-left: 10px;
2352 vertical-align: middle;
2353}
2354
2355div.directLoginGrid table.rows thead tr th.unsorted span.sortable a {
2356 background: url(../images/old/main/grid/directLogins/unsorted.png) no-repeat;
2357}
2358
2359div.directLoginGrid table.rows thead tr th.descending span.sortable a {
2360 background: url(../images/old/main/grid/directLogins/descending.png) no-repeat;
2361}
2362
2363div.directLoginGrid table.rows thead tr th.ascending span.sortable a {
2364 background: url(../images/old/main/grid/directLogins/ascending.png) no-repeat;
2365}
2366
2367/* @end */
2368
2369
2370
2371/* @end */
2372
2373
2374
2375/* @end */
2376
2377
2378/* @end */
2379
2380/* @group other Panels */
2381
2382/* @group common styles */
2383div.subPanelTabs {
2384}
2385
2386div.subPanelTabs ul {
2387 margin: 0px;
2388 margin-right: 7px;
2389 padding: 0px;
2390}
2391
2392div.subPanelTabs ul li.first {
2393}
2394
2395div.subPanelTabs ul li {
2396 display: inline-block;
2397 vertical-align: middle;
2398 /*width: 130px; */
2399 height: 50px;
2400 /*border-right: 1px solid #a5a79c;
2401 border-bottom: 1px solid #a5a79c;*/
2402 border-right: 1px solid #eef0e3;
2403 border-bottom: 1px solid #d5d5bc;
2404}
2405
2406div.subPanelTabs ul li.first:hover {
2407 /*background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -9px -5px; */
2408}
2409
2410div.subPanelTabs ul li:hover {
2411 /*background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -45px -5px; */
2412 border-right: 1px solid #d5d5bc;
2413 background-color: #eef0e3;
2414}
2415
2416div.subPanelTabs ul li a {
2417 color: #787872;
2418 text-decoration: none;
2419 display: block;
2420 text-align: center;
2421 padding-top: 15px;
2422 padding-left: 20px;
2423 padding-right: 20px;
2424 font-size: 13pt;
2425}
2426
2427div.subPanelTabs ul li.first {
2428 /*background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -9px -5px; */
2429 -webkit-border-top-left-radius: 20px;
2430 -moz-border-radius-topleft: 20px;
2431 border-top-left-radius: 20px;
2432}
2433
2434div.subPanelTabs ul li.selected {
2435 /*background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -45px -5px; */
2436 background-color: #eef0e3;
2437 border-bottom: 1px solid #eef0e3;
2438 border-right: 1px solid #d5d5bc;
2439}
2440
2441div.subPanelTabs ul li.selected:hover {
2442 border-right: 1px solid #d5d5bc;
2443}
2444
2445
2446div.subPanelTabs ul li.selected a {
2447 color: #444440;
2448}
2449
2450
2451
2452
2453
2454
2455div.subPanelContent {
2456 padding-top: 20px;
2457 padding-left: 30px;
2458 padding-right: 30px;
2459 min-height: 280px;
2460 color: #787872;
2461 margin: 0px 6px 0 9px;
2462}
2463
2464div.subPanelContent ul {
2465 margin: 0px;
2466 padding: 0px;
2467 list-style-type: none;
2468}
2469
2470div.subPanelContent ul li.selected {
2471 display: block;
2472}
2473
2474div.subPanelContent ul li {
2475 display: none;
2476}
2477
2478div.subPanelContent h3 {
2479 margin: 0px;
2480 border: 0px;
2481 padding: 0px;
2482}
2483
2484/* @end */
2485
2486/* @group mainPanels otherPanel */
2487div.mainPanels div.otherPanel {
2488 margin: 5px 10px;
2489 background-color: #eef0e3;
2490
2491 -webkit-border-radius: 20px;
2492 -moz-border-radius: 20px;
2493 border-radius: 20px;
2494
2495 -webkit-box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
2496 -moz-box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
2497 box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
2498}
2499div.mainPanels div.otherPanel div.header {
2500 /*background: url(../images/old/main/blocks/otherPanelBackground.png) no-repeat; */
2501/*
2502 height: 90px;
2503*/
2504 background-color: #d5d5bc;
2505
2506 /*padding-left: 9px;
2507 padding-top: 5px; */
2508 margin: 0px;
2509 margin-bottom: 0px;
2510
2511 -webkit-border-top-left-radius: 20px;
2512 -webkit-border-top-right-radius: 20px;
2513 -moz-border-radius-topleft: 20px;
2514 -moz-border-radius-topright: 20px;
2515 border-top-left-radius: 20px;
2516 border-top-right-radius: 20px;
2517}
2518
2519div.mainPanels div.otherPanel div.body {
2520 /*background: url(../images/old/main/blocks/otherPanelBackground.png) repeat-y -836px; */
2521 margin: 0px;
2522 border: 0px;
2523 padding: 0px;
2524}
2525
2526div.mainPanels div.otherPanel div.footer {
2527 /*background: url(../images/old/main/blocks/otherPanelBackground.png) 834px -18px; */
2528 height: 45px;
2529}
2530
2531div.mainPanels div.otherPanel div.body h1 {
2532 margin: 0px;
2533}
2534
2535/* @end */
2536
2537/* @group Account */
2538
2539form.changePassphrase {
2540}
2541
2542form.changePassphrase div.currentCredentials,
2543form.changePassphrase div.newPassphrase {
2544 float: left;
2545 padding: 10px 20px;
2546}
2547
2548form.changePassphrase label {
2549 display: inline-block;
2550 width: 150px;
2551}
2552
2553form.changePassphrase div.confirm {
2554 clear: both;
2555 padding: 10px 20px;
2556}
2557
2558form.changePassphrase div.confirm label {
2559 width: 500px;
2560}
2561
2562div.currentCredentials {
2563}
2564
2565div.accountPanel h3.manageOTP {
2566 margin-top: 20px;
2567 margin-left: -20px;
2568 padding-top: 10px;
2569 padding-left: 20px;
2570 border-top: 1px solid #aaaaaa;
2571}
2572
2573/* @end */
2574
2575
2576
2577/* @end */
2578
2579/* @group Message Panel (?) */
2580/*
2581div.messagePanelWrapper div.mask {
2582 position: fixed;
2583 top: 0px;
2584 left: 0px;
2585 right: 0px;
2586 bottom: 0px;
2587
2588 background-color: black;
2589 z-index:50001;
2590
2591 -moz-opacity: 0.0;
2592 opacity:.0;
2593 filter: alpha(opacity=0);
2594/ *
2595 -moz-opacity: 0.7;
2596 opacity:.70;
2597 filter: alpha(opacity=70);
2598* /
2599}
2600
2601div.messagePanelFrame {
2602 border: 1px solid white;
2603 z-index:50002;
2604/ *
2605 width: 443px;
2606 height: 155px;
2607 position: fixed;
2608 top: 205px;
2609 left: 260px;
2610 margin-left: auto;
2611 margin-right: auto;
2612 max-width: 468px;
2613* /
2614}
2615
2616
2617div.messagePanel {
2618 position: fixed;
2619 z-index:50003;
2620 top: 0px;
2621 left: 0px;
2622/ *
2623 margin-left: auto;
2624 margin-right: auto;
2625 max-width: 468px;
2626 top: 200px;
2627 left: 250px;
2628 left: 100px;
2629 right: 100px;
2630* /
2631}
2632
2633 div.messagePanel div.header {
2634 height: 34px;
2635 width: 468;
2636 background-image: url(../images/old/alert/header.png);
2637}
2638
2639 div.messagePanel div.body {
2640 background-image: url(../images/old/alert/body.png);
2641 padding: 0px 20px 10px 20px;
2642 min-height: 100px;
2643}
2644/ *
2645div#javaScriptAlert div.body div.alert {
2646 padding-left: 100px;
2647 background: url(../images/old/alert/alert.png) no-repeat;
2648}
2649* /
2650
2651div.messagePanel div.body img.alert {
2652 float: left;
2653}
2654
2655div.messagePanel div.body div.alert {
2656 padding-left: 100px;
2657}
2658
2659 div.messagePanel div.footer {
2660 height: 34px;
2661 width: 468;
2662 background-image: url(../images/old/alert/footer.png);
2663}
2664
2665div.messagePanel div.message h1 {
2666 font-size: 16pt;
2667 margin: 0px;
2668 color: #ff5930;
2669}
2670
2671div.messagePanel div.message p {
2672 margin-top: 0px;
2673 color: #999999;
2674}
2675
2676div.messagePanel div.message h3 {
2677 font-size: 12pt;
2678 margin-bottom: 0px;
2679 color: #ff5930;
2680}
2681
2682div.messagePanel div.message h5 {
2683 margin: 0px;
2684 color: #999999;
2685}
2686
2687
2688*/
2689/* @end */
2690
2691/* @group LoginProgress (?) */
2692/*
2693div#loginProgress {
2694 position: relative;
2695 left: -198px;
2696 top: -118px;
2697 width: 397px;
2698 height: 236px;
2699 background: url(../images/old/loginProgress/background.png);
2700}
2701
2702div#loginProgress div.header {
2703 height: 52px;
2704}
2705
2706div#loginProgress div.header h3 {
2707 font-size: 12pt;
2708 font-weight: normal;
2709 margin: 0px;
2710 color: #787872;
2711 padding-top: 25px;
2712 padding-left: 35px;
2713}
2714
2715div#loginProgress div.body {
2716 height: 120px;
2717 overflow: auto;
2718 margin-left: 19px;
2719 margin-right: 18px;
2720}
2721
2722div#loginProgress div.footer {
2723 margin-left: 19px;
2724 margin-right: 18px;
2725}
2726
2727div#loginProgress div.footer a {
2728 font-weight: bold;
2729 text-decoration: none;
2730 text-align: center;
2731 color: #787872;
2732 display: block;
2733 font-size: 11pt;
2734 width: 100px;
2735 margin-top: 13px;
2736 margin-left: auto;
2737 margin-right: auto;
2738}
2739
2740div#loginProgress div.footer a:hover {
2741 color: #515247;
2742}
2743
2744*/
2745
2746/* @end */
2747
2748
2749
2750div#modalDialogMask,
2751div.modalDialogMask {
2752 z-index: 20000;
2753 /* position: absolute;*/
2754 position: fixed;
2755 top:0;
2756 left:0;
2757 -moz-opacity: 0.5;
2758 opacity: .50;
2759 filter: alpha(opacity=50);
2760 /* background-color: #cccccc;*/
2761 background-color: #000000;
2762 width: 100%;
2763 height: 100%;
2764 zoom: 1;
2765}
2766
2767div#modalDialogFrame,
2768div.modalDialogFrame {
2769 position: absolute;
2770 /* border: 1px solid white;*/
2771 -moz-opacity: 0.5;
2772 opacity: .50;
2773 filter: alpha(opacity=50);
2774 background-color: #333333;
2775 z-index: 20001;
2776
2777 -webkit-border-radius: 20px;
2778 -moz-border-radius: 20px;
2779 border-radius: 20px;
2780}
2781
2782div#modalDialog,
2783div.modalDialog {
2784 z-index: 20001;
2785}
2786
2787/*div#modalDialog.scrollable,*/
2788div.modalDialog.scrollable {
2789 position: absolute;
2790 top: 0;
2791 left: 50%;
2792}
2793
2794/*div#modalDialog.fixed,*/
2795div.modalDialog.fixed {
2796 position: fixed;
2797 top: 40%;
2798 left: 50%;
2799}
2800
2801div#modalDialog div,
2802div.modalDialog div {
2803 z-index: 20002;
2804 list-style-type: circle;
2805}
2806
2807
2808
2809div.modalDialogMask.simpleMessagePanelMask {
2810 z-index: 20010;
2811}
2812
2813div.modalDialogFrame.simpleMessagePanelMask {
2814 z-index: 20011;
2815}
2816
2817div.modalDialog.simpleMessagePanelMask {
2818 z-index: 20011;
2819}
2820
2821div.modalDialog.simpleMessagePanelMask div {
2822 z-index: 20012;
2823}
2824
2825
2826/* @group Bookmarklet */
2827
2828div.bookmarklet {
2829}
2830
2831div.bookmarklet div.bookmarklet_link {
2832/*
2833 padding-top: 5px;
2834 padding-left: 4px;
2835 padding-right: 3px;
2836
2837 float: right;
2838 margin-top: 12px;
2839 margin-right: 13px;
2840*/
2841 height: 34px;
2842}
2843
2844div.bookmarklet div.bookmarklet_link a {
2845 color: #838975;
2846 text-decoration: none;
2847 font-weight: bold;
2848 font-size: 10pt;
2849/*
2850 display: block;
2851 text-align: right;
2852 padding-top: 7px;
2853 padding-right: 11px;
2854 padding-bottom: 6px;
2855*/
2856}
2857
2858div.bookmarklet div.bookmarklet_link a div.icon {
2859 background: url(../images/old/bookmarklet/placeholder_icon.png) no-repeat 0 0;
2860 float: left;
2861 width: 34px;
2862 height: 34px;
2863}
2864
2865div.bookmarklet div.bookmarklet_link a:hover div.icon {
2866 background: url(../images/old/bookmarklet/placeholder_selected_icon.png) no-repeat 0 0;
2867}
2868
2869div.bookmarklet div.bookmarklet_link a div.text {
2870 display: block;
2871 float: right;
2872 background: url(../images/old/bookmarklet/placeholder.png) no-repeat right 0;
2873 white-space: nowrap;
2874 height: 34px;
2875}
2876
2877div.bookmarklet div.bookmarklet_link a:hover div.text {
2878 background: url(../images/old/bookmarklet/placeholder_selected.png) no-repeat right 0;
2879}
2880div.bookmarklet div.bookmarklet_link a div.text span {
2881 display: block;
2882 padding-top: 10px;
2883 padding-right: 10px;
2884 padding-left: 6px;
2885
2886 clear: both;
2887}
2888
2889/* @end */
2890
2891/* @group Tooltip */
2892
2893/*
2894div#Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode {
2895 position: absolute;
2896 top: 0px;
2897 left: 0px;
2898}
2899*/
2900
2901div.tooltip {
2902 position: absolute;
2903 z-index: 30001;
2904}
2905
2906
2907div.tooltip div.tooltip_body {
2908 position: absolute;
2909}
2910
2911div.tooltip div.tooltip_arrow {
2912 position: absolute;
2913}
2914
2915div.tooltip.BELOW div.tooltip_arrow {
2916 background: url(../images/old/tooltips/top_arrow.png) no-repeat;
2917}
2918
2919div.tooltip.ABOVE div.tooltip_arrow {
2920 background: url(../images/old/tooltips/bottom_arrow.png) no-repeat;
2921}
2922
2923div.tooltip.LEFT div.tooltip_arrow {
2924 background: url(../images/old/tooltips/right_arrow.png) no-repeat;
2925}
2926
2927div.tooltip.RIGHT div.tooltip_arrow {
2928 /* margin-top: 7px;*/
2929 background: url(../images/old/tooltips/left_arrow.png) no-repeat;
2930}
2931div.tooltip.RIGHT div.tooltip_body {
2932 /* padding-left: 13px;*/
2933}
2934
2935
2936div.tooltip div.tooltip_body div.tooltip_text {
2937 width: 171px;
2938 background: url(../images/old/tooltips/body.png) no-repeat center top;
2939}
2940
2941div.tooltip.LEFT div.tooltip_body div.tooltip_text,
2942div.tooltip.RIGHT div.tooltip_body div.tooltip_text {
2943 min-height: 45px;
2944}
2945
2946div.tooltip div.tooltip_body span {
2947 display: block;
2948 padding: 10px;
2949 padding-bottom: 4px;
2950 font-size: 10pt;
2951 color: white;
2952}
2953
2954div.tooltip div.tooltip_footer {
2955 height: 7px;
2956 background: url(../images/old/tooltips/body_bottom.png) no-repeat;
2957}
2958
2959/* @end */
2960
2961/* @group News */
2962/*
2963div#news {
2964 top: 11px;
2965 left: 240px;
2966 width: 353px;
2967 height: 85px;
2968 padding-top: 4px;
2969 position: absolute;
2970 overflow: hidden;
2971 background: url(../images/old/note.png) 1px 3px;
2972}
2973
2974div#news.hidden {
2975 display: none;
2976}
2977
2978div#news div.close {
2979 display: inline;
2980 margin-top: 6px;
2981 margin-left: 17px;
2982 float: left;
2983 width: 15px;
2984}
2985
2986div#news div.close a {
2987 text-decoration: none;
2988 color: #929c1b;
2989}
2990
2991div#news div.close a:hover {
2992 text-decoration: none;
2993 color: #3d420b;
2994}
2995
2996div#news div#newsframe {
2997 display: block;
2998 overflow: hidden;
2999 width: 305px;
3000 height: 70px;
3001}
3002
3003div#news div#newsframe iframe {
3004 border: 0px;
3005}
3006*/
3007/* --------------------------------------- */
3008
3009div#news {
3010 top: -82px;
3011 left: 240px;
3012 width: 310px;
3013 height: 90px;
3014 position: absolute;
3015 /*background: url(../images/old/tips/Tips_background.png) 0 -5px; */
3016
3017 background-color: #616474;
3018
3019 -webkit-border-bottom-right-radius: 8px;
3020 -webkit-border-bottom-left-radius: 8px;
3021 -moz-border-radius-bottomright: 8px;
3022 -moz-border-radius-bottomleft: 8px;
3023 border-bottom-right-radius: 8px;
3024 border-bottom-left-radius: 8px;
3025
3026 -webkit-box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
3027 -moz-box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
3028 box-shadow: 2px 2px 9px rgba(0,0,0,0.6);
3029}
3030/*
3031div#news.open {
3032 background: url(../images/old/tips/Tips_open.png) 0 -5px;
3033}
3034
3035div#news.hidden {
3036 background: url(../images/old/tips/Tips_close.png) 0 -5px;
3037}
3038*/
3039div#news div#newsframe {
3040 margin-left: 10px;
3041 margin-right: 10px;
3042 height: 75px;
3043 overflow: hidden;
3044}
3045
3046div#news div#newsframe.loading {
3047 background: url(../images/old/loading/news.gif) no-repeat center center;
3048}
3049
3050div#news div#newsframe iframe {
3051 width: 290px;
3052 border: 0px;
3053 color: #616474;
3054 background-color: #616474;
3055}
3056
3057div#news div.grip {
3058 width: 310px;
3059 height: 12px;
3060 margin-top: 2px;
3061 cursor: pointer;
3062}
3063
3064div#news.open div.grip {
3065 background: url(../images/old/tips/close.png) no-repeat center 6px;
3066}
3067
3068div#news.hidden div.grip {
3069 background: url(../images/old/tips/open.png) no-repeat center 6px;
3070}
3071
3072/* @end */
3073
3074/* @group mainDialog */
3075div.mainDialog {
3076 position: relative;
3077 left: -263px;
3078 width: 525px;
3079 height: 325px;
3080}
3081
3082div.scrollable div.mainDialog {
3083 top: 0px;
3084}
3085
3086div.fixed div.mainDialog {
3087 top: -118px;
3088}
3089
3090div.mainDialog div.header {
3091 height: 55px;
3092 background: url(../images/old/cardDialog/background_header.png) no-repeat;
3093}
3094
3095div.mainDialog div.header div.title {
3096 padding-top: 16px;
3097 padding-left: 20px;
3098 padding-right: 20px;
3099}
3100
3101div.mainDialog div.header div.title input {
3102 width: 100%;
3103 display: block;
3104 font-size: 16pt;
3105 margin: 0px;
3106 border: 0px;
3107 padding: 3px 10px;
3108 color: #787872;
3109 border: 1px solid #cccec0;
3110 background-color: #cccec0;
3111}
3112
3113div.mainDialog div.header div.title h3 {
3114 display: block;
3115 font-size: 16pt;
3116 color: #787872;
3117 margin: 0px;
3118 border: 0px;
3119 padding: 3px 10px;
3120}
3121
3122div.mainDialog div.header div.title.selectedField input,
3123div.mainDialog div.header div.title:hover input {
3124 border: 1px solid #515247;
3125 background-color: #b5b7ab;
3126}
3127
3128div.mainDialog div.header div.title.disabled:hover input {
3129 border: 1px solid #cccec0;
3130 background-color: #cccec0;
3131}
3132
3133div.mainDialog div.body {
3134 padding-top: 0px;
3135 padding-left: 10px;
3136 padding-right: 9px;
3137 min-height: 200px;
3138 background: url(../images/old/cardDialog/background_body.png) repeat-y;
3139}
3140
3141div.mainDialog div.body div.mask {
3142 display: none;
3143}
3144
3145div.mainDialog.loading div.body div.mask {
3146 display: block;
3147 position: absolute;
3148 top: 55px;
3149 left: 10px;
3150 right: 9px;
3151 bottom: 70px;
3152 z-index:1001;
3153 background-color: white;
3154 padding-left: 146px;
3155 padding-right: 146px;
3156 padding-top: 70px;
3157}
3158
3159div.mainDialog.loading div.body .tabPanels {
3160 display: none;
3161}
3162
3163div.mainDialog.loading div.body div.mask h3.progressDescription {
3164 margin: 0px;
3165 text-align: center;
3166 padding-bottom: 10px;
3167 color: #cccec0;
3168 font-size: 14pt;
3169 font-weight: normal;
3170}
3171
3172div.loadingBar {
3173 height: 22px;
3174 width: 214px;
3175 background: url(../images/old/loading/loadingBar.gif) no-repeat center top;
3176}
3177
3178div.loadingBar div.loadingBarProgressBox {
3179 padding: 2px;
3180}
3181
3182div.loadingBar div.loadingBarProgress {
3183 height:18px;
3184 width: 0%;
3185 /* background-repeat: no-repeat;*/
3186 background-color: rgba(248,79,0,0.6);
3187 -webkit-border-radius: 9px;
3188 -moz-border-radius: 9px;
3189 border-radius: 9px;
3190}
3191
3192/*
3193div.loadingBar div.loadingBarProgress div.loadingBarProgress_left {
3194 height: 100%;
3195 max-width: 8px;
3196 background: url(../images/old/loading/loadingBarProgress.png) no-repeat 0;
3197}
3198
3199div.loadingBar div.loadingBarProgress div.loadingBarProgress_right {
3200 position: relative;
3201 height: 100%;
3202 margin-left: 8px;
3203 background: url(../images/old/loading/loadingBarProgress.png) no-repeat right;
3204 top: -22px;
3205}
3206*/
3207
3208div.mainDialog div.body div ul {
3209 padding: 0px;
3210 clear: both;
3211 margin: 0px;
3212 list-style-type: none;
3213}
3214
3215div.mainDialog div.body div.tabs {
3216 height: 20px;
3217}
3218
3219div.mainDialog div.body div.tabs ul.tabs {
3220 height: 33px;
3221 /*border-bottom: 1px solid #515247;*/
3222 /*background: #cccec0 url(../images/old/cardDialog/tabs_shadow.png) repeat-x 0 -5px;*/
3223 background: url(../images/old/cardDialog/tabs_background.png) repeat-x;
3224}
3225
3226div.mainDialog div.body div.tabs ul.tabs li {
3227 /* width: 150px;*/
3228 height: 32px;
3229 font-size: 11pt;
3230 text-align: center;
3231 border-right: 1px solid #515247;
3232 float: left;
3233 color: #787872;
3234 border-bottom: 1px solid #515247;
3235
3236 background: #cccec0 url(../images/old/cardDialog/tabs_shadow.png) repeat-x 0 -5px;
3237 cursor: pointer;
3238}
3239
3240div.mainDialog div.body div.tabs ul.tabs li div {
3241 display: none;
3242}
3243
3244div.mainDialog div.body div.tabs ul.tabs li span {
3245 display: block;
3246 padding-top: 9px;
3247 padding-bottom: 6px;
3248 padding-left: 40px;
3249 padding-right: 40px;
3250}
3251
3252div.mainDialog div.body div.tabs ul.tabs li:hover {
3253 color: #515247;
3254}
3255
3256div.mainDialog div.body div.tabs ul.tabs li.disabled:hover {
3257 color: #787872;
3258 cursor: default;
3259}
3260
3261div.mainDialog div.body div.tabs ul.tabs li.selected {
3262 color: #515247;
3263 background-color: #f1f2e9;
3264 border-bottom: 1px solid #f1f2e9;
3265 cursor: default;
3266}
3267
3268div.mainDialog div.body div.tabs ul.tabs li.selected.disabled:hover {
3269 color: #515247;
3270}
3271
3272div.mainDialog div.body div.tabs ul.tabs li.selected div.backToDirectLoginList {
3273 position: absolute;
3274 display: block;
3275 top: 63px;
3276 left: 140;
3277 width: 20px;
3278}
3279
3280div.mainDialog div.body div.tabs ul.tabs li.selected div.addDirectLoginButton {
3281 position: absolute;
3282 display: block;
3283 top: 63px;
3284 left: 265px;
3285
3286 width: 20px;
3287}
3288
3289div.mainDialog div.body div.tabs ul.tabs li.selected div span {
3290 padding: 0px;
3291 margin: 0px;
3292}
3293
3294div.mainDialog div.body div.tabs ul.tabs li.selected div:hover {
3295 cursor: pointer;
3296}
3297
3298div.mainDialog div.body .tabPanels {
3299 clear: both;
3300}
3301
3302div.mainDialog div.body ul.tabPanels li.tabPanel {
3303 display: none;
3304}
3305
3306div.mainDialog div.body ul.tabPanels li.tabPanel.selected {
3307 display: block;
3308}
3309
3310div.mainDialog div.body ul.tabPanels li.tabPanel.selected h2 {
3311 margin: 0px;
3312 text-align: center;
3313 padding-top: 50px;
3314 color: #787872;
3315}
3316
3317div.mainDialog div.body ul.tabPanels li.tabPanel.selected div.wizardStepDescription {
3318 margin: 0px 20px 10px;
3319 font-size: 10pt;
3320 color: b0b0b0;
3321 font-style: italic;
3322 text-align: center;
3323}
3324
3325div.mainDialog div.footer {
3326 height: 70px;
3327 background: url(../images/old/cardDialog/background_footer.png) no-repeat 0 -14px;
3328}
3329
3330div.mainDialog div.footer div.buttonArea {
3331 padding-left: 40px;
3332 padding-right: 40px;
3333 padding-top: 15px;
3334}
3335
3336div.mainDialog div.footer div.buttonArea div {
3337 padding-left: 20px;
3338 padding-right: 20px;
3339 float: left;
3340
3341 font-weight: bold;
3342 color: #787872;
3343}
3344
3345div.mainDialog div.footer div.buttonArea div.disabled {
3346 color: #b1b1a8;
3347}
3348
3349div.mainDialog div.footer div.buttonArea div.disabled:hover {
3350 color: #b1b1a8;
3351 cursor: default;
3352}
3353
3354div.mainDialog div.footer div.buttonArea div:hover {
3355 color: #515247;
3356 cursor: pointer;
3357}
3358
3359div.mainDialog div.footer div.buttonArea div.save {
3360 float: right;
3361}
3362
3363
3364/* @end */
3365
3366/* @group Card Dialog */
3367
3368div.addDirectLoginButton {
3369 height: 20px;
3370 width: 20px;
3371 background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat -9px -9px;
3372 color: white;
3373 font-weight: bold;
3374}
3375
3376div.addDirectLoginButton span {
3377 display: block;
3378 height: 20px;
3379 width: 20px;
3380}
3381
3382div.addDirectLoginButton:hover {
3383 background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat -9px -9px;
3384}
3385
3386/* @group Card Dialog - Direct Login */
3387
3388div.directLoginsComponentContainer {
3389 overflow: hidden;
3390 /* background-color: green;*/
3391}
3392
3393div.CardDialog div.directLogins {
3394 /* background-color: yellow;*/
3395 padding-top: 2px;
3396}
3397
3398div.CardDialog div.addNewDirectLoginSplash {
3399 margin: 0px 80px;
3400}
3401
3402div.CardDialog div.addNewDirectLoginSplash h3 {
3403 color: #aaaaaa;
3404 text-align: center;
3405 font-weight: normal;
3406 font-size: 11pt;
3407}
3408
3409div.CardDialog div.addNewDirectLoginSplash a {
3410 display: block;
3411 text-decoration: none;
3412 margin-left: auto;
3413 margin-right: auto;
3414 width: 190px;
3415 /* color: #787878;*/
3416 color: rgba(255,98,6,0.75);
3417 text-transform: uppercase;
3418 background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat right;
3419}
3420
3421div.CardDialog div.addNewDirectLoginSplash a span {
3422 text-align: center;
3423}
3424
3425div.CardDialog div.addNewDirectLoginSplash a:hover {
3426 color: #ff6206;
3427 background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat right;
3428}
3429
3430div.CardDialog div.directLoginItem {
3431 clear: both;
3432 min-height: 32px;
3433 padding-left: 10px;
3434 padding-top: 4px;
3435 padding-bottom: 2px;
3436
3437 /* width: 100px;*/
3438 max-height: 32px;
3439 overflow: hidden;
3440}
3441
3442div.CardDialog div.directLoginItem:hover {
3443 background-color: #cccec0;
3444}
3445
3446div.CardDialog div.addDirectLoginListItem {
3447 min-height: 32px;
3448 padding-left: 10px;
3449 padding-top: 4px;
3450 padding-bottom: 2px;
3451
3452 max-height: 32px;
3453 overflow: hidden;
3454
3455 background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat 22px 0;
3456}
3457
3458div.CardDialog div.addDirectLoginListItem a {
3459 display: block;
3460 font-size: 11pt;
3461 padding-top: 6px;
3462 padding-left: 50px;
3463 color: rgba(255,98,6,0.75);
3464 text-decoration: none;
3465 text-transform: uppercase;
3466}
3467
3468div.CardDialog div.addDirectLoginListItem:hover {
3469 background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat 22px 0;
3470 color: #ff6206;
3471 background-color: #cccec0;
3472}
3473
3474div.CardDialog div.addDirectLoginListItem:hover {
3475}
3476
3477
3478div.CardDialog div.directLoginItem div.cardDialogRecordDirectLoginComponent_favicon img.favicon {
3479 width: 32px;
3480 height: 32px;
3481 float: left;
3482}
3483div.CardDialog div.directLoginItem div.cardDialogRecordDirectLoginComponent_label input {
3484 float: left;
3485 font-size: 11pt;
3486 border: 0px;
3487 padding: 5px;
3488 color: #787872;
3489 border: 1px solid #ededeb;
3490 background-color: #ededeb;
3491 height: 30px;
3492 margin-left: 10px;
3493 width: 68%;
3494 margin-right: 5px;
3495}
3496
3497div.CardDialog div.directLoginItem:hover div.cardDialogRecordDirectLoginComponent_label input {
3498 border: 1px solid #515247;
3499 background-color: #b5b7ab;
3500}
3501
3502div.CardDialog div.directLoginItem > div.open {
3503 float: left;
3504 margin-top: 5px;
3505 margin-right: 2px;
3506 padding-left: 5px;
3507 visibility: hidden;
3508}
3509
3510div.CardDialog div.directLoginItem > div.edit,
3511div.CardDialog div.directLoginItem > div.delete {
3512 float: left;
3513 margin-top: 5px;
3514 margin-left: 3px;
3515 padding-left: 5px;
3516 visibility: hidden;
3517}
3518
3519div.CardDialog div.directLoginItem > div.open a {
3520 display: block;
3521 width: 22px;
3522 height: 22px;
3523 background: url(../images/old/cardDialog/openDirectLogin.png) no-repeat 0 -2px;
3524}
3525
3526div.CardDialog div.directLoginItem > div.open a:hover {
3527 background: url(../images/old/cardDialog/openDirectLogin_selected.png) no-repeat 0 -2px;
3528}
3529
3530div.CardDialog div.directLoginItem:hover > div.open,
3531div.CardDialog div.directLoginItem:hover > div.edit,
3532div.CardDialog div.directLoginItem:hover > div.delete {
3533 visibility: visible;
3534}
3535
3536div.CardDialog div.directLoginItem div.edit span {
3537 padding-right: 6px;
3538 display: block;
3539}
3540
3541div.CardDialog div.directLoginItem div.open span a,
3542div.CardDialog div.directLoginItem div.edit span a,
3543div.CardDialog div.directLoginItem div.delete span a {
3544 font-size: 8pt;
3545 color: #666666;
3546 text-decoration: none;
3547 line-height: 19px;
3548}
3549
3550div.CardDialog div.directLoginItem div.edit:hover {
3551 background: url(../images/old/new_background_left.png) no-repeat;
3552}
3553
3554div.CardDialog div.directLoginItem div:hover span a {
3555 color: white;
3556}
3557
3558div.CardDialog div.directLoginItem div.edit:hover span {
3559 background: url(../images/old/new_background.png) no-repeat right center;
3560}
3561
3562div.CardDialog div.directLoginItem div.delete:hover {
3563 background: url(../images/old/delete_background_left.png) no-repeat;
3564}
3565
3566div.CardDialog div.directLoginItem div.delete:hover span {
3567 background: url(../images/old/delete_background.png) right;
3568}
3569
3570/* @group Direct Login Editing */
3571
3572div.CardDialog div.directLoginEditDetail {
3573 position: relative;
3574 /* background-color: red;*/
3575}
3576
3577/*
3578div.CardDialog div.directLoginEditDetail div.back {
3579 float: left;
3580 width: 30px;
3581}
3582
3583div.CardDialog div.directLoginEditDetail div.back a {
3584 display: block;
3585 padding: 5px;
3586 text-decoration: none;
3587 font-weight: bold;
3588 font-size: 14pt;
3589 color: #cccec0;
3590
3591 background: url(../images/old/cardDialog/back.png) no-repeat 5px 14px;
3592 width: 20px;
3593 height: 200px;
3594}
3595
3596div.CardDialog div.directLoginEditDetail div.back a:hover {
3597 color: #7f7872;
3598 background: url(../images/old/cardDialog/back_selected.png) no-repeat 5px 14px;
3599}
3600*/
3601
3602
3603form.directLoginEditingForm div.title,
3604form.directLoginEditingForm div.favicon {
3605 padding: 5px 10px;
3606}
3607
3608form.directLoginEditingForm div.title.disabled:hover {
3609 background-color: #f1f2e9;
3610}
3611
3612form.directLoginEditingForm div.title:hover,
3613form.directLoginEditingForm div.favicon:hover {
3614 background-color: #cccec0;
3615}
3616
3617form.directLoginEditingForm div.title input {
3618 /* width: 100%; */
3619 margin: 0px;
3620 margin-left: 10px;
3621 width: 440px;
3622}
3623
3624form.directLoginEditingForm div.favicon {
3625 padding-left: 10px;
3626}
3627
3628/*form.directLoginEditingForm div.favicon img.favicon {*/
3629form.directLoginEditingForm img.favicon {
3630 float: left;
3631 width: 32px;
3632 height: 32px;
3633}
3634
3635form.directLoginEditingForm div.favicon input {
3636 margin-top: 1px;
3637 width: 465px;
3638}
3639
3640form.directLoginEditingForm div.disabled:hover input,
3641form.directLoginEditingForm div input {
3642 font-size: 11pt;
3643 border: 0px;
3644 padding: 5px;
3645 color: #787872;
3646 border: 1px solid #ededeb;
3647 background-color: #ededeb;
3648 height: 30px;
3649}
3650
3651form.directLoginEditingForm div:hover input {
3652 border: 1px solid #515247;
3653 background-color: #b5b7ab;
3654}
3655
3656/* @group Bindings */
3657
3658div.bindings div.binding > span.formFieldName {
3659 display: inline-block;
3660 width: 140px;
3661 overflow: hidden;
3662 margin-right: 10px;
3663 color: #6b5147;
3664 text-overflow:ellipsis;
3665}
3666
3667div.bindings div.binding {
3668 padding-bottom: 3px;
3669}
3670
3671div.bindings div.binding > input {
3672 margin-right: 10px;
3673 background: #cccec0;
3674 width: 150px;
3675 border: 1px solid #cccec0;
3676}
3677
3678div.bindings div.binding:hover > input {
3679 border: 1px solid #cccec0;
3680}
3681
3682div.bindings div.binding > select {
3683 font-size: 13pt;
3684}
3685
3686div.bindings div.binding span.fieldLock {
3687 display: inline-block;
3688 width: 20px;
3689 height: 20px;
3690 margin-right: 3px;
3691}
3692
3693div.bindings div.binding.showLocked input {
3694 background: url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3695 /* color: black;*/
3696 overflow: hidden;
3697
3698 background: #cccec0 url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3699 color: rgba(237,237,235,0.1);
3700}
3701
3702div.bindings div.binding span.fieldLock a {
3703 display: none;
3704}
3705
3706div.bindings div.binding.locked span.fieldLock {
3707}
3708
3709div.bindings div.binding.locked span.fieldLock a {
3710 display: block;
3711 width: 20px;
3712 height: 20px;
3713 text-decoration: none;
3714
3715 background-image: url(../images/old/cardDialog/lock_open.png);
3716}
3717
3718div.bindings div.binding.locked.showLocked span.fieldLock a {
3719 background-image: url(../images/old/cardDialog/lock_closed.png);
3720 text-decoration: none;
3721}
3722
3723/* @end */
3724
3725/* @group FormValues */
3726
3727div.formValues {
3728 padding-top: 15px;
3729}
3730
3731div.formValues div.formValue div {
3732 margin: 0px;
3733 display: inline-block;
3734}
3735
3736div.formValues div.formValue > span.formFieldName {
3737 display: inline-table;
3738 width: 160px;
3739 overflow: hidden;
3740 margin-right: 10px;
3741 color: #6b5147;
3742}
3743
3744/* @end */
3745
3746
3747/* @group FormValues */
3748/*
3749div.formValues {
3750 padding-top: 15px;
3751}
3752
3753div.formValues div.formValue > span.formFieldName {
3754 display: inline-table;
3755 width: 150px;
3756 overflow: hidden;
3757 margin-right: 35px;
3758 color: #6b5147;
3759}
3760
3761div.formValues div.formValue > select {
3762 padding-left: 20px;
3763}
3764*/
3765/* @end */
3766
3767/* @group Panels */
3768
3769div.directLoginEditing {
3770 padding-top: 2px;
3771}
3772
3773div.directLoginEditing div.tabContainer {
3774 min-height: 150px;
3775 height: 200px;
3776}
3777
3778div.directLoginEditing div.tabContainer > ul.tabs {
3779 display: none;
3780}
3781
3782/*
3783div.directLoginEditing li.configuration,
3784div.directLoginEditing li.bindings,
3785div.directLoginEditing li.favicon {
3786 padding: 10px;
3787}
3788*/
3789div.directLoginEditing li {
3790 padding: 10px;
3791}
3792
3793div.directLoginEditing li.configuration > .bookmarkletConfigurationWrapper > textarea {
3794 float: left;
3795 width: 320px;
3796 height: 125px;
3797 font-family: monospace;
3798 font-weight: normal;
3799 font-size: 8pt;
3800 border: 1px solid #ccc;
3801}
3802
3803div.directLoginEditing li.configuration > .bookmarkletConfigurationWrapper .bookmarkletComponent {
3804 float: right;
3805}
3806
3807div.directLoginEditing li.configuration > textarea.error {
3808 border: 1px solid red;
3809 background-color: rgba(255,0,0,0.1);
3810}
3811
3812/*
3813div.directLoginEditing > form.directLoginEditingForm > div.tabContainer {
3814 padding-top: 10px;
3815}
3816
3817div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li {
3818 float: left;
3819 padding-left: 10px;
3820 padding-right: 10px;
3821 display: block;
3822 font-size: 10pt;
3823 color: #787872;
3824 cursor: pointer;
3825
3826 height: 22px;
3827 text-align: center;
3828 border-right: 1px solid #aaa;
3829 border-bottom: 1px solid #aaa;
3830 border-top: 1px solid #aaa;
3831
3832 background-color: #cccec0;
3833}
3834
3835div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li:first-child {
3836 border-left: 1px solid #aaa;
3837}
3838
3839div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs {
3840 height: 23px;
3841 padding-left: 10px;
3842 border-bottom: 1px solid #aaa;
3843 margin-left: 10px;
3844 margin-right: 10px;
3845}
3846
3847div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li > span {
3848 line-height: 23px;
3849}
3850
3851div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li.selected {
3852 color: #6a5147;
3853 cursor: default;
3854 border-bottom: 1px solid #f1f2e9;
3855 background-color: #f1f2e9;
3856}
3857
3858div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li:hover {
3859 color: #6a5147;
3860}
3861
3862div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabPanels {
3863 padding-bottom: 5px;
3864 margin-left: 10px;
3865 margin-right: 10px;
3866}
3867
3868div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabPanels > li.selected {
3869 border-bottom: 1px solid #aaa;
3870 border-left: 1px solid #aaa;
3871 border-right: 1px solid #aaa;
3872}
3873
3874div.directLoginEditing li.configuration {
3875 padding: 5px;
3876}
3877
3878div.directLoginEditing li.configuration > textarea {
3879 width: 100%;
3880 height: 100px;
3881 font-family: monospace;
3882 font-weight: normal;
3883 font-size: 8pt;
3884}
3885*/
3886/* @end */
3887
3888/* @end */
3889
3890/* @end */
3891
3892/* @group Card Dialog FIELDS */
3893
3894div.CardDialog div.body {
3895 padding-bottom: 1px;
3896}
3897
3898div.CardDialog div.body table.fields {
3899 width: 100%;
3900 padding-top: 8px;
3901 padding-bottom: 1px;
3902}
3903
3904div.CardDialog div.body table.fields thead {
3905 background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 15px;
3906}
3907
3908div.CardDialog div.body table.fields tfoot {
3909 background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 bottom;
3910}
3911
3912div.CardDialog div.body table.fields thead th {
3913 text-align: left;
3914 font-weight: normal;
3915 font-size: 9pt;
3916 color: #787872;
3917 padding-left: 10px;
3918 padding-bottom: 3px;
3919
3920/*
3921 border-bottom: 1px dotted;
3922*/
3923}
3924
3925
3926div.CardDialog div.body table.fields thead th.fieldStateTH {
3927 width: 10px;
3928}
3929
3930div.CardDialog div.body table.fields thead th.fieldLabelTH {
3931}
3932
3933div.CardDialog div.body table.fields tbody td.fieldLabel input {
3934 width: 130px;
3935}
3936
3937div.CardDialog div.body table.fields thead th.fieldLockTH {
3938 width: 10px;
3939}
3940
3941
3942div.CardDialog div.body table.fields thead th.fieldValueTH {
3943}
3944
3945div.CardDialog div.body table.fields tbody td.fieldValue input {
3946 width: 280px;
3947}
3948
3949div.CardDialog div.body table.fields thead th.fieldActionTH {
3950 width: 30px;
3951}
3952
3953div.CardDialog div.body table.fields tbody td.fieldAction div {
3954}
3955
3956div.CardDialog div.body table.fields thead th.fieldDeleteTH {
3957 width: 40px;
3958}
3959
3960div.CardDialog div.body table.fields tbody tr:hover,
3961div.CardDialog div.body table.fields tbody tr.selectedField {
3962 background-color: #cccec0;
3963}
3964
3965div.CardDialog div.body table.fields tbody tr td {
3966 font-size: 11pt;
3967 color: #787872;
3968 height: 35px;
3969}
3970
3971
3972div.CardDialog div.body table.fields tbody tr td input {
3973 font-size: 11pt;
3974 border: 0px;
3975 padding: 5px;
3976 color: #787872;
3977 border: 1px solid #ededeb;
3978 background-color: #ededeb;
3979 height: 30px;
3980}
3981/*
3982div.CardDialog div.body table.fields tbody tr td.fieldValue div {
3983 margin-right: 10px;
3984}
3985
3986div.CardDialog div.body table.fields tbody tr td.fieldValue div input {
3987 width: 100%;
3988}
3989*/
3990div.CardDialog div.body table.fields tbody tr td.fieldValue div.locked input {
3991 background: #ededeb url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px;
3992 color: #ededeb;
3993 color: rgba(237,237,235,0.1);
3994 /* color: black;*/
3995 /* line-height: 100px;*/
3996 overflow: hidden;
3997}
3998
3999div.locked input.value::-moz-selection {
4000 background: #ff0000;
4001}
4002
4003div.locked input.value::selection {
4004 background: #ff0000;
4005}
4006
4007
4008div.CardDialog div.body table.fields tbody tr.new.selectedField td input,
4009div.CardDialog div.body table.fields tbody tr.new:hover td input,
4010div.CardDialog div.body table.fields tbody tr:hover td input,
4011div.CardDialog div.body table.fields tbody tr.selectedField td input {
4012 border: 1px solid #515247;
4013 background-color: #b5b7ab;
4014}
4015
4016div.CardDialog div.body table.fields tbody tr:hover td.fieldValue div.locked input,
4017div.CardDialog div.body table.fields tbody tr.selectedField td.fieldValue div.locked input {
4018 background: #b5b7ab url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px;
4019 color: #b5b7ab;
4020 color: rgba(237,237,235,0.1);
4021}
4022
4023
4024
4025div.CardDialog div.body table.fields tbody td.fieldLock div {
4026 width: 20px;
4027 height: 19px;
4028 cursor: pointer;
4029}
4030
4031div.CardDialog div.body table.fields tbody tr:hover td.fieldLock div.locked {
4032 background-image: url(../images/old/cardDialog/lock_closed.png);
4033}
4034
4035div.CardDialog div.body table.fields tbody tr:hover td.fieldLock div.unlocked {
4036 background-image: url(../images/old/cardDialog/lock_open.png);
4037}
4038
4039div.CardDialog div.body table.fields tbody tr td.fieldAddDelete div span a {
4040 text-decoration: none;
4041 visibility: hidden;
4042 font-size: 8pt;
4043 vertical-align: -13px;
4044 color: black;
4045}
4046
4047div.CardDialog div.body table.fields tbody tr.selectedField td.fieldAddDelete div span a {
4048 visibility: visible;
4049}
4050
4051div.CardDialog div.body table.fields tbody tr:hover td.fieldAddDelete div span a {
4052 visibility: visible;
4053}
4054
4055div.CardDialog div.body table.fields tbody tr:hover td.fieldAddDelete div:hover span a {
4056 color: white;
4057}
4058
4059
4060div.CardDialog div.body div.notes {
4061 background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 0;
4062 padding-top: 2px;
4063}
4064
4065div.CardDialog div.body div.notes div {
4066 padding-left: 20px;
4067 padding-right: 20px;
4068 padding-top: 4px;
4069 padding-bottom: 4px;
4070}
4071
4072div.CardDialog div.body div.notes div:hover,
4073div.CardDialog div.body div.notes.selectedField div {
4074 background-color: #cccec0;
4075}
4076
4077div.CardDialog.loading div.body div.notes div textarea {
4078 display: none;
4079}
4080
4081div.CardDialog div.body div.notes div textarea {
4082 border: 0;
4083 width: 470px;
4084/*
4085 width: 100%;
4086 height: 100px;
4087 min-height: 400px;
4088 overflow: hidden;
4089*/
4090 color: #787872;
4091 border: 1px solid #ededeb;
4092 background-color: #ededeb;
4093 display: block;
4094 line-height: 12pt;
4095 min-height: 50px;
4096}
4097
4098div.CardDialog div.body div.notes div:hover textarea,
4099div.CardDialog div.body div.notes.selectedField div textarea {
4100 border: 1px solid #515247;
4101 background-color: #b5b7ab;
4102}
4103
4104
4105div.CardDialog div.body table.fields tbody tr td.fieldAction {
4106 /* background-color: red;*/
4107 padding-left: 4px
4108}
4109
4110div.CardDialog div.body table.fields tbody tr td.fieldAction a {
4111 display: inline-block;
4112 text-decoration: none;
4113 text-align: center;
4114 width: 16px;
4115 height: 16px;
4116}
4117
4118div.CardDialog div.body table.fields tbody tr td.fieldAction a.email {
4119 background: url(../images/old/cardDialog/fieldTypes/email.png) no-repeat 0 0;
4120}
4121
4122div.CardDialog div.body table.fields tbody tr td.fieldAction a.email:hover {
4123 background: url(../images/old/cardDialog/fieldTypes/email_selected.png) no-repeat 0 0;
4124}
4125
4126div.CardDialog div.body table.fields tbody tr td.fieldAction a.url {
4127 background: url(../images/old/cardDialog/fieldTypes/url.png) no-repeat 0 0;
4128}
4129
4130div.CardDialog div.body table.fields tbody tr td.fieldAction a.url:hover {
4131 background: url(../images/old/cardDialog/fieldTypes/url_selected.png) no-repeat 0 0;
4132}
4133
4134div.CardDialog div.body table.fields tbody tr td.fieldAction a.password {
4135 background: url(../images/old/cardDialog/fieldTypes/password.png) no-repeat 0 0;
4136}
4137
4138div.CardDialog div.body table.fields tbody tr td.fieldAction a.password:hover {
4139 background: url(../images/old/cardDialog/fieldTypes/password_selected.png) no-repeat 0 0;
4140}
4141
4142/*
4143/ *div.CardDialog div.body table.fields tbody* / tr.new {
4144 background: yellow;
4145}
4146
4147div.CardDialog div.body table.fields tbody tr.new td input {
4148 border: 1px solid red;
4149 background-color: green;
4150}
4151*/
4152/* @end */
4153
4154
4155
4156/* @end */
4157
4158div#disabledZone {
4159 display: block;
4160 visibility: visible;
4161}
4162
4163div#messageZone {
4164 display: block;
4165 visibility: visible;
4166}
4167
4168
4169div.CardDialog div.error div.img {
4170 margin: 10px;
4171 width: 50px;
4172 height: 50px;
4173 float: left;
4174
4175 background-image: url(../images/old/simpleMessageBox/Alert.png);
4176}
4177
4178/* @group Ruler */
4179/*
4180div.rulerExtraWrapper {
4181 position: absolute;
4182 top: 0px;
4183 left: 0px;
4184 width: 100%;
4185 height: 100%;
4186 overflow: hidden;
4187 background-color: rgba(255, 0, 0, 0.2);
4188 z-index: 24999;
4189}
4190*/
4191
4192div.rulerWrapper {
4193 left: -1000px;
4194 margin-top: -30px;
4195 margin-left: 50%;
4196 z-index: 25000;
4197}
4198
4199div.rulerWrapper.fixed {
4200 position: fixed;
4201}
4202
4203div.rulerWrapper.scrollable {
4204 position: absolute;
4205}
4206
4207div.ruler {
4208 /* position: absolute;*/
4209 width: 541px;
4210 height: 96px;
4211 margin-left: -270px;
4212
4213 background: url(../images/old/ruler/ruler.png) no-repeat;
4214}
4215
4216div.ruler a {
4217 position: absolute;
4218 display: block;
4219
4220 width: 15px;
4221 height: 15px;
4222 top: 3px;
4223 text-decoration: none;
4224}
4225
4226div.ruler a.exit {
4227 margin-left: 2px;
4228 background: url(../images/old/ruler/exit.png) no-repeat;
4229}
4230
4231div.ruler a.exit:hover {
4232 background: url(../images/old/ruler/exit_selected.png) no-repeat;
4233}
4234
4235div.ruler a.smallButton.previous {
4236 right: 16px;
4237 background: url(../images/old/ruler/small_previous.png) no-repeat;
4238}
4239
4240div.ruler a.smallButton.previous:hover {
4241 cursor: pointer;
4242 background: url(../images/old/ruler/small_previous_selected.png) no-repeat;
4243}
4244
4245div.ruler a.smallButton.previous.disabled,
4246div.ruler a.smallButton.previous.disabled:hover {
4247 cursor: default;
4248 background: url(../images/old/ruler/small_previous_disabled.png) no-repeat;
4249}
4250
4251div.ruler a.smallButton.next {
4252 right: 3px;
4253 background: url(../images/old/ruler/small_next.png) no-repeat;
4254}
4255
4256div.ruler a.smallButton.next:hover {
4257 cursor: pointer;
4258 background: url(../images/old/ruler/small_next_selected.png) no-repeat;
4259}
4260
4261div.ruler a.smallButton.next.disabled,
4262div.ruler a.smallButton.next.disabled:hover {
4263 cursor: default;
4264 background: url(../images/old/ruler/small_next_disabled.png) no-repeat;
4265}
4266
4267div.ruler div.steps, div.ruler div.dots {
4268 position: absolute;
4269 background-color: rgba(255,255,255,0);
4270
4271 margin-left: 30px;
4272 margin-right: 30px;
4273}
4274
4275div.ruler div.steps {
4276 top: 25px;
4277 height: 30px;
4278}
4279
4280div.ruler div.dots {
4281 top: 58px;
4282 height: 25px;
4283}
4284
4285div.ruler div ul {
4286 list-style-type: none;
4287 margin: 0px;
4288 padding: 0px;
4289}
4290
4291div.ruler div ul li {
4292 display: inline-block;
4293 vertical-align: top;
4294}
4295
4296div.ruler > div.steps > ul > li:first-child,
4297div.ruler > div.dots > ul > li:first-child {
4298 margin-left: 0px;
4299}
4300
4301div.ruler div.steps_3 ul li {
4302 margin-left: 135px;
4303}
4304
4305div.ruler div.steps_4 ul li {
4306 margin-left: 67px;
4307}
4308
4309div.ruler div.steps_5 ul li {
4310 margin-left: 32px;
4311}
4312
4313div.ruler div.steps_6 ul li {
4314 margin-left: 12px;
4315}
4316
4317div.ruler div ul li span {
4318 font-weight: bold;
4319 text-align: center;
4320 width: 70px;
4321 display: block;
4322 font-size: 8pt;
4323 overflow: hidden;
4324 color: rgba(0, 0, 0, 0.3);
4325}
4326
4327div.ruler div ul li.selected span {
4328 color: black;
4329}
4330
4331div.ruler div.steps ul li span {
4332}
4333
4334div.ruler div.dots ul li span {
4335/*
4336 text-align: center;
4337 width: 26px;
4338 margin-left: 22px;
4339 margin-right: 22px;
4340 height: 25px;
4341 background-color: #e57218;
4342*/
4343 font-size: 40pt;
4344 line-height: 47px;
4345}
4346
4347div.ruler div.marker {
4348 position: absolute;
4349 top: -3px;
4350 /* left: -246px;*/
4351}
4352div.ruler div.marker div.markerBody {
4353 width: 77px;
4354 height: 97px;
4355 background: url(../images/old/ruler/marker.png) no-repeat;
4356}
4357
4358div.ruler div.marker div.next {
4359 position: absolute;
4360 top: 25px;
4361 left: 76px;
4362 width: 27px;
4363 height: 65px;
4364 background: url(../images/old/ruler/next.png) no-repeat -13px;
4365
4366 z-index: 26000;
4367}
4368
4369div.ruler div.marker div.next:hover {
4370 cursor: pointer;
4371 background: url(../images/old/ruler/next.png) no-repeat -2px;
4372}
4373
4374div.ruler div.marker div.disabled {
4375 display: none;
4376}
4377
4378div.ruler div.marker div.previous {
4379 position: absolute;
4380 top: 25px;
4381 left: -24px;
4382 width: 27px;
4383 height: 65px;
4384 /* background: url(../images/old/ruler/previous.png) no-repeat 13px 1px;*/
4385 background: url(../images/old/ruler/previous.png) no-repeat 18px 1px;
4386
4387 z-index: 26000;
4388}
4389
4390div.ruler div.marker div.previous:hover {
4391 cursor: pointer;
4392 /* background: url(../images/old/ruler/previous.png) no-repeat 2px 1px;*/
4393 background: url(../images/old/ruler/previous.png) no-repeat 7px 1px;
4394}
4395
4396/* @end */
4397
4398div.createNewCardSplash {
4399 margin-top: -450px;
4400 margin-left: 250px;
4401 width: 354px;
4402 float: left;
4403 height: 186px;
4404
4405 text-align: center;
4406 background: url(../images/old/main/grid/createNewCardSplash.png) no-repeat;
4407}
4408
4409div.createNewCardSplash:hover {
4410 cursor: pointer;
4411 background: url(../images/old/main/grid/createNewCardSplash_selected.png) no-repeat;
4412}
4413
4414div.createNewCardSplash span {
4415 display: block;
4416 padding-top: 130px;
4417 font-size: 14pt;
4418 color: #9a9586;
4419}
4420
4421div.createNewCardSplash:hover span {
4422 color: #605c4e;
4423}
4424
4425
4426
4427/*=============================================*/
4428
4429div.NewUserCreation div.tabContainer {
4430 min-height: 150px;
4431 height: 200px;
4432}
4433
4434div.NewUserCreation div.tabContainer > ul.tabs {
4435 display: none;
4436}
4437
4438ul.createUserStates li.creating {
4439 background: url(../images/old/creatingUser.gif) no-repeat center center;
4440}
4441
4442ul.createUserStates li {
4443 height: 100px;
4444}
4445
4446ul.createUserStates li span {
4447 display: block;
4448 width: 100%;
4449 text-align: center;
4450 color: #999;
4451 font-style: italic;
4452}
4453
4454div.NewUserCreation form.newUserCreationForm ul.tabPanels {
4455 padding-top: 10px;
4456}
4457
4458div.NewUserCreation form.newUserCreationForm ul ul {
4459 margin-left: auto;
4460 margin-right: auto;
4461 width: 400px;
4462}
4463
4464div.NewUserCreation form.newUserCreationForm ul.credentials li {
4465 height: 45px;
4466}
4467
4468div.NewUserCreation form.newUserCreationForm ul.credentials span.label {
4469 text-align: right;
4470 display: inline-block;
4471 font-size: 12pt;
4472 color: #787872;
4473 width: 110px;
4474 vertical-align: baseline;
4475}
4476
4477div.NewUserCreation form.newUserCreationForm ul.credentials input {
4478 font-size: 13pt;
4479 color: #787872;
4480 height: 35px;
4481 margin-left: 15px;
4482 padding-left: 5px;
4483}
4484
4485div.NewUserCreation form.newUserCreationForm ul.termsOfService li {
4486 padding: 0 0 15 0;
4487}
4488
4489div.NewUserCreation form.newUserCreationForm ul.termsOfService input {
4490 display: inline-block;
4491}
4492
4493div.NewUserCreation form.newUserCreationForm ul.termsOfService .label {
4494 display: inline-block;
4495 text-align: left;
4496 font-size: 12pt;
4497 color: #787872;
4498 width: 350px;
4499 vertical-align: top;
4500 padding-left: 10px
4501}
4502
4503div.NewUserCreation form.newUserCreationForm ul.termsOfService a {
4504 font-weight: bold;
4505 color: #787872;
4506 text-decoration: none;
4507}
4508div.NewUserCreation form.newUserCreationForm ul.termsOfService a:hover {
4509 color: #444;
4510}
4511
4512div.NewUserCreation form.newUserCreationForm ul.createUserStates li.done span {
4513 font-size: 16pt;
4514 color: green;
4515}
4516
4517div.NewUserCreation form.newUserCreationForm ul.createUserStates li.fail span {
4518 font-size: 16pt;
4519 color: red;
4520} \ No newline at end of file
diff --git a/frontend/gamma/css/clipperz/compact.css b/frontend/gamma/css/clipperz/compact.css
new file mode 100644
index 0000000..7c9252a
--- a/dev/null
+++ b/frontend/gamma/css/clipperz/compact.css
@@ -0,0 +1,162 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29/* @override https://www.example.com/css/compact.css */
30
31body.compact div#mainDiv {
32/*
33 width: 250px;
34 height: 95%;
35 border: 1px solid #333366;
36*/
37 padding: 0px;
38}
39
40body.compact div#compactHeader {
41 background-color: #333366;
42}
43
44body.compact div#compactHeader img {
45 padding: 2px 20px 2px 4px;
46 width: 60;
47}
48
49body.compact div#compactHeader a {
50 color: white;
51 text-decoration: none;
52 font-size: 10pt;
53 /*position: absolute; */
54 right: 10px;
55 top: 6px;
56}
57
58body.compact div#compactHeader a:hover {
59 color: #ff9400;
60}
61
62body.compact h4 {
63 color: #999999;
64 text-align: center;
65 padding: 20px;
66 font-weight: normal;
67 font-size: 12pt;
68 font-style: italic;
69}
70
71body.compact div.loginPanel form {
72 padding: 10px;
73}
74
75body.compact div.loginPanel dt {
76 color: #aaaaaa;
77 font-size: 10pt;
78}
79
80body.compact div.loginPanel input {
81 width: 180px;
82}
83
84body.compact ul#directLogins {
85 background-image: none;
86 padding: 4px 0px;
87}
88
89body.compact ul#directLogins li {
90 width:auto;
91}
92
93body.compact ul#directLogins li.hover {
94 width:auto;
95 padding-right: 0px;
96}
97
98body.compact div.lockPanel {
99 color: #999999;
100 font-size: 10pt;
101 padding: 10px;
102}
103
104div#compactMiscLinks ul {
105 /* text-align: center;*/
106 display: block;
107 padding-left: 22px;
108 background-color: #ff9400;
109}
110
111div#compactMiscLinks ul li {
112 display: inline;
113 padding: 2px 5px;
114}
115
116div#compactHeader div#compactMiscLinks ul li a {
117 font-size: 9pt;
118}
119
120div#compactHeader div#compactMiscLinks ul li a:hover {
121 color: #333366;
122}
123
124div#lockBlock {
125 position: absolute;
126 right: 10px;
127 top: 6px;
128}
129
130div#lockBlock input {
131 width: auto;
132 padding-bottom: 2px;
133}
134
135div#lockBlock span {
136 font-size: 9pt;
137 padding: 0px 5px 0px 4px;
138 color: #aaaaaa;
139}
140
141div#lockBlock a#lock {
142 font-size: 9pt;
143}
144
145/* @group Donate */
146
147a#donateHeaderLink {
148 font-weight: bold;
149}
150
151div#compactMiscLinks a#donateHeaderIconLink img#donateHeaderLinkIcon {
152 display: inline;
153 position: absolute;
154 top: 22px;
155 left: 1px;
156 width: 12px;
157 height: 12px;
158}
159
160
161
162/* @end */ \ No newline at end of file
diff --git a/frontend/gamma/css/clipperz/iPhone.css b/frontend/gamma/css/clipperz/iPhone.css
new file mode 100644
index 0000000..a15f22f
--- a/dev/null
+++ b/frontend/gamma/css/clipperz/iPhone.css
@@ -0,0 +1,464 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29/* @override
30 https://www.example.com/iPHONE/css/iPhone.css
31 https://www.example.com/DEVELOPMENT/css/iPhone.css
32 https://www.example.com/WIZARD/css/iPhone.css
33*/
34
35/* ---------------------------------------- */
36
37body {
38 margin: 0;
39 font-family: Helvetica;
40 background: #FFFFFF;
41 color: #000000;
42 overflow-x: hidden;
43 -webkit-user-select: none;
44 -webkit-text-size-adjust: none;
45}
46
47
48div.toolbar {
49 box-sizing: border-box;
50 -moz-box-sizing: border-box;
51 -webkit-box-sizing: border-box;
52 border-bottom: 1px solid #2d3642;
53 border-top: 1px solid #6d84a2;
54 padding: 10px;
55 height: 45px;
56 /* background: url(../images/old/iPhone/toolbar.png) #6d84a2 repeat-x;*/
57 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x;
58}
59
60div.toolbar h1#pageTitle {
61 overflow: hidden;
62 margin-top: 1px;
63 margin-bottom: 0px;
64 margin-left: auto;
65 margin-right: auto;
66 width: 150px;
67 height: 25px; /* 45px*/
68 font-size: 20px;
69 width: 150px;
70 font-weight: bold;
71 text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
72 text-align: center;
73 text-overflow: ellipsis;
74 white-space: nowrap;
75 color: #FFFFFF;
76}
77
78div.toolbar a.button {
79 position: absolute;
80 overflow: hidden;
81 top: 8px;
82 right: 6px;
83 margin: 0;
84 border-width: 0 5px;
85 padding: 0 3px;
86 width: auto;
87 height: 30px;
88 line-height: 30px;
89 font-family: inherit;
90 font-size: 12px;
91 font-weight: bold;
92 color: #FFFFFF;
93 text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0;
94 text-overflow: ellipsis;
95 text-decoration: none;
96 white-space: nowrap;
97 background: none;
98 /* -webkit-border-image: url(../images/old/iPhone/toolButton.png) 0 5 0 5;*/
99}
100
101div.toolbar a#backButton {
102 /* display: none;*/
103 left: 6px;
104 right: auto;
105 padding: 0px;
106 max-width: 55px;
107 border-width: 0 8px 0 14px;
108 /* -webkit-border-image: url(../images/old/iPhone/backButton.png) 0 8 0 14;*/
109 -webkit-border-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAIAAAA6iHCJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtJJREFUeNrEV21P01AYbbtubNExBnXDbYjjZYI4BMdgEANDQoTElw/+Rw0mBs0UiSGaoJFEQEPwjRhFCW/JxrZ2Xdu1fe71bpAhCHzqupPnS5ObPOeec+5zb+lHLxao05HPiwvzr3/++J7N7FFGgaaDLe034+O+wCXyxSKET1u5+Wc98XTK39zeOzjudLmNIoAR2tlaf/Zkqm9gKNI/RBigE9dtb23MJKZj8fvuC16b3WGxsJRxOFfHeQOtH+ZnOI+XRfgEBoLAzz6fjo7ebfD4GYYhMiEdDGRAW6xOt6d7YGzl4xIL/7mgyPL044edkVt19T4EFAJEVQYud+MvOCkHc7MJ3+VrXGOzXrHeZS1s9trjOVj7tiqpONTWBRgD6BVmQFls9iMaSHnx/bu3ffEHgC2gVVqAIojKR3Iw9zLRcjVmtTnA0NydxQDg0IWvq59kYIOeZtWs9gQkagcMcgK/vLjYNXQHcEkas0AcYPdNIPr7Q/0M69B089ofavB5ZVm3OJ2cTwegzAUgxGbSe8tLS52xewjRZGabzAABZt+8mvGHBsiYNF+AAw1cXEBGNUiQqWpAlArM5MSYBXgEOl0NkLcCkxak28MRKbuDMa6KDAwAUnU8HO2Q+N0SJ3OLMCA7V1S9vt7d3tSg5LNV0ACXwOekcGfreVbVVYUqMjOvyPsH71cqkxsZ7NHFJIXBTCMONMAlEryoxAfDucyOmaOpmINyaTowrK23IyDxKbNzUIYoKU3+i37OXpCESvfGCOw11uMMcCkQke4rDlrS1coOSk2VOXftERfKtZsURmLXQUqBVqiUABgrQirc0Xp4Fv4t8kxN8dLkaJQupOVcGnTN0PuQHHlRSG1Eu9tUTLOnxZ5clclsfmK078va7/WN7axomCN2e42Xc/VEIoiiM0KePeM20DTY3M22BZtuhENW1rC/NrI3WVGTmZxSKEr7V4ABAJ+53J1I3nPjAAAAAElFTkSuQmCCCg==) 0 8 0 14;
110}
111
112/* ------------------------------------------- */
113
114body.iPhone form.loginForm {
115 min-height: 372px;
116
117 box-sizing: border-box;
118 -moz-box-sizing: border-box;
119 -webkit-box-sizing: border-box;
120 padding: 10px;
121 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/
122 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
123}
124
125fieldset {
126 position: relative;
127 margin: 0 0 20px 0;
128 padding: 0;
129 background: #FFFFFF;
130 -webkit-border-radius: 10px;
131 -moz-border-radius: 10px;
132 border: 1px solid #999999;
133 text-align: right;
134 font-size: 16px;
135}
136
137.row {
138 position: relative;
139 min-height: 42px;
140 border-bottom: 1px solid #999999;
141 -webkit-border-radius: 0;
142 text-align: right;
143}
144
145fieldset > .row:last-child {
146 border-bottom: none !important;
147}
148
149
150.row > input:not(input[type|=radio]):not(input[type|=checkbox]),
151.row > div.fieldValue {
152 width: 100%;
153 box-sizing: border-box;
154 -moz-box-sizing: border-box;
155 -webkit-box-sizing: border-box;
156 margin: 0;
157 border: none;
158 /* padding: 0px;*/
159 padding: 0px 10px 0 112px;
160 height: 42px;
161 background: none;
162 font-size: 16px;
163 font-weight: normal;
164
165 color: #666a60;
166 -webkit-user-select: text;
167}
168
169/*.row > span.fieldValue {*/
170.row > div.fieldValue p {
171/*.row > input.fieldValue {*/
172 margin: 0px;
173 text-align: left;
174 height: 40px;
175 vertical-align: middle;
176 line-height: 40px;
177 /* padding: 0px 10px 0 112px;*/
178}
179
180/*body[orientation="landscape"] .row > span.fieldValue.password {*/
181body[orientation="landscape"] .row > div.fieldValue.password {
182/*body[orientation="landscape"] .row > input.fieldValue.password {*/
183 padding-right: 120px;
184 /* background: url(../images/old/iPhone/password_background.png) no-repeat 105px;*/
185 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 105px;
186}
187
188/*.row > span.fieldValue.password {*/
189.row > div.fieldValue.password {
190/*.row > input.fieldValue.password {*/
191 color: rgba(255,255,255,0.5);
192 /* background: url(../images/old/iPhone/password_background.png) no-repeat 106px;*/
193 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 106px;
194}
195
196.row > div.fieldValue.password.clear {
197 color: #666a60;
198 background: none;
199}
200
201.row > input[type|=radio], .row > input[type|=checkbox] {
202 margin: 7px 7px 0 0;
203 height: 25px;
204 width: 25px;
205}
206
207
208.row > label {
209 position: absolute;
210 margin: 0 0 0 14px;
211 line-height: 42px;
212 font-weight: bold;
213 max-width: 92px;
214 overflow: hidden;
215 white-space: nowrap;
216}
217
218body[orientation="landscape"] .row > label {
219 max-width: 150px;
220}
221
222body[orientation="landscape"] .row > input:not(input[type|=radio]):not(input[type|=checkbox]) {
223 padding-left: 140px;
224}
225
226.row > img.favicon {
227 position: absolute;
228 width: 20px;
229 height: 20px;
230 top: 12px;
231 left: 11px;
232}
233
234.row > span {
235 padding: 8px 13px;
236 text-align: left;
237 display: block;
238 color: #666a60;
239 font-size: 10pt;
240}
241
242.row.notes {
243 -webkit-user-select: text;
244}
245
246/* ------------------------------------------- */
247
248.whiteButton {
249 margin-left: auto;
250 margin-right: auto;
251 width: 150px;
252 display: block;
253 border-width: 0 12px;
254 padding: 10px;
255 text-align: center;
256 font-size: 20px;
257 font-weight: bold;
258 text-decoration: inherit;
259 color: inherit;
260
261 /* -webkit-border-image: url(../images/old/iPhone/whiteButton.png) 0 12 0 12;*/
262 -webkit-border-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAuCAQAAAB+dNqHAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAdAAAALgChnaVgAAAAAmJLR0QA/4ePzL8AAANhSURBVEjHnZZNaFxVFMd/5747mclMkpmxzYdJtFaJglgFpYSiBAVX7l0UUZGuSkEEu3PtSulCUXFdxYXL7kQQIWD9CsRIqdomGGOaSdJmZjKTeW/eu/e4mKRmrE3n5X83j/ve7/3POfe+d67QrTxP8QLDnMTenkv4kQ2+YZ6d/Y/Kvut+XuZVKtygzVbXC8v0cT+jXORLWneix/mAZZZwKIrSbSAIAcd5kDdZ6kaf4zzfEeLPnHrr+UeOWpMJ9rjYxe7a5ntff/YThhyneJ/Zf9Ep3uEXkhNjX50bHoiStoPE76HWiPQFfcGN+kufLKxheZJ3+aOD5vmIBaLXpz89HSVhzF2Uy2TtGxe/+JksJzjHjgCvMEHz6cnZt7dD5zlAgSlkZy7MrVDgbz43FJimhV46W2vFzutBI3aN8NJZlBbTFAKepZ/o/IszU1Gs95Tz2Uw1nFuiiTE8Rhs9fbIROt/LaISvTaO0mbIM0kTKeefoUSMDCI6SxRCT9d77XlFrCYgQi0PH72vH9CyNMSjO4tGM9do76hXB4y2KU+c8aaR41KJ4SIn6DgqgPq2rggWc+kMEjBUBVDUNKQBiOx+218Pl6tVr+jJhUZx4PYSr4XBSsAKaJH9tpirT7uIoTj3pAna43TJJWtSjYDpxp5bv5OpTb4mOq3IIX0W14ypeUq+rYBH5T9fqbRerWMClrbB4PBgUjZPUuXrUGBW51Yhc71y9LSJi1NgQxVWj3a7aw2gmONSGJtNAxC9v9+56vaoe6aubXEWy4meXe/+VXl42TvqzG4ZFCkRzv/+w3lu436/PX6NNnsUgCctjUUJwnWdGC/ZenpXw47loTRrldu3XwLkSrQmiHbkSP3FkwB4MXpjfWDE3JTfw29ZGAGHjgWJdcDW9XC/0PVS4W47fVj5cuLUmFWlOVlevei8ApVLp8bWclnWU4khpZvTRwaw5VggEINHlZuSv1mcr6zW2ZF22xqLqlWr19uYdGSkeWyn4IY5okX61GBHMrp1HJaYldW4G9Ylm7c/19a4jV6k0+fBmtjbkCwxoDovdQ0lIpEXTNIrbR6OVxWr1joNeJjM+Xhyu2+0+Z6Ocmt17Kj4bBvFgPJTUNlZX4/j/zohAJlMuF4vW5vP7Z3d2kqRW29qKuxr4P1RbNFwZtqq8AAAAAElFTkSuQmCCCg==) 0 12 0 12;
263 text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0;
264}
265
266/* ------------------------------------------- */
267
268body.iPhone .loginProgressPanel {
269 min-height: 372px;
270
271 box-sizing: border-box;
272 -moz-box-sizing: border-box;
273 -webkit-box-sizing: border-box;
274 padding: 10px;
275 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/
276 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
277}
278
279body.iPhone .loadingBar {
280 margin-left: auto;
281 margin-right: auto;
282 margin-top: 60px;
283}
284
285div.loadingBar {
286 height: 22px;
287 width: 214px;
288 /* background: url(../images/old/loading/loadingBar.gif) no-repeat center;*/
289 background: url(data:image/gif;charset=utf-8;base64,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) no-repeat center;
290}
291
292div.loadingBar div.loadingBarProgress {
293 height: 100%;
294 width: 0%;
295}
296
297div.loadingBar div.loadingBarProgress div.loadingBarProgress_left {
298 height: 100%;
299 max-width: 8px;
300 /* background: url(../images/old/loading/loadingBarProgress.png) no-repeat 0;*/
301 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAAAWCAYAAAC8C2KaAAAACXBIWXMAAAsSAAALEgHS3X78AAACIklEQVR4Ae3brU7DUBQH8HO6PQAazx4BRUKDwfChQTGFQ4wRFGEERdgQONRQoGEzGFISFI8w/DQSWHsP565r0xY2BiWY/ivW+530l52cdr0jwgEBCPy5AE9aUc7XV0kcl4jniGR20lj0QaAYAtzXWHgmNh7v3HTGXfOXgSWnKy6VqEZMCKZxcmiHgFCfAjrjva6XxfgUWNJc3tVBG9mBqEMAAmMFrrl+10r2pgJLTpYO9dZvNTkAZQhAYAoBNh3evz+KRsaBJccLevtXakYdOEMAAj8UCII6Hzx6dlY5nipBjXwTV1GAAAR+KiA1neHZWcOMJY35FS03bAMOCEAgl0CDG0/dMGP5by6xk2s1TIYABFRAjKufo8AyfoUkftyCDwQg8FsBloqdGmaswMf7qt9CYh4E0gLDWBrdCg7SXahBAAK5BEYZa9AnZmStXJSYDAEVENEtT/GtYNAjxl5AfDEgkFtAuGfXCDPW4N0jh9zci2IBCBRdwCTeY1kL2Z65RdYq+rcC159LQLjPFy9rdo0wY9nS+2uLSk5qI6FtxgEBCEwpEJg4flIvr2SrfEgOYxPulI4YBoFYwEiHL/2jqJ4KLNuowVXT4NqMBuAMAQh8I2DkSoPqLDnqU2DZTqmWF4mcXTxzJalQhkBGQJ+piEyL2/5DpifchJttjOpSLenmXMfVvboVBFmkgnOhBYbBJPqTuv41vx10C22Bi4fAfwt8AJe2flCLvH1PAAAAAElFTkSuQmCCCg==) no-repeat 0;
302}
303
304div.loadingBar div.loadingBarProgress div.loadingBarProgress_right {
305 position: relative;
306 height: 100%;
307 margin-left: 8px;
308 /* background: url(../images/old/loading/loadingBarProgress.png) no-repeat right;*/
309 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAAAWCAYAAAC8C2KaAAAACXBIWXMAAAsSAAALEgHS3X78AAACIklEQVR4Ae3brU7DUBQH8HO6PQAazx4BRUKDwfChQTGFQ4wRFGEERdgQONRQoGEzGFISFI8w/DQSWHsP565r0xY2BiWY/ivW+530l52cdr0jwgEBCPy5AE9aUc7XV0kcl4jniGR20lj0QaAYAtzXWHgmNh7v3HTGXfOXgSWnKy6VqEZMCKZxcmiHgFCfAjrjva6XxfgUWNJc3tVBG9mBqEMAAmMFrrl+10r2pgJLTpYO9dZvNTkAZQhAYAoBNh3evz+KRsaBJccLevtXakYdOEMAAj8UCII6Hzx6dlY5nipBjXwTV1GAAAR+KiA1neHZWcOMJY35FS03bAMOCEAgl0CDG0/dMGP5by6xk2s1TIYABFRAjKufo8AyfoUkftyCDwQg8FsBloqdGmaswMf7qt9CYh4E0gLDWBrdCg7SXahBAAK5BEYZa9AnZmStXJSYDAEVENEtT/GtYNAjxl5AfDEgkFtAuGfXCDPW4N0jh9zci2IBCBRdwCTeY1kL2Z65RdYq+rcC159LQLjPFy9rdo0wY9nS+2uLSk5qI6FtxgEBCEwpEJg4flIvr2SrfEgOYxPulI4YBoFYwEiHL/2jqJ4KLNuowVXT4NqMBuAMAQh8I2DkSoPqLDnqU2DZTqmWF4mcXTxzJalQhkBGQJ+piEyL2/5DpifchJttjOpSLenmXMfVvboVBFmkgnOhBYbBJPqTuv41vx10C22Bi4fAfwt8AJe2flCLvH1PAAAAAElFTkSuQmCCCg==) no-repeat right;
310 top: -22px;
311}
312
313/* ------------------------------------------- */
314
315body.iPhone .loginErrorPanel {
316 position: absolute;
317 min-height: 372px;
318 box-sizing: border-box;
319 -moz-box-sizing: border-box;
320 -webkit-box-sizing: border-box;
321 padding: 10px;
322 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/
323 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
324}
325
326body.iPhone .loginErrorPanel h2 {
327 text-align: center;
328 color: red;
329 margin-top: 40px;
330}
331
332/* ------------------------------------------- */
333
334
335
336
337
338
339
340
341form.cardListSearchForm {
342 box-sizing: border-box;
343 -moz-box-sizing: border-box;
344 -webkit-box-sizing: border-box;
345 border-bottom: 1px solid #2d3642;
346 border-top: 1px solid #6d84a2;
347 padding: 6px;
348 height: 45px;
349 /* background: url(../images/old/iPhone/toolbar.png) #6d84a2 repeat-x;*/
350 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x;
351 margin: 0px;
352}
353
354form.cardListSearchForm input {
355 margin: 7px;
356 -webkit-appearance: searchfield;
357 width: 200px;
358}
359
360ul.cardListPanel {
361 margin: 0px;
362 padding: 0px;
363 list-style-type: none;
364 min-height: 372px;
365}
366
367li.cardListItem {
368 height: 43px;
369 border-bottom: 1px solid #cccccc;
370 /* background: url(../images/old/iPhone/listArrow.png) no-repeat right center;*/
371 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center;
372
373}
374
375li.cardListItem a {
376 position: relative;
377 top: -22px;
378 left: 40px;
379 display: block;
380 white-space: nowrap;
381 overflow: hidden;
382}
383
384body[orientation="portrait"] li.cardListItem a {
385 max-width: 250px;
386}
387
388body[orientation="landscape"] li.cardListItem a {
389 max-width: 400px;
390}
391
392li.cardListItem img {
393 height: 20px;
394 width: 20px;
395 padding: 12px 10px 0px 10px;
396}
397
398li.cardListItem a {
399 text-decoration: none;
400 color: black;
401 font-weight: bold;
402 font-size: 14pt;
403 vertical-align: 3px;
404}
405
406
407div.cardDetailPanel {
408 position: absolute;
409 top: 45px;
410 min-height: 372px;
411
412 box-sizing: border-box;
413 -moz-box-sizing: border-box;
414 -webkit-box-sizing: border-box;
415 padding: 10px;
416 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/
417 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
418}
419
420/*div.cardDetailPanel > fieldset > div.row > input.directLogin {*/
421div.cardDetailPanel > fieldset > div.row > span.directLogin {
422 width: 100%;
423 box-sizing: border-box;
424 -moz-box-sizing: border-box;
425 -webkit-box-sizing: border-box;
426 margin: 0;
427 border: none;
428 padding: 12px 10px 0 110px;
429 height: 42px;
430 background: none;
431 font-size: 16px;
432 font-weight: normal;
433
434 padding-left: 40px;
435 color: black;
436 /* background: url(../images/old/iPhone/listArrow.png) no-repeat right center;*/
437 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center;
438}
439
440/*body[orientation="landscape"] div.cardDetailPanel > fieldset > div.row > input.directLogin { */
441body[orientation="landscape"] div.cardDetailPanel > fieldset > div.row > span.directLogin {
442 padding-left: 50px;
443}
444
445div.cardDetailPanel h2 {
446 margin: 0 0 8px 14px;
447 font-size: inherit;
448 font-weight: bold;
449 color: #4d4d70;
450 text-shadow: rgba(255, 255, 255, 0.75) 1px 1px 0;
451}
452
453
454
455
456 /* body[orientation="portrait"] div.cardList {*/
457body[orientation="portrait"] > * {
458 width: 320px;
459}
460
461/* body[orientation="landscape"] div.cardList { */
462body[orientation="landscape"] > * {
463 width: 480px;
464}
diff --git a/frontend/gamma/css/clipperz/ie.css b/frontend/gamma/css/clipperz/ie.css
new file mode 100644
index 0000000..5148ada
--- a/dev/null
+++ b/frontend/gamma/css/clipperz/ie.css
@@ -0,0 +1,356 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29<!--[if IE]>
30
31<style>
32
33{
34 background-color: white;
35}
36
37div#logoFrame {
38 height: 44px;
39}
40
41div#logo {
42 /* padding-left: 15px;*/
43 background: url(../images/old/logo_blue.png);
44}
45
46div.clipperzLoginForm div.loginForm form {
47 padding-left: 20px;
48}
49
50div.clipperzLoginForm div.registrationForm form {
51 padding-left: 20px;
52}
53
54div#newRecordInnerPanel {
55 width: 350px;
56 height: 160px;
57 background: url(../images/old/newRecordPanelBackground.png) no-repeat 0 -165px;
58 /*background: url(data:image/png;charset=utf-8;base64,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) no-repeat 0 -165px; */
59}
60
61img#donateHeaderIcon {
62 padding-top: 0px;
63 margin-bottom: 0px;
64}
65
66/* ========================================================== */
67
68div#applicationVersionType {
69 position: absolute;
70}
71
72div#applicationVersionType.readOnly {
73 background: url(../images/old/read-only.png) no-repeat fixed -5px -8px;
74}
75
76div#applicationVersionType.TEST {
77 background: url(../images/old/test-database.png) no-repeat fixed -5px -8px;
78}
79
80div#mainTabs {
81 background: #ff9400 url(../images/old/menubarSprite.gif) repeat-x;
82}
83
84div#menus {
85 background: url(../images/old/menubarSprite.gif) no-repeat right -26px;
86}
87
88div#menus table {
89 background: url(../images/old/menubarSprite.gif) no-repeat 0 -52px;
90}
91
92div#menus table tbody tr td div {
93 background: url(../images/old/menubarSprite.gif) no-repeat right -52px;
94}
95
96div#menus table tbody tr td div a {
97 background: url(../images/old/menubarSprite.gif) no-repeat left -26px;
98}
99
100div#menus table tbody tr td.selectedTab {
101 background: url(../images/old/menubarSprite.gif) repeat-x right -78px;
102}
103
104div#menus table tbody tr td.selectedTab div {
105 background: url(../images/old/menubarSprite.gif) no-repeat right -130px;
106}
107
108div#menus table tbody tr td.selectedTab div a {
109 background: url(../images/old/menubarSprite.gif) no-repeat left -104px;
110}
111
112div.clipperzLoginForm div.loginFormHeaderBox {
113 background: url(../images/old/loginFormBox.png) no-repeat -3px top;
114}
115
116div.clipperzLoginForm div.loginForm {
117 background: url(../images/old/loginFormBox.png) repeat-y -408px;
118}
119
120div.loginForm div.loginFormFooterBox {
121 background: url(../images/old/loginFormBox.png) no-repeat -813px bottom;
122}
123
124div.clipperzLoginForm div.registrationForm {
125 background: url(../images/old/loginFormBox.png) repeat-y -408px;
126}
127
128div.clipperzLoginForm form.read-only table.formLayout, div.panelform.read-only table.panelBody, div.clipperzSubPanel span.read-only, div.read-only {
129 background-image: url(../images/old/read-only_background.png);
130}
131
132div.registrationForm div.loginFormFooterBox {
133 background: url(../images/old/loginFormBox.png) no-repeat -813px bottom;
134}
135
136div.loginPanelSwitchLanguageBox {
137 background: url(../images/old/languageBox.png) no-repeat 19px -15px;
138}
139
140div#directLoginsBlock {
141 background: url(../images/old/directLoginBox.png) repeat-y -262px bottom;
142}
143
144div#directLoginsBlock div.directLoginsBlockHeaderBox {
145 background: url(../images/old/directLoginBox.png) no-repeat -11px -13px;
146}
147
148ul#directLogins {
149 background: url(../images/old/directLoginBox.png) no-repeat -513px bottom;
150}
151
152div#directLoginsDescription {
153 background: url(../images/old/directLoginBox.png) no-repeat -513px bottom;
154}
155
156/*
157div#recordListFilterHeader {
158 background: url(../images/old/cardFiltersSprite.gif) repeat-x 0 -114px;
159}
160
161div#recordFiltersTableWrapper {
162 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -38px;
163}
164
165div#recordFiltersDIV table {
166 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -19px;
167}
168
169div#recordFiltersDIV table tbody tr td div {
170 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -38px;
171}
172
173div#recordFiltersDIV table tbody tr td div a {
174 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -19px;
175}
176
177div#recordFiltersDIV table tbody tr td.selectedTab {
178 background: url(../images/old/cardFiltersSprite.gif) repeat-x -57px;
179}
180
181div#recordFiltersDIV table tbody tr td.selectedTab div {
182 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -95px;
183}
184
185div#recordFiltersDIV table tbody tr td.selectedTab div a {
186 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -76px;
187}
188*/
189
190div#recordFiltersSearchInnerPanel {
191 background: url(../images/old/recordFilterBackground.png) no-repeat -10px -138px;
192}
193
194table#recordListAndDetailBlockTABLE {
195 background: url(../images/old/cardBlockLowerBorder.gif) repeat-x 0 bottom;
196}
197
198div#recordListBlockHeader table.recordListBlockHeaderTABLE {
199 background: url(../images/old/cardsBlockRoundCorners.gif) no-repeat right -51px;
200}
201
202div#recordListBlockHeader table.recordListBlockHeaderTABLE tbody tr td.recordBlockTitleTD {
203 background: url(../images/old/cardsBlockRoundCorners.gif) no-repeat left 0px;
204}
205
206td#cardBoxLowerLeftTD {
207 background: url(../images/old/cardBlockLowerRoundedCorner.gif) no-repeat left -32px;
208}
209
210td#cardBoxLowerRightTD {
211 background: url(../images/old/cardBlockLowerRoundedCorner.gif) no-repeat right -82px;
212}
213
214div#newRecordInnerPanel {
215 background: url(../images/old/newRecordPanelBackground.png) no-repeat 0 -165px;
216}
217
218.resizable-textarea .grippie {
219 background: #eee url(../images/old/grippie.png) no-repeat center 1px;
220}
221
222div.Clipperz_recordFieldData div.passwordBackground, div.passwordEntropy {
223 background: url(../images/old/entropyBackground.gif) repeat-x 0 0;
224}
225
226div.Clipperz_recordFieldData input.scrambledField {
227 background: transparent url(../images/old/scrambledValue.png) no-repeat 0 0px;
228}
229
230div.Clipperz_recordFieldData input.scrambledField:focus {
231 background: transparent url(../images/old/scrambledValue.png) no-repeat 0 -16px;
232}
233
234div.directLoginCollapseLink {
235 background: url(../images/old/directLogin/toggle.png) no-repeat;
236}
237
238#mb-dlg .ext-mb-progress {
239 background:transparent url(../images/old/default/basic-dialog/progress2.gif) repeat-x 1px 1px;
240}
241
242.ydlg .ydlg-hd {
243 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) repeat-x 0 -82px;
244}
245.ydlg .ydlg-hd-left {
246 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) no-repeat 0 -41px;
247}
248.ydlg .ydlg-hd-right {
249 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) no-repeat right 0;
250}
251
252.ydlg .ydlg-close {
253 background-image:url(../images/old/clipperz/basic-dialog/close.gif);
254}
255
256body .ybtn-left{
257 background:url(../images/old/default/basic-dialog/btn-sprite.gif) no-repeat 0 0;
258}
259body .ybtn-right{
260 background:url(../images/old/default/basic-dialog/btn-sprite.gif) no-repeat 0 -21px;
261}
262body .ybtn-center{
263 background:url(../images/old/default/basic-dialog/btn-sprite.gif) repeat-x 0 -42px;
264}
265
266
267
268
269div.Clipperz_PasswordGenerator_button {
270 background: url(../images/old/passwordAssistant.png) 0 22px;
271}
272
273div.Clipperz_PasswordGenerator_button.hover {
274 background: url(../images/old/passwordAssistant.png) 0 -1px;
275}
276
277body ul.radioList li h4 {
278 cursor: auto;
279}
280
281/* ========================================================== */
282
283</style>
284
285<![endif]-->
286
287
288
289<!--[if lt IE 7]>
290
291<style>
292
293div#newRecordPanel {
294 position: absolute;
295 margin-left: 0px;
296 width: 350px;
297 height: 160px;
298}
299
300div#newRecordInnerPanel {
301 width: 350px;
302 height: 160px;
303 background: url(../images/old/newRecordPanelBackground.gif) no-repeat 0 -165px;
304 /*background: url(data:image/gif;charset=utf-8;base64,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) no-repeat 0 -165px; */
305}
306
307div.newRecordInnerInnerPanel {
308 background-color: white;
309 padding: 0px;
310 margin-left: 15px;
311 margin-right: 15px;
312}
313
314div#newRecordPanel table td.newRecordPanelLabelTD {
315 padding-left: 0px;
316 padding-top: 3px;
317 font-size: 9pt;
318 width: 100px;
319}
320
321div#readOnlyBanner {
322 background: url(../images/old/read-only.gif) no-repeat fixed -5px -8px;
323 /*background: url(data:image/gif;charset=utf-8;base64,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) no-repeat fixed -5px -8px; */
324}
325
326
327
328ul#directLogins {
329 height: 200px;
330}
331
332div#recordListBlock {
333 height: 200px;
334}
335
336div.clipperzSubPanel {
337 height: 200px;
338}
339
340
341
342div.Clipperz_recordFieldData input.scrambledField {
343 background: transparent url(../images/old/scrambledValue.gif) no-repeat 0 0px;
344 /* background: transparent url(data:image/gif;charset=utf-8;base64,R0lGODlhRwAgANUmAP///7XV/2ZmZqW/4ODg4HBwcGttcJChuLi4uHZ8hYWFhfX19bDO9YCLmZmZmaOjo4aSo6C31tbW1q2trXuEj4uarY+Pj+vr66rG68LCwpWpwnp6eszMzHF1epuwzMTd/7rY/9Pm/8ng/7/b/87j/9jp/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACYALAAAAABHACAAAAb/QIBwSCwaj8ikcslsOp/QqHRKRV4QkmQGkbxmkVtlGGkyLSUCLtIiSKLVR7ZSTjYfLwvAW0gY9gF0eEKCewB/hkKBeXyJbQCCRGVIDgIOE5UPBQV8AhsTCmmgapSWmJqcnqKiqJ+haUJlsbFFCKACt50TeQSZuLcOHEK1vrm7vb7AfMe4yQCyskcEBbcZRw+3CotE0tTW2NpE1wLZRtBI19fk25qU1UXo4+CG7ALu6wXt5bNHHAIWAAgEPCgCSsICTYcA9PsXcCCRggcLJAQAEWEkO5KMcNhwIREcAAssCZGgIOHGjoA+hpwwsiSRlS0TZsxYpabNmzhz6tzJs6fP/wBAgwodSrSo0aNIkypdyrSp06dQo0o1iuFAhKMaDhytetVoVqRfjZZJGkGAVqMUBBwte7ZoWqRvxZqgyiAAW6ADguYNEBdD3QB+7ZrFqxdo378B9h4G+gHo2AAjQAhtIKBBhcoQDBjAK6BDhQRmQZ+lbBmzZs6eRYtG/Tn04A/PYpUQegC0L891B2Qm1sAD0NrEcCfe7as3XuK4jMOObYIE0QEGbmkoCuFWAsR6owuYTrS6gOvUrWN3HEty+OrghUI3QJm70Orox69v/1wzfaHLy4Qo6kEAhQAHCADBUKBFwIBmewHV338BDihUgQcakCBQECIoVBkigFBGY0N50DIBBoa1FQADlgEVQQITeggiXyKSWIGJKArlIowJajhXABtOpeOOPPbo449ABinkkAEEAQA7Cg==) no-repeat 0 0px;*/
345}
346
347div.Clipperz_recordFieldData input.scrambledField:focus {
348 background: transparent url(../images/old/scrambledValue.gif) no-repeat 0 -14px;
349 /* background: transparent url(data:image/gif;charset=utf-8;base64,R0lGODlhRwAgANUmAP///7XV/2ZmZqW/4ODg4HBwcGttcJChuLi4uHZ8hYWFhfX19bDO9YCLmZmZmaOjo4aSo6C31tbW1q2trXuEj4uarY+Pj+vr66rG68LCwpWpwnp6eszMzHF1epuwzMTd/7rY/9Pm/8ng/7/b/87j/9jp/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACYALAAAAABHACAAAAb/QIBwSCwaj8ikcslsOp/QqHRKRV4QkmQGkbxmkVtlGGkyLSUCLtIiSKLVR7ZSTjYfLwvAW0gY9gF0eEKCewB/hkKBeXyJbQCCRGVIDgIOE5UPBQV8AhsTCmmgapSWmJqcnqKiqJ+haUJlsbFFCKACt50TeQSZuLcOHEK1vrm7vb7AfMe4yQCyskcEBbcZRw+3CotE0tTW2NpE1wLZRtBI19fk25qU1UXo4+CG7ALu6wXt5bNHHAIWAAgEPCgCSsICTYcA9PsXcCCRggcLJAQAEWEkO5KMcNhwIREcAAssCZGgIOHGjoA+hpwwsiSRlS0TZsxYpabNmzhz6tzJs6fP/wBAgwodSrSo0aNIkypdyrSp06dQo0o1iuFAhKMaDhytetVoVqRfjZZJGkGAVqMUBBwte7ZoWqRvxZqgyiAAW6ADguYNEBdD3QB+7ZrFqxdo378B9h4G+gHo2AAjQAhtIKBBhcoQDBjAK6BDhQRmQZ+lbBmzZs6eRYtG/Tn04A/PYpUQegC0L891B2Qm1sAD0NrEcCfe7as3XuK4jMOObYIE0QEGbmkoCuFWAsR6owuYTrS6gOvUrWN3HEty+OrghUI3QJm70Orox69v/1wzfaHLy4Qo6kEAhQAHCADBUKBFwIBmewHV338BDihUgQcakCBQECIoVBkigFBGY0N50DIBBoa1FQADlgEVQQITeggiXyKSWIGJKArlIowJajhXABtOpeOOPPbo449ABinkkAEEAQA7Cg==) no-repeat 0 -14px;*/
350}
351
352
353
354</style>
355
356<![endif]-->
diff --git a/frontend/gamma/graphics/CoverActions.opacity b/frontend/gamma/graphics/CoverActions.opacity
new file mode 100644
index 0000000..58028fd
--- a/dev/null
+++ b/frontend/gamma/graphics/CoverActions.opacity
Binary files differ
diff --git a/frontend/gamma/graphics/Features.opacity b/frontend/gamma/graphics/Features.opacity
new file mode 100644
index 0000000..8824506
--- a/dev/null
+++ b/frontend/gamma/graphics/Features.opacity
Binary files differ
diff --git a/frontend/gamma/graphics/GridSorting.opacity b/frontend/gamma/graphics/GridSorting.opacity
new file mode 100644
index 0000000..0d6c784
--- a/dev/null
+++ b/frontend/gamma/graphics/GridSorting.opacity
Binary files differ
diff --git a/frontend/gamma/graphics/Logo.opacity b/frontend/gamma/graphics/Logo.opacity
new file mode 100644
index 0000000..a4dbfc8
--- a/dev/null
+++ b/frontend/gamma/graphics/Logo.opacity
Binary files differ
diff --git a/frontend/gamma/graphics/Marks.opacity b/frontend/gamma/graphics/Marks.opacity
new file mode 100644
index 0000000..4aef025
--- a/dev/null
+++ b/frontend/gamma/graphics/Marks.opacity
Binary files differ
diff --git a/frontend/gamma/graphics/RegisterButton.opacity b/frontend/gamma/graphics/RegisterButton.opacity
new file mode 100644
index 0000000..d57920b
--- a/dev/null
+++ b/frontend/gamma/graphics/RegisterButton.opacity
Binary files differ
diff --git a/frontend/gamma/graphics/Star.opacity b/frontend/gamma/graphics/Star.opacity
new file mode 100644
index 0000000..84335a7
--- a/dev/null
+++ b/frontend/gamma/graphics/Star.opacity
Binary files differ
diff --git a/frontend/gamma/graphics/Tips.opacity b/frontend/gamma/graphics/Tips.opacity
new file mode 100644
index 0000000..56492c6
--- a/dev/null
+++ b/frontend/gamma/graphics/Tips.opacity
Binary files differ
diff --git a/frontend/gamma/html/exitPage_template.html b/frontend/gamma/html/exitPage_template.html
new file mode 100644
index 0000000..7056320
--- a/dev/null
+++ b/frontend/gamma/html/exitPage_template.html
@@ -0,0 +1,140 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>clipperz</title>
32 <link rel="stylesheet" type="text/css" href="./static.css" />
33 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
34</head>
35<body>
36
37<!-- h1>clipper<span class="logo_z">z</span></h1 -->
38<div class="header">
39 <div id="logo"></div>
40 <h5 class="clipperzPayoff">keep it to yourself!</h5>
41</div>
42
43
44<div class="contentWrapper">
45 <div class="block1">
46 <div class="languageBlock en-us">
47 <div class="flags"></div>
48 <div class="content">
49 <h3>Goodbye! Thanks for using Clipperz.</h3>
50
51 <p>You just logged out from your Clipperz account. We hope to see you again soon!</p>
52 </div>
53 </div>
54
55
56 <div class="languageBlock zh-cn">
57 <div class="flags"></div>
58 <div class="content">
59 <h3>下次再见!感谢您使用 Clipperz。</h3>
60
61 <p>您仅仅是从您的 Clipperz 账户登出,我们希望很快再次见到您!</p>
62 </div>
63 </div>
64
65
66 <!--
67 <div class="languageBlock fr-fr">
68 <div class="flags"></div>
69 <div class="content">
70 <h3></h3>
71
72 <p></p>
73 </div>
74 </div>
75 -->
76
77
78 <div class="languageBlock it-it">
79 <div class="flags"></div>
80 <div class="content">
81 <h3>Arrivederci! Grazie per aver scelto Clipperz.</h3>
82
83 <p>Sei uscito da Clipperz. Speriamo di rivederti presto.</p>
84 </div>
85 </div>
86
87
88 <div class="languageBlock ja-jp">
89 <div class="flags"></div>
90 <div class="content">
91 <h3>Clipperz をご利用いただきありがとうございました。</h3>
92
93 <p>Clipperz から正常にログアウトしました。またのご利用をお待ちしています。</p>
94 </div>
95 </div>
96 </div>
97
98 <div class="block2">
99 <div class="languageBlock pt-br">
100 <div class="flags"></div>
101 <div class="content">
102 <h3>Até logo! Obrigado por utilizar Clipperz.</h3>
103
104 <p>Você acaba de sair de sua conta Clipperz. Esperamos ve-lo de volta em breve!</p>
105 </div>
106 </div>
107
108
109 <div class="languageBlock es-es">
110 <div class="flags"></div>
111 <div class="content">
112 <h3>¡Hasta luego! Gracias por usar Clipperz</h3>
113
114 <p>Se acaba cerrar su sesión Clipperz. ¡Esperamos verlo nuevamente pronto!</p>
115 </div>
116 </div>
117
118 <div class="languageBlock ru-ru">
119 <div class="flags"></div>
120 <div class="content">
121 <h3>До свидания! Спасибо за использование Clipperz.</h3>
122
123 <p>Вы только что вышли из своего аккаунта Clipperz. Мы надеемся увидеть Вас снова!</p>
124 </div>
125 </div>
126
127 <div class="languageBlock de-de">
128 <div class="flags"></div>
129 <div class="content">
130 <h3>Auf Wiedersehen! Danke, dass Sie Clipperz verwendet haben.</h3>
131
132 <p>Sie haben sich gerade von Ihrem Clipperz-Account abgemeldet. Wir hoffen, Sie bald wieder zu sehen.</p>
133 </div>
134 </div>
135
136 </div>
137</div>
138
139</body>
140</html>
diff --git a/frontend/gamma/html/index_template.html b/frontend/gamma/html/index_template.html
new file mode 100644
index 0000000..8cf838c
--- a/dev/null
+++ b/frontend/gamma/html/index_template.html
@@ -0,0 +1,62 @@
1<html>
2<head>
3 <title>@page.title@</title>
4 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
5<!--
6@copyright@
7-->
8
9@css@
10
11 <link rel="shortcut icon" href="./clipperz.ico" />
12
13 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
14 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
15<script>
16 Clipperz_IEisBroken = false;
17 Clipperz_normalizedNewLine = '\n';
18 Clipperz_dumpUrl = "/dump/";
19</script>
20
21<!--[if IE]><script>
22Clipperz_IEisBroken = true;
23Clipperz_normalizedNewLine = '\x0d\x0a';
24</script><![endif]-->
25
26@js_DEBUG@
27
28</head>
29<body>
30<div id="mainDiv">
31 <div id="loading">
32 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a>
33 <h5 class="clipperzPayoff">keep it to yourself!</h5>
34 <h2>loading ...</h2>
35 </div>
36
37@js_INSTALL@
38
39</div>
40<div id="applicationVersionType" class="@application.version.type@"></div>
41
42<!-- -->
43<div id="javaScriptAlert">
44 <div class="mask"></div>
45 <div class="message">
46 <div class="header"></div>
47 <div class="body">
48 <div class="alertLogo"></div>
49 <div class="alert">
50 <h1>Attention!</h1>
51 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
52 <h3>Javascript is required to access Clipperz.</h3>
53 <h5>Please enable scripting or upgrade your browser.</h5>
54 </div>
55 </div>
56 <div class="footer"></div>
57 </div>
58</div>
59<!-- -->
60
61</body>
62</html>
diff --git a/frontend/gamma/html/mobile_template.html b/frontend/gamma/html/mobile_template.html
new file mode 100644
index 0000000..adc36e9
--- a/dev/null
+++ b/frontend/gamma/html/mobile_template.html
@@ -0,0 +1,87 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>@page.title@</title>
32 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
33@copyright@
34@css@
35
36 <link rel="shortcut icon" href="./clipperz.ico" />
37
38 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
39 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
40<script>
41 Clipperz_IEisBroken = false;
42 Clipperz_normalizedNewLine = '\n';
43 Clipperz_dumpUrl = "/dump/";
44</script>
45
46<!--[if IE]><script>
47Clipperz_IEisBroken = true;
48Clipperz_normalizedNewLine = '\x0d\x0a';
49</script><![endif]-->
50
51@CLIPPERZ_DEBUG_VERSION@
52
53</head>
54<body>
55<div id="mainDiv">
56 <div id="loading">
57 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a>
58 <h5 class="clipperzPayoff">keep it to yourself!</h5>
59 <h2>loading ...</h2>
60 </div>
61
62@CLIPPERZ_INSTALLED_VERSION@
63
64</div>
65<div id="applicationVersionType" class="@application.version.type@"></div>
66
67<!-- -->
68<div id="javaScriptAlert">
69 <div class="mask"></div>
70 <div class="message">
71 <div class="header"></div>
72 <div class="body">
73 <div class="alertLogo"></div>
74 <div class="alert">
75 <h1>Attention!</h1>
76 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
77 <h3>Javascript is required to access Clipperz.</h3>
78 <h5>Please enable scripting or upgrade your browser.</h5>
79 </div>
80 </div>
81 <div class="footer"></div>
82 </div>
83</div>
84<!-- -->
85
86</body>
87</html>
diff --git a/frontend/gamma/js/Bookmarklet.js b/frontend/gamma/js/Bookmarklet.js
new file mode 100644
index 0000000..a8e3e69
--- a/dev/null
+++ b/frontend/gamma/js/Bookmarklet.js
@@ -0,0 +1,801 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29clipperz_copiedContentToClipboard = false;
30
31//#############################################################################
32
33// Simple Set Clipboard System
34// Author: Joseph Huckaby
35
36var ZeroClipboard = {
37
38 version: "1.0.4",
39 clients: {}, // registered upload clients on page, indexed by id
40 //moviePath: 'ZeroClipboard.swf', // URL to movie
41 //moviePath: 'data:application/octet-stream;charset=utf-8;base64,Q1dTCYgGAAB4nH1V61LbRhTeXV2OJNsYczFgIEC4JCGABSRpSy+B2JDQQtWJocl0BqK1tUZqhOSRZAj/8ih9hz5AXsGZTl+ndHUhxU2nO56z3/l05uye7+wc6xr6DeUxqpcUhFCNXF9ffxjNcYhRo8U8NruO0IeRLTkm+BpEa4i8/+t3GRGUrRf5tktDe41dMC8Kpd14Q/DM911GPfHCd6zCLyzwa67Tafo0sAppuOWEHZdeyY1O4ERMbnajyPcKIYteUM+qdYPQD/It12m9jX2XBcSx5EYUON6ZwunOEXsXAY+O94HsAu8iFnjULe1mYN/je5u2WLnvAsnRNGrZ6rnfDZlxwQKxRV1XSd1ulPJ1/9KDBB13pDCiZ2ygEdsGj2WHvsXU3dc7taM3e/tHanjDZVqEV2HEzpUGa3V5dVd4Ocfz+5d1/5w6nnbgU4sF+17bFwPfjzT3k691aEDPGb92KBvNX1krmrOjqLNVrVLLb7K1ln9e3WlsVjd0/Um12XXcyPFy6ZHdyHHDkT5tt1JtF/rJerqn6Wu+F/ErsWCmPyiRjrYi54KlgZP/k2Tq9gPYSh5APZOYBVra2VicAtfyn+4qZwHt2E4rVJvszPH2HNcVD2lkS5eOxW3b9f1AtplzZkeKFdDLl/wkibodmyrUsmq241raYdye5ECpdrBf+2GQf0ncA4c3gJelHRrHjd03xs+7L9UMHh9lZN149aOSwuOfcnFO3qQmbb0V44aoSVEXlHeikXQzz1/bpzek8E50XN6o4r/KLfQpU/pMx/J/yz9cxmWhDOOyhMqD5SkJjQnKYnmpIlfuVe5XHlSWKw8rC6QoEayoWk7MFwaKg6Whx4AJEBGIBEQGQQFJBaKBlAMpD6QA0gCQIsglICNAxkGYAFIBMgkwDWQGhFkgc0DuApkHsqDmMZAVIKtA1oBUgejqOmc21E1uHwF5DOQJ4C+AfAnkKyBbQL4G8g2Qb4F8B+o2wA6QZ4DrIOyCsAfCcw0lUwR/ZvgiOP3IhwgWcDZIsCipIpJkPmskBBiBgpGiIqQJOJdYPqbiOaRiUcRIQ5hrIfT055ySiKYVzMLKkKmuDM8aAyInyW1yNCOF22Q5I8Xb5FhGSjLR8n/gnv5q+U+9t4/MojnYLtEhc3jljjGCGT4Z7bXL7bG9Udwefz9xjk9Vhl3crtjqqXwifS8hWzblJToZmylTbk+vYuMOjsECWjZnkuDZvTmcwbscGvOiKVcxXThZNGVjkQebS+17pmLcJwl8sI1v4PI2uYEPt4UbuLItxrCwoplgrMagaOZTENf2NK0NryE8gWRCVE3p6ae5j3aOFwyZb8of6RT3FYn7Y9yvmjlDx1mKGncSfVTC9Z/v6QyZE7q5rpsburmpm490U+K/12g6WXYc+nR4CKX/H31zGG1z5m9Pt5okCg==',
42 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf',
43 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf',
44 //moviePath: './ZeroClipboard.swf',
45 nextId: 1, // ID of next movie
46
47 $: function(thingy) {
48 // simple DOM lookup utility function
49 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
50 if (!thingy.addClass) {
51 // extend element with a few useful methods
52 thingy.hide = function() { this.style.display = 'none'; };
53 thingy.show = function() { this.style.display = ''; };
54 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
55 thingy.removeClass = function(name) {
56 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
57 };
58 thingy.hasClass = function(name) {
59 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
60 }
61 }
62 return thingy;
63 },
64
65 setMoviePath: function(path) {
66 // set path to ZeroClipboard.swf
67 this.moviePath = path;
68 },
69
70 dispatch: function(id, eventName, args) {
71 // receive event from flash movie, send to client
72 var client = this.clients[id];
73 if (client) {
74 client.receiveEvent(eventName, args);
75 }
76 },
77
78 register: function(id, client) {
79 // register new client to receive events
80 this.clients[id] = client;
81 },
82
83 getDOMObjectPosition: function(obj) {
84 // get absolute coordinates for dom element
85 var info = {
86 left: 0,
87 top: 0,
88 width: obj.width ? obj.width : obj.offsetWidth,
89 height: obj.height ? obj.height : obj.offsetHeight
90 };
91
92 while (obj) {
93 info.left += obj.offsetLeft;
94 info.top += obj.offsetTop;
95 obj = obj.offsetParent;
96 }
97
98 return info;
99 },
100
101 Client: function(elem) {
102 // constructor for new simple upload client
103 this.handlers = {};
104
105 // unique ID
106 this.id = ZeroClipboard.nextId++;
107 this.movieId = 'ZeroClipboardMovie_' + this.id;
108
109 // register client with singleton to receive flash events
110 ZeroClipboard.register(this.id, this);
111
112 // create movie
113 if (elem) this.glue(elem);
114 }
115};
116
117ZeroClipboard.Client.prototype = {
118
119 id: 0, // unique ID for us
120 ready: false, // whether movie is ready to receive events or not
121 movie: null, // reference to movie object
122 clipText: '', // text to copy to clipboard
123 handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
124 cssEffects: true, // enable CSS mouse effects on dom container
125 handlers: null, // user event handlers
126
127 glue: function(elem) {
128 // glue to DOM element
129 // elem can be ID or actual DOM element object
130//console.log(">>> glue");
131 this.domElement = ZeroClipboard.$(elem);
132
133 // float just above object, or zIndex 99 if dom element isn't set
134 var zIndex = 99;
135 if (this.domElement.style.zIndex) {
136 zIndex = parseInt(this.domElement.style.zIndex) + 1;
137 }
138
139 // find X/Y position of domElement
140 var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
141
142 // create floating DIV above element
143 this.div = document.createElement('div');
144 var style = this.div.style;
145 style.position = 'absolute';
146 style.left = '' + box.left + 'px';
147 style.top = '' + box.top + 'px';
148 style.width = '' + box.width + 'px';
149 style.height = '' + box.height + 'px';
150 style.zIndex = zIndex;
151
152 // style.backgroundColor = '#f00'; // debug
153
154 var body = document.getElementsByTagName('body')[0];
155 body.appendChild(this.div);
156
157 this.div.innerHTML = this.getHTML( box.width, box.height );
158//console.log("<<< glue");
159 },
160
161 getHTML: function(width, height) {
162 // return HTML for movie
163 var html = '';
164 var flashvars = 'id=' + this.id +
165 '&width=' + width +
166 '&height=' + height;
167
168 if (navigator.userAgent.match(/MSIE/)) {
169 // IE gets an OBJECT tag
170 var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
171 html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
172 }
173 else {
174 // all other browsers get an EMBED tag
175 html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
176 }
177 return html;
178 },
179
180 hide: function() {
181 // temporarily hide floater offscreen
182 if (this.div) {
183 this.div.style.left = '-2000px';
184 }
185 },
186
187 show: function() {
188 // show ourselves after a call to hide()
189 this.reposition();
190 },
191
192 destroy: function() {
193 // destroy control and floater
194 if (this.domElement && this.div) {
195 this.hide();
196 this.div.innerHTML = '';
197
198 var body = document.getElementsByTagName('body')[0];
199 try { body.removeChild( this.div ); } catch(e) {;}
200
201 this.domElement = null;
202 this.div = null;
203 }
204 },
205
206 reposition: function(elem) {
207 // reposition our floating div, optionally to new container
208 // warning: container CANNOT change size, only position
209 if (elem) {
210 this.domElement = ZeroClipboard.$(elem);
211 if (!this.domElement) this.hide();
212 }
213
214 if (this.domElement && this.div) {
215 var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
216 var style = this.div.style;
217 style.left = '' + box.left + 'px';
218 style.top = '' + box.top + 'px';
219 }
220 },
221
222 setText: function(newText) {
223 // set text to be copied to clipboard
224 this.clipText = newText;
225 if (this.ready) this.movie.setText(newText);
226 },
227
228 addEventListener: function(eventName, func) {
229 // add user event listener for event
230 // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
231 eventName = eventName.toString().toLowerCase().replace(/^on/, '');
232 if (!this.handlers[eventName]) this.handlers[eventName] = [];
233 this.handlers[eventName].push(func);
234 },
235
236 setHandCursor: function(enabled) {
237 // enable hand cursor (true), or default arrow cursor (false)
238 this.handCursorEnabled = enabled;
239 if (this.ready) this.movie.setHandCursor(enabled);
240 },
241
242 setCSSEffects: function(enabled) {
243 // enable or disable CSS effects on DOM container
244 this.cssEffects = !!enabled;
245 },
246
247 receiveEvent: function(eventName, args) {
248 // receive event from flash
249 eventName = eventName.toString().toLowerCase().replace(/^on/, '');
250
251 // special behavior for certain events
252 switch (eventName) {
253 case 'load':
254 // movie claims it is ready, but in IE this isn't always the case...
255 // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
256 this.movie = document.getElementById(this.movieId);
257 if (!this.movie) {
258 var self = this;
259 setTimeout( function() { self.receiveEvent('load', null); }, 1 );
260 return;
261 }
262
263 // firefox on pc needs a "kick" in order to set these in certain cases
264 if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
265 var self = this;
266 setTimeout( function() { self.receiveEvent('load', null); }, 100 );
267 this.ready = true;
268 return;
269 }
270
271 this.ready = true;
272 this.movie.setText( this.clipText );
273 this.movie.setHandCursor( this.handCursorEnabled );
274 break;
275
276 case 'mouseover':
277 if (this.domElement && this.cssEffects) {
278 this.domElement.addClass('hover');
279 if (this.recoverActive) this.domElement.addClass('active');
280 }
281 break;
282
283 case 'mouseout':
284 if (this.domElement && this.cssEffects) {
285 this.recoverActive = false;
286 if (this.domElement.hasClass('active')) {
287 this.domElement.removeClass('active');
288 this.recoverActive = true;
289 }
290 this.domElement.removeClass('hover');
291 }
292 break;
293
294 case 'mousedown':
295 if (this.domElement && this.cssEffects) {
296 this.domElement.addClass('active');
297 }
298 break;
299
300 case 'mouseup':
301 if (this.domElement && this.cssEffects) {
302 this.domElement.removeClass('active');
303 this.recoverActive = false;
304 }
305 break;
306 } // switch eventName
307
308 if (this.handlers[eventName]) {
309 for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
310 var func = this.handlers[eventName][idx];
311
312 if (typeof(func) == 'function') {
313 // actual function reference
314 func(this, args);
315 }
316 else if ((typeof(func) == 'object') && (func.length == 2)) {
317 // PHP style object + method, i.e. [myObject, 'myMethod']
318 func[0][ func[1] ](this, args);
319 }
320 else if (typeof(func) == 'string') {
321 // name of function
322 window[func](this, args);
323 }
324 } // foreach event handler defined
325 } // user defined handler for event
326 }
327
328};
329
330//#############################################################################
331
332var clip = null;
333
334function $(id) { return document.getElementById(id); }
335
336function initClip() {
337//console.log(">>> initClip");
338 clip = new ZeroClipboard.Client();
339 clip.setHandCursor( true );
340
341 //clip.addEventListener('load', my_load);
342 //clip.addEventListener('mouseOver', my_mouse_over);
343 clip.addEventListener('complete', my_complete);
344
345 //clip.glue( 'd_clip_button' );
346//console.log("<<< initClip");
347}
348
349//function my_load(client) {
350 //console.log("Flash movie loaded and ready.");
351//}
352
353//function my_mouse_over(client) {
354 //// we can cheat a little here -- update the text on mouse over
355 //clip.setText( $('fe_text').value );
356//}
357
358function my_complete(client, text) {
359 //console.log("Copied text to clipboard: ... ");
360 //console.log("Copied text to clipboard: " + text );
361 clipperz_copiedContentToClipboard = true;
362 showTooltip();
363}
364
365//function debugstr(msg) {
366 //var p = document.createElement('p');
367 //p.innerHTML = msg;
368 //$('d_debug').appendChild(p);
369//}
370
371//#############################################################################
372
373_cble = null;
374
375//-----------------------------------------------------------------------------
376
377isLoginForm = function(aForm) {
378 var inputFields;
379 var passwordFieldsFound;
380 var i,c;
381
382//console.log("is login form: " + aForm.name + " (" + aForm.id + ")");
383 passwordFieldsFound = 0;
384 inputFields = aForm.elements;
385 c = inputFields.length;
386 for (i=0; i<c; i++) {
387 if (inputFields[i].type == "password") {
388 passwordFieldsFound ++;
389 }
390 }
391//console.log("number of password fields found: " + passwordFieldsFound);
392 return (passwordFieldsFound == 1);
393};
394
395//-----------------------------------------------------------------------------
396
397findLoginForm = function(aDocument, aLevel) {
398 varresult;
399 vardocumentForms;
400 var i,c;
401
402 result = null;
403
404 try {
405 documentForms = aDocument.getElementsByTagName('form');
406
407 c = documentForms.length;
408 for (i=0; (i<c) && (result == null); i++) {
409 if (isLoginForm(documentForms[i])) {
410 result = documentForms[i];
411 }
412 }
413
414 if ((result == null) && (aLevel == 0)) {
415 var iFrames;
416
417 iFrames = aDocument.getElementsByTagName('iframe');
418 c = iFrames.length;
419 for (i=0; (i<c) && (result == null); i++) {
420 result = findLoginForm(iFrames[i].contentDocument, (aLevel + 1));
421 }
422 }
423 } catch (e) {
424 _cble = e;
425 }
426
427 return result;
428};
429
430//-----------------------------------------------------------------------------
431
432inputElementValues = function(anInputElement) {
433 varresult;
434
435 //if ((anInputElement instanceof HTMLInputElement) && (anInputElement.getAttribute('name') != null)) {
436 if ((anInputElement.tagName.toLowerCase() == "input") && (anInputElement.getAttribute('name') != null)) {
437 result = {};
438 result.type = anInputElement.getAttribute('type') || "text";
439 result.name = anInputElement.getAttribute('name');
440 // result.value = anInputElement.getAttribute('value');
441 result.value = anInputElement.value;
442 if (anInputElement.type.toLowerCase() == 'radio') {
443 result.checked = anInputElement.checked;
444 }
445 //} else if ((anInputElement instanceof HTMLSelectElement) && (anInputElement.getAttribute('name') != null)) {
446 } else if ((anInputElement.tagName.toLowerCase() == 'select') && (anInputElement.getAttribute('name') != null)) {
447 varoptions;
448 var c,i;
449
450//console.log("input element values: %o", anInputElement);
451 result = {};
452 result.type = "select";
453 result.name = anInputElement.getAttribute('name');
454
455 result.options = [];
456 options = anInputElement.options;
457 c = options.length;
458 for (i=0; i<c; i++) {
459 varoption;
460
461 option = {};
462 option.selected = options[i].selected;
463 option.label = options[i].label || options[i].innerHTML;
464 option.value = options[i].value;
465 result.options.push(option);
466 }
467 } else {
468 result = null;
469 }
470
471 return result;
472};
473
474//-----------------------------------------------------------------------------
475
476formParameters = function(aLoginForm) {
477 varresult;
478 vari, c;
479 varaction;
480
481 if (aLoginForm == null) {
482 result = null;
483 } else {
484 varradioValues;
485 varradioValueName;
486
487 result = {};
488 radioValues = {};
489
490 action = aLoginForm.action;
491 if (action.constructor != String) {
492 action = aLoginForm.getAttribute('action');
493 }
494
495 if (/^https?\:\/\/.*/.test(action)) {
496 action = action;
497 } else if (/^\/.*/.test(action)) {
498 action = window.location.protocol + '/' + '/' + window.location.hostname + action;
499 } else {
500 action = window.location.href.replace(/\/[^\/]*$/, '/' + action);
501 }
502
503 result.attributes = {};
504 result.attributes.action = action;
505 result.attributes.method = aLoginForm.getAttribute('method');
506
507 result.inputs = [];
508 c = aLoginForm.elements.length;
509 for (i=0; i<c; i++) {
510 varinputElement;
511 varelementValues;
512
513 inputElement = aLoginForm.elements[i];
514 elementValues = inputElementValues(inputElement);
515 if (elementValues != null) {
516 if (elementValues.type != "radio") {
517 result.inputs.push(elementValues);
518 } else {
519 varradioValue;
520 varvalues;
521
522 radioValue = radioValues[elementValues.name];
523 if (radioValue == null) {
524 radioValue = {};
525 radioValue.name = elementValues.name;
526 radioValue.type = "radio";
527 radioValue.options = [];
528
529 radioValues[elementValues.name] = radioValue;
530 }
531
532 values = {};
533 values.value = elementValues.value;
534 values.checked = elementValues.checked;
535
536 radioValue.options.push(values);
537 }
538 }
539 }
540
541 for (radioValueName in radioValues) {
542 if (typeof(radioValues[radioValueName]) != "function") {
543 result.inputs.push(radioValues[radioValueName]);
544 }
545 }
546 }
547
548 return result;
549};
550
551//-----------------------------------------------------------------------------
552
553selectFaviconURL = function () {
554 var result;
555 var links;
556 var link;
557 var i;
558
559 // <link rel="icon" type="image/x-icon" href="http://example.com/favicon.ico" />
560 // <link rel="icon" type="image/vnd.microsoft.icon"href="http://example.com/image.ico" />
561 // <link rel="SHORTCUT ICON" type="image/x-icon" href="/horde/imp/graphics/favicon.ico" />
562 links = document.getElementsByTagName("head")[0].getElementsByTagName('link');
563
564 i = 0;
565 link = null;
566 while ((link == null) && (i < links.length)) {
567 if ((links[i].rel.toLowerCase() == 'icon') || (links[i].rel.toLowerCase() == 'shortcut icon')) {
568 link = links[i];
569 }
570
571 i++;
572 }
573
574 if (link != null) {
575 result = link.href;
576 } else {
577 result = "http://" + window.location.hostname + "/favicon.ico";
578 }
579
580 return result;
581}
582
583//-----------------------------------------------------------------------------
584
585pageParameters = function() {
586 var result;
587
588 result = {};
589 result['title'] = document.title;
590 result['favicon'] = selectFaviconURL();
591 result['url'] = window.location.href;
592
593 return result;
594};
595
596//-----------------------------------------------------------------------------
597
598reprString = function (o) {
599 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
600 ).replace(/[\f]/g, "\\f"
601 ).replace(/[\b]/g, "\\b"
602 ).replace(/[\n]/g, "\\n"
603 ).replace(/[\t]/g, "\\t"
604 ).replace(/[\r]/g, "\\r");
605};
606
607//-----------------------------------------------------------------------------
608
609serializeJSON = function (o) {
610 var objtype = typeof(o);
611 if (objtype == "number" || objtype == "boolean") {
612 return o + "";
613 } else if (o === null) {
614 return "null";
615 }
616
617 //var m = MochiKit.Base;
618 //var reprString = m.reprString;
619 if (objtype == "string") {
620 return reprString(o);
621 }
622
623 //recurse
624 var me = arguments.callee;
625 //array
626 if (objtype != "function" && typeof(o.length) == "number") {
627 var res = [];
628 for (var i = 0; i < o.length; i++) {
629 var val = me(o[i]);
630 if (typeof(val) != "string") {
631 val = "undefined";
632 }
633 res.push(val);
634 }
635 return "[" + res.join(",\n") + "]";
636 }
637
638 //undefined is outside of the spec
639 if (objtype == "undefined") {
640 // throw new TypeError("undefined can not be serialized as JSON");
641 throw new TypeError("error");
642 }
643
644 //generic object code path
645 res = [];
646 for (var k in o) {
647 if (typeof(o[k]) != "function") {
648 var useKey;
649 if (typeof(k) == "number") {
650 useKey = '"' + k + '"';
651 } else if (typeof(k) == "string") {
652 useKey = reprString(k);
653 } else {
654 //skip non-string or number keys
655 continue;
656 }
657
658 val = me(o[k]);
659 if (typeof(val) != "string") {
660 //skip non-serializable values
661 continue;
662 }
663 res.push(useKey + ":" + " " + val);
664 }
665 }
666
667 return "{" + res.join(",\n") + "}";
668};
669
670//-----------------------------------------------------------------------------
671
672getLoginFormConfiguration = function() {
673 varparameters;
674
675 parameters = {};
676 parameters.page = pageParameters();
677 parameters.form = formParameters(findLoginForm(document, 0));
678 parameters.version = "0.3.0";
679
680 return parameters;
681}
682
683//#############################################################################
684
685//-----------------------------------------------------------------------------
686
687closeClick = function () {
688 varbookmarkletDiv;
689
690 bookmarkletDiv = document.getElementById("clipperzBookmarkletWrapper");
691 bookmarkletDiv.parentNode.removeChild(bookmarkletDiv);
692};
693
694//-----------------------------------------------------------------------------
695
696logFormParameters = function(someParameters, anException) {
697 var showException;
698 varmessage;
699
700 if ((someParameters != null) && (someParameters.form != null) && (anException == null)) {
701 showException = false;
702 message = traslatableTexts['noExceptionMessage'];
703 } else {
704 showException = true
705 message = traslatableTexts['exceptionMessage'];
706 }
707
708 var newCSS = document.createElement('link');
709 newCSS.setAttribute("type", "text/css");
710 newCSS.setAttribute("rel", "stylesheet");
711 newCSS.setAttribute("media", "screen");
712 newCSS.setAttribute("href", "http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/Bookmarklet.css");
713 document.getElementsByTagName("head")[0].appendChild(newCSS);
714
715 var innerHTML;
716
717 innerHTML = "";
718 innerHTML +="<div id='clipperzBookmarklet'>" +
719 "<div id='clipperzBookmarkletClose'></div>" +
720 "<div id='clipperzBookmarkletResult'>" +
721 "<div id='clipperzBookmarkletResultIcon' class=" + ((showException == false) ? 'ok' : 'fail') + "></div>" +
722 "<p id='clipperzBookmarkletResultText'>" + message + "</p>" +
723 "</div>";
724
725 if (showException == false) {
726 innerHTML +="<div id='clipperzBookmarletButton'><span>" + traslatableTexts['copy'] + "</span></div>" +
727 "<div id='clipperzBookmarletAfterCopyHint' class='hidden'>" +
728 "<p id='clipperzBookmarkletHintText'>Lorem ipsum</p>" +
729 "</div>";
730 }
731
732 innerHTML +="</div>";
733
734 var newDiv = document.createElement('div');
735 newDiv.setAttribute("id", "clipperzBookmarkletWrapper");
736 newDiv.innerHTML = innerHTML;
737 document.body.appendChild(newDiv);
738
739 $('clipperzBookmarkletClose').onclick = closeClick;
740
741 if (showException == false) {
742 $('clipperzBookmarletButton').onclick = showTooltip;
743 setTimeout("clip.glue('clipperzBookmarletButton');", 1000);
744 }
745}
746
747showTooltip = function () {
748 if (clipperz_copiedContentToClipboard == true) {
749//console.log("SUCCEED");
750 $('clipperzBookmarkletHintText').innerHTML = traslatableTexts['successfulMessage'];
751 $('clipperzBookmarletAfterCopyHint').className = 'visible';
752 } else {
753//console.log("FAIL");
754 $('clipperzBookmarkletHintText').innerHTML = traslatableTexts['failMessage'];
755 }
756}
757
758//#############################################################################
759
760traslatableTexts = {
761 'noExceptionMessage':"@BOOKMARKLET_NO_EXCEPTION_MESSAGE@",
762 'exceptionMessage': "@BOOKMARKLET_EXCEPTION_MESSAGE@",
763 'copy': "@BOOKMARKLET_COPY@",
764 'successfulMessage':"@BOOKMARKLET_SUCCESSFUL_MESSAGE@",
765 'failMessage': "@BOOKMARKLET_FAIL_MESSAGE@"
766
767 // 'noExceptionMessage':"The direct login configuration has been collected.",
768 // 'exceptionMessage': "Sorry! There was an error while processing the page.",
769 // 'copy': "copy",
770 // 'successfulMessage':"DONE!",
771 // 'failMessage': "Failed! :("
772}
773
774//#############################################################################
775
776runBookmarklet = function () {
777 varparameters;
778
779 try {
780 initClip();
781
782 parameters = getLoginFormConfiguration();
783//console.log("configuration", serializeJSON(parameters))
784 clip.setText(serializeJSON(parameters));
785 clip.setHandCursor( true );
786 // clip.glue('clipperzBookmarletButton');
787
788 logFormParameters(parameters, _cble);
789 } catch (e) {
790 logFormParameters(parameters, e);
791 }
792
793};
794
795//#############################################################################
796
797if (document.body != null) {
798 runBookmarklet();
799};
800
801//#############################################################################
diff --git a/frontend/gamma/js/BookmarkletHash.js b/frontend/gamma/js/BookmarkletHash.js
new file mode 100644
index 0000000..2e0714c
--- a/dev/null
+++ b/frontend/gamma/js/BookmarkletHash.js
@@ -0,0 +1,47 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29 //18f820faffcdb5e847d4c5d5c4a1de6743baa1a0
30 //9b30434c73fb009b15fecaa904b44f9ced807577
31 //9b30434c73fb009b15fecaa904b44f9ced807577
32 varxh;
33 vardocumentText;
34
35try {
36 xh=new XMLHttpRequest();
37} catch(e) {
38 xh=new ActiveXObject("Msxml2.XMLHTTP");
39}
40
41xh.open("GET", window.location, false);
42xh.send(null);
43
44documentText = "#####" + xh.responseText + "####";
45//documentText = document.body.innerHTML;
46
47//console.log(documentText); \ No newline at end of file
diff --git a/frontend/gamma/js/Bookmarklet_1.js b/frontend/gamma/js/Bookmarklet_1.js
new file mode 100644
index 0000000..d117479
--- a/dev/null
+++ b/frontend/gamma/js/Bookmarklet_1.js
@@ -0,0 +1,400 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29_cble = null;
30
31//-----------------------------------------------------------------------------
32
33isLoginForm = function(aForm) {
34 var inputFields;
35 var passwordFieldsFound;
36 var i,c;
37
38//console.log("is login form: " + aForm.name + " (" + aForm.id + ")");
39 passwordFieldsFound = 0;
40 inputFields = aForm.elements;
41 c = inputFields.length;
42 for (i=0; i<c; i++) {
43 if (inputFields[i].type == "password") {
44 passwordFieldsFound ++;
45 }
46 }
47//console.log("number of password fields found: " + passwordFieldsFound);
48 return (passwordFieldsFound == 1);
49};
50
51//-----------------------------------------------------------------------------
52
53findLoginForm = function(aDocument, aLevel) {
54 varresult;
55 vardocumentForms;
56 var i,c;
57
58 result = null;
59
60 try {
61 documentForms = aDocument.getElementsByTagName('form');
62
63 c = documentForms.length;
64 for (i=0; (i<c) && (result == null); i++) {
65 if (isLoginForm(documentForms[i])) {
66 result = documentForms[i];
67 }
68 }
69
70 if ((result == null) && (aLevel == 0)) {
71 var iFrames;
72
73 iFrames = aDocument.getElementsByTagName('iframe');
74 c = iFrames.length;
75 for (i=0; (i<c) && (result == null); i++) {
76 result = findLoginForm(iFrames[i].contentDocument, (aLevel + 1));
77 }
78 }
79 } catch (e) {
80 _cble = e;
81 }
82
83 return result;
84};
85
86//-----------------------------------------------------------------------------
87
88inputElementValues = function(anInputElement) {
89 varresult;
90
91 //if ((anInputElement instanceof HTMLInputElement) && (anInputElement.getAttribute('name') != null)) {
92 if ((anInputElement.tagName.toLowerCase() == "input") && (anInputElement.getAttribute('name') != null)) {
93 result = {};
94 result.type = anInputElement.getAttribute('type') || "text";
95 result.name = anInputElement.getAttribute('name');
96 // result.value = anInputElement.getAttribute('value');
97 result.value = anInputElement.value;
98 if (anInputElement.type.toLowerCase() == 'radio') {
99 result.checked = anInputElement.checked;
100 }
101 //} else if ((anInputElement instanceof HTMLSelectElement) && (anInputElement.getAttribute('name') != null)) {
102 } else if ((anInputElement.tagName.toLowerCase() == 'select') && (anInputElement.getAttribute('name') != null)) {
103 varoptions;
104 var c,i;
105
106//console.log("input element values: %o", anInputElement);
107 result = {};
108 result.type = "select";
109 result.name = anInputElement.getAttribute('name');
110
111 result.options = [];
112 options = anInputElement.options;
113 c = options.length;
114 for (i=0; i<c; i++) {
115 varoption;
116
117 option = {};
118 option.selected = options[i].selected;
119 option.label = options[i].label || options[i].innerHTML;
120 option.value = options[i].value;
121 result.options.push(option);
122 }
123 } else {
124 result = null;
125 }
126
127 return result;
128};
129
130//-----------------------------------------------------------------------------
131
132formParameters = function(aLoginForm) {
133 varresult;
134 vari, c;
135 varaction;
136
137 if (aLoginForm == null) {
138 result = null;
139 } else {
140 varradioValues;
141 varradioValueName;
142
143 result = {};
144 radioValues = {};
145
146 action = aLoginForm.action;
147 if (action.constructor != String) {
148 action = aLoginForm.getAttribute('action');
149 }
150
151 if (/^https?\:\/\/.*/.test(action)) {
152 action = action;
153 } else if (/^\/.*/.test(action)) {
154 action = window.location.protocol + '/' + '/' + window.location.hostname + action;
155 } else {
156 action = window.location.href.replace(/\/[^\/]*$/, '/' + action);
157 }
158
159 result.attributes = {};
160 result.attributes.action = action;
161 result.attributes.method = aLoginForm.getAttribute('method');
162
163 result.inputs = [];
164 c = aLoginForm.elements.length;
165 for (i=0; i<c; i++) {
166 varinputElement;
167 varelementValues;
168
169 inputElement = aLoginForm.elements[i];
170 elementValues = inputElementValues(inputElement);
171 if (elementValues != null) {
172 if (elementValues.type != "radio") {
173 result.inputs.push(elementValues);
174 } else {
175 varradioValue;
176 varvalues;
177
178 radioValue = radioValues[elementValues.name];
179 if (radioValue == null) {
180 radioValue = {};
181 radioValue.name = elementValues.name;
182 radioValue.type = "radio";
183 radioValue.options = [];
184
185 radioValues[elementValues.name] = radioValue;
186 }
187
188 values = {};
189 values.value = elementValues.value;
190 values.checked = elementValues.checked;
191
192 radioValue.options.push(values);
193 }
194 }
195 }
196
197 for (radioValueName in radioValues) {
198 if (typeof(radioValues[radioValueName]) != "function") {
199 result.inputs.push(radioValues[radioValueName]);
200 }
201 }
202 }
203
204 return result;
205};
206
207//-----------------------------------------------------------------------------
208
209pageParameters = function() {
210 var result;
211
212 result = {};
213 result['title'] = document.title;
214//<link rel="icon" href="http://example.com/favicon.ico" type="image/x-icon">
215
216 return result;
217};
218
219//-----------------------------------------------------------------------------
220
221reprString = function (o) {
222 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
223 ).replace(/[\f]/g, "\\f"
224 ).replace(/[\b]/g, "\\b"
225 ).replace(/[\n]/g, "\\n"
226 ).replace(/[\t]/g, "\\t"
227 ).replace(/[\r]/g, "\\r");
228};
229
230//-----------------------------------------------------------------------------
231
232serializeJSON = function (o) {
233 var objtype = typeof(o);
234 if (objtype == "number" || objtype == "boolean") {
235 return o + "";
236 } else if (o === null) {
237 return "null";
238 }
239
240 //var m = MochiKit.Base;
241 //var reprString = m.reprString;
242 if (objtype == "string") {
243 return reprString(o);
244 }
245
246 //recurse
247 var me = arguments.callee;
248 //array
249 if (objtype != "function" && typeof(o.length) == "number") {
250 var res = [];
251 for (var i = 0; i < o.length; i++) {
252 var val = me(o[i]);
253 if (typeof(val) != "string") {
254 val = "undefined";
255 }
256 res.push(val);
257 }
258 return "[" + res.join(",\n") + "]";
259 }
260
261 //undefined is outside of the spec
262 if (objtype == "undefined") {
263 // throw new TypeError("undefined can not be serialized as JSON");
264 throw new TypeError("error");
265 }
266
267 //generic object code path
268 res = [];
269 for (var k in o) {
270 if (typeof(o[k]) != "function") {
271 var useKey;
272 if (typeof(k) == "number") {
273 useKey = '"' + k + '"';
274 } else if (typeof(k) == "string") {
275 useKey = reprString(k);
276 } else {
277 //skip non-string or number keys
278 continue;
279 }
280
281 val = me(o[k]);
282 if (typeof(val) != "string") {
283 //skip non-serializable values
284 continue;
285 }
286 res.push(useKey + ":" + " " + val);
287 }
288 }
289
290 return "{" + res.join(",\n") + "}";
291};
292
293//-----------------------------------------------------------------------------
294
295closeBookmarklet = function() {
296 varbookmarkletDiv;
297
298 bookmarkletDiv = document.getElementById("clipperz_bookmarklet");
299 bookmarkletDiv.parentNode.removeChild(bookmarkletDiv);
300};
301
302//-----------------------------------------------------------------------------
303
304logFormParameters = function(someParameters, anException) {
305 varnewDiv;
306 var base_url;
307 varhelp_url;
308 // varbase_image_url;
309 varlogo_image_url;
310 varbackground_image_url;
311 varclose_image_url;
312 varbookmarklet_textarea;
313 var innerHTML;
314
315//
316 //Obsolete: image -> base64 encoding done here: http://www.motobit.com/util/base64-decoder-encoder.asp
317 //conversion done using the Filemark Maker application: http://www.insanelygreattees.com/news/?p=51
318//
319
320 base_url = "http://www.clipperz.com/";
321 help_url = base_url + "help/bookmarklet";
322 //base_image_url = base_url + "files/clipperz.com/bookmarklet/";
323 //logo_image_url = base_image_url + "logo.png";
324 logo_image_url = "data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAXCAYAAABOMABkAAAACXBIWXMAAAsTAAALEwEAmpwYAAANJ2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjardd5NJRv2AfwaxbGMmbGGHsY2Xcle/YtkWzZUpKdYSYmScqSlDVLKNoo2oQWEonqR5YkyZKtyJKlFLJkmfcPqd7feZfznvNefzzneu7nj/t+7nM+3/vcAHgNdxqNggSAwCB6sK2ZIdnJ2YWM6QQM4IAXsCDi7hFCM7C2toT/uhAA852AAABoV3Cn0SjwfytcsJOzCwBCHgBIPuu9PgCQDq739gBAOkKn0QEQvgBA8vB19wRARACAfLC9rREA4iYA4HzW+woAwB1c7xsAABfq4UMHQHQDMBODPP2CADBTAMy6nl4hHgA4eQDw9AzxCATApQKAVWAg1RMA9xEApD1owXQAPAsAKDg5u5DXl7w3AWAbPwCLxZ+xI5kAZXkA0rv+jIk9AuBxB8hP/jM2awsIAEDwtIZ4q2xd30GsIQDTAIMxKwmASQdYTWMwlvMZjNVrAKg+gFqKx+Hg0I39RrQA/G/v6//8q1AIACQAQhxRiAxHRaAjmE4wR2FiWE6yGrPWsZ1mP4ON50jClRN8OdOIaVzppHPcmTyZvNl8dQJUwdxNuUKXhBvIh0XzN18Ta5U4Jlko1SZzQvaOXKdCjOJdpZ4tp7feV/mgmqRWrj6omaJVqT2qk6H7VG/CIMvwudFXkxzTerMZ8ys7myzmd+Vbvd79xvqNTZvtiv3tPR0OnY5dTt0u6L33XPv29e8fcPtw4ONBrMdjz2GvEe9RnzHfz37jAdyUZ4Ffgr5Sp2nfDn0PngmZo88d/hE6f2QhbPHoUvjPYysRK8dXI2WiOmIQJ5GxqFPoOKbTzGcw8SwJrIlsSezJ2BSOs7hUfBohnTODeI4rk5TFnc1znvcCXw5/rsBFwUubLgtdEb4qkkfOF722+bpYgXihxA2pm1K3pG/L3JG9M1lEuStfrFCiVKp8b8v9LQ+2PtxWplquVj7/KLRC/bFGpVaV9pPt1duf6jxdq4ms1Xum/9zgheE/RnXouth6k5emDWaN5k3mzWzNia8sWixfW7XiWs++sW6zeWvbTmxPf2fXYd+5p4unK7vb8b1Tj0uvQG9un2u/68C+D8Ifrnx0GzwwJDqU/+ngsMeI56jEaOGY92efcd8JmYnbk/5TAV8oXxW+Fk8HfaN+p81smbk/GzwX8oM+rzpfvhC6GLZ09OfRZa3lqpVjqxFrOmtPGQwAhBgSh/yGakbfYcpgjsD4sNizGrFtY5fCSnHw4XjxfAQ+Tm6iJJc0SYPbkmc/bwhfCn+JQLPguBCXsJqID/m86EsxhLiOxCHJe1LTMtKyFLkqBZSigVKa8uBWGZW4bV1qsuo0jTotXu2w7a90efSo+s8NxY2OGbeZCpuF7ag2X7LYYum1K9OqzRpnY2YbZldg/86BzVHf6ZDzJZf6vdP7RPbvdgs/kO9ed3Dck9tLz9vJ54TvVb9a//6ApUCuIDmqMc33UERwakg+vexwQ2jvkYmw+XDUMc4I8nH5E6qR+lEW0btj9p48EOt1ihJHPx18Jio+KuFkYnxSenJiSs7ZC6nZaWnpFzPSz2Vlns+6mX3jfPGFmzl3cksuPrn05HLdlVdX2/La89uvtV/vLRguHLsxdHPk1vTt73emi77enSmeLpksnbo3dn/wwdDDnrK28sZHtRWPHpdUXqxKfxJVHfh0b41F7fZnss+Jz5defPynqe5hfcbL4Aa7RrUmwSZGc8+rhy0Jr11axVpH3zxoO/7WpB3X3v/uaod/p0rnaldLd8b7fT0yPbO9lX0x/RYDpIGBD7c+hgxqD6GHmj6dG94/IjUyNVo5Fv155zj3eP/E9UnKlOrU2pfGr+nTe7+Jf5v6/mAmYtZsjjjX/aNgnrqguYhafLmU9nPvstjyl5Xy1ag1cwYPgwEAJxFhyHCUNqoSfZxJj6mGORpzisWUpY41ju00ewJ2J7aZIxmXjE8h7Ca0cqYS07kySBnc9tzveLJ4s/jO8+cI5Armbroo5CrUL3xF5Co5TzRvc57YNfHrEgWShVI3pG/K3JL1k52Quy1fpHBXsVipRLl0y72t91UebHuoWq5Wrl6uEaaxqFmpValdtf2JTrXuCd01vRr9WoNnhs+NXhjHmqBN6kzrzV7uaDBv3NlkkWiJtXy1q8Xq9e5W61Qbgk2b7Vu7dvt3ezodshx5HLucup3fu/TszXUVdO3b17//g9vHAx/d8w6KHhzy+OQ57DXiXegjuZ4g/hMBdyjylKn/lCKzv1Ok4qjG0aXwn8eWI1aOr55Yi2REQwzyd5JgzmDiWeIbE3Ymsidhk7EpHGfxqYQ0zt9ZwpPNe57vV5Zs+jtL8oeueVwXKxAvlLwhuZEmRfJ3FYoV/8oSlbJt5aqP1CvUH2tUalZpP9Gu3v5Ut0b3rxwxqTd9adpg1rijybzZ4lXo682tVm+s26zf2rQf75DtdOhy7I7pUep16YsbUPkQP6g6lDTsOao9ljbuN+n/hTJN/Z4w5zJ/dilx1ZbBAFg/+wAAmNUAsuQAHHIA7PIB4uQApNwAeG4CWHMA2GsCkkkYkDo0QOzU2Tg/AAEEEAJFMARnCIFUKIVFBBlhgQhD3ES8Rowh8UgzZDSyGrmC0kFFo+pRK2hRtDO6EP2DyZTpFFMJ0zSzGXMe8yiGG+OKqWbBsGiyxLJMsmqxUllr2RTYotgq2HHs0ezvsSRsEPYzhwnHSY5BnDvuOR6F98ZPEWwIWYRVznjOGaIWsYBLnauAa5rkRlrg9uMu55HjecnrzYfhu80vwX+Ef07gkqCZ4Oymq0LiQhHCCOEyEX+yKLlH9NzmzZujxPBireJpEnskBSSHpO5IG0nfkjGU5ZQdlHsgf1rBVVFFCas0pvzPlvytMSqe28xU5dW41FbURzWyNXGatVql2nnbz+mc0Y3UO6J/yIBi6Gfka+xrEmAaZEbfccw8dudZi1zLW7sqrBp391l/t8XYCdtr7LFzoDmmOBU7v3GZdeXbp7vf2y31QJX7Zw9eTzOvo95Ffnz+1gEJlLogJNWAFn3oRQgz3eJwepj4UWr4kwi24y4niiIZ0faxyFOucY/OcMUfSmhLzkxZSnVLq89QOpeTHXL+U45dbt3l4qsSeZeu8RYSbqTcwt0+eze7RKj0+n2FMuPytgr3x9+reZ8W1Rq+oNfh64sadjYntCi8bnsT2l7fQesS7G7ok+zv/pAwqDdcNOr5WWS854vDNM+3rpmcObeFqaWy5UgGH4MBAEhgA16QAT1wgsOQCRUwgMAglBFuiBREDWIWKYt0Q+Yg36HwqF2oJFQLmgO9G52J7mUiM/kxlTItMhsxn2V+j5HAHMa8YCGyeLJUsLKzurIWs6HZ9rM9ZGdj92CvwXJjadgWDlmOZI4pnCWuBM+Bp+I7CfqE65w4zlDOXqIp8R4XmSuda40UQvrC7c89wUPhmeGl887zhfMj+JMEBARuC2oK1m9y2DQuFCXML1wuYiMyQY4TlRRt2Bwkxiv2VNxDAivxTDJISkTqrXS8jKHMqmyVXIS8jvyCQo3iGSV7ZVHl6S01W9NU/LcZqwqrLqt1qD/WuKQZreWj7bhdR0dJV1SPqI82QBnMGH43mjaeNBk1nTWb3PFjJ9KCZMm7a4uV7u7d1rY2AbZH7XLt7+955dDruOJMclHaa+V6aN+F/XVuY+6sB5U9fD1zvGq8v/nK+Hn5Zwd0BAoG7aHm0j4HS4eE0htDhY6EhDWFix1LiZg44RzZEK0WUxBLPJVymngmK4EvMTdZNeV1qlfaz4zkTPWskfOXc/wv7rksc5Upb+ra84KyGxduxd3xuOtaYnpP48G2MsVHCo+lqySqpWuUn+m92FFn85LSeKg5reVq65O2gXZGp0i3To9nX+JA5cepT/wjhmNR4zcnh78KfPOeuTw3uiC9FLRcvoZgMACAGQggBIbgDKlQCm837G+4X1ePxqOd0T+YTJlyfnlfw7iyiLDEskyy2rPWsimwXWTHsUezL2CDsJ85PHHuuE94b/wUIYSwyhlP5CEWcKlzNZHcSAvcqb9NW/HP/fJsLYwQLvtl2WZd8i/HoTKGfxv+I/iX37eatVqlf+z+kfvfu/2f1PoM+vH5W/9bbWjPv93G3P5bbtLWP3KzmDfsXtLc0Hs9Y8NvEXFD8IOKDcNVJ9cVP+vZcNw43pzw6p+WrNdtb0LfCrXXd9A6S7viuht6Qvsk+wMGjD8kDOoNnf50cLhoZH60/bPIeMCE+aT0FOaLw9fC6bhvPt93zMjOss9+nXvz48F81oL9wtRi7JLhT6mfo8uRK3wrl1c5V2NXF9auMxIZDID1+xIAALAZUSnUYLKlkTH8/1Yg5fDGHEgAwHoF7bEDACIASPvRze0BgAQAWmAEVKAAFYKBDJZgBMa/nmTw+P3FD2D9LgcAwEwAuOgIAFCzeCzq3/PSvcLoAABGVNrRYD8fXzrZgEajeJGNqIG0w3SvYHmyeZCHojx5q7KyKgDAfwBYjP/gNJJdnQAAAARnQU1BAADY6/UcFKoAAAAgY0hSTQAAbZgAAHOOAADeVAAAgmQAAHjTAADDvAAAMucAABx04zkiNwAACnFJREFUeNrsnHts1FUWxz+/32/enemL0sLQ0kIfUh5ioQiCQGtFRNmCWElFWFwDEohgQNmwJVAx+pcEWERJLFZFDQ93eSgiAtsl8iyV1LYLpaWtpVBK2Q6lj5npvH6zf7QMjFOUxXUTy++bTGZy55x7z9w53zn3nHMzgtfr9aJAgYJuofo1yuXldaxZ8zEej0zv3qGsXbsQg0HL9u0F7NjxTwDS01NYsmSGstMK7j+CtLfbKSmpRpZloqN74/HIANTXN3Hy5FkkSSQmJkrZZQX3J0FEUUCrVSPLXtTqW1PFxvYhLe0hRFEiObm/sssK7k+C3AlZWRPIypqg7K6CnkmQ8vI6jhz5gZqaBjwemX79evHww4MYM2YIarX0i5NWV1+hqqoeALM5gmHDBgBQUlJNWVkNXi+MHp1MbGwUu3cfpbi4GpfLTXx8X6ZMGc3AgX395jt1qpyqqssApKWlEBxsYM+eo5SV1QKQmNiPp54aQ3R0RLf2uFweTp06y4kTZ6mvtxAcbGDo0DgefzyViIhgP9mqqnqf7QMHmklKiubs2Vr27j1Oc3M7K/+STWhHIdhugCB2vwFeGdRGiJkEolrxsp5CEJfLw7p1O9m27R+0t9vxeGQ8HhmNRkV+/n5GjnyAN998ibi47vMKQeh8/vLL46xduwNJkpg+fTwbN74CwOHDZ1i//gtEUWT+/KnU1l7l0KHvAdBoVEiSyNat37J8eTZZWRN98+7efYzPPz+IWq1iyZIZFBaWc+LE2QC93Ny5TJqU6mdTXd01cnM/5tSpszidLlwuD5IkIkkieXn7eOONFxk//kGf/J49x9iw4W8AvPbaTMrLzeTmfkR7ux2tXseSRZMJPf4qNJyH238rhK4HgAcINcPsMtCGK17WUwjyzjvbyc/fT1CQjtBQI6mpgzAYdBQXV2CxtFFYeI6lSzexdWsOJpP+jpNqNGqCgw2AgF6vvW1chcmkJyhIz969x7Ba7aSlPURUVDjl5bVcvHiVjg4na9Z8TEREKGlpwwHQ6dSYTAaMRh2ffnoQh8PFpEmphIQYKSur5upVC62tNlas+ICIiFBSUhIAaGpqZdGi9Vy4cBmNRsWgQfEkJfWnoaGJ0tJqrl69ztKl7/Hhh39m+PB4n+0mkx6tVsOZMxfYvr2gkxxaNSqpixHGEDAZQKXrSsYk8AKO64AIHhdIkuJdPYkgJSXV7NhRgNGoRxQF3n57HpMnjwKgtraR+fPfoa6ukaKi8+za9R1z507+VQvb7U4WL36WRYumAWCzOVi27H2OHy9Flr1s2fK1jyA3Icte3G6ZlSvnMGtWBgDXr7fxyisbKSurwmZz8dFHB0hJ6YxYmzfv9ZFjxoyJrF79RySp81i0adNuNm/ei9XawaZNe8jLe81vLbVaorS0Go1GxUsvPcUjjwxGlr2E946EJ/eBx9EZMgSh8xh1+EX48evOqOIGBk5TokcPgO8QfeDAaTo6nLhcbjIyUn3kAIiLi2LhwmlkZIwkM3OcX8XqXuB0uhk8OJZ58572jRkMWl599VkMBh1qtYqKiotUV1/5iZ6LUaMG+cgBEB5uYvHiZxBFEa1Www8/VHL9ehs2m4MjR4rRaFSEhZlYsOAPPnIAzJ07mZiYSFQqkeLiSl/ecTsZvV6ZnJzZ5OS8QHp6ChkZIwgyGkAXAUH9IMgMhr5QtrmLHBI4PDDoGZiwQfGunhRBzp+/hEolIcteRo16IEBwxozxzJgx/n+yqMvlZtiwAWg0/kRLSOiH2RxBVdVlXC43dXWNxMebfe+73R5GjEgMmG/w4FgiI8O4dq2ZlhYrjY3NSJKAxdKKWq3C7fbw1lufBujZbB1IkoTV2kFFxSUSEvr55WOxsX2YMuXhn/8wJX+FE6tBJYLTA3ETYdJW/BMUBb9rgng8MnZ7B6IoIIoCvXoF/8bLejGZDAGjarVEUJDeR4bWVluATHBwUMBYUJAOrVbti052uwNBEHA4XBiNOhwOFwcPFvHTWzU6nRZRhI4OJ42NzX7veTweoqMj/XKoAFTthGPLOsnhliFqKEzeBiqj4lk9iSCSJKLRqJFlkGUZi6U1QLClxUp9fVNnjmrU079/5K9YVuDGDWu35Vir1d5pmErCYAh0zhs32gLGrNYOHA5XF8lUaLVq37PT6SYiIoS1axd2fUbZp6fValCpJJxON9HRvbstNtwRlwvg8J/g5nwhMTDli84jl4Ked8RKSDBTWHgOlUqiqKiCmTPT/ATz8/fzwQf7AC+zZk1i1ao597yoWq2itLQam83hR4Iff2zgypUmJElCq5WIje3jb2yXbV6vF+FmTRmoqLiExdKCIAiYTHqiosLR6dT06hXMtWvN2O0OBgwwB5Sna2oasFhakSQxoB/ys7CUwLfZ4LJ1lnZ14fD0bggdpHhUT03Sp04di0ajQq1WUVBwhq++OukTKiqqYPfuo77k/Pa+wb1Ao1FRWXmJd9/dhdvt8VWj1q37AputA5fLTVJSf5KSov30tFoNxcWV5OV97Ru7csXChg1/x+Vy43A4efDBeCIigjEa9UycOByn001bm42NG3fR1mb36R05UsLs2W8xc+Yb5OTkIct3eanZWg/7n4P2f3cm5YIIo9+EsEFgvXLbox7cVsXDekoEGTEikdmznyAvbx8Gg47c3Hy2bStApRKpqKjDbndis3WQmfloQPn1XmA06snP38/Ro6VERYVTW9vAtWvNiKIIyLz88tRu9QwGHevX7+SbbwoJDw/mwoVLNDe3IQgiBoOa+fNv6S1YkElhYTlVVfUcOnSasrJq+vePwmq1U1l5CbvdiU6nYdmy57o9znV/tPoOLBdAowZkECT4/m0oXP2TUl0bpL0Pg+cpXtYTCAKwfHk2JpOBzz47iMXSysmT/+JmjmI06snOzmDFiudvS2RlX8fdZgvyJcFOp4vWVhuSJGG3OwIWdTicTJ06DoNByyefHKC0tMbXEe/VK5jXX8/uloQOh5Pnn3+clhYbO3cW4PHI6PUaAMzmXqxcOcfXJASIigrjvfeWsmbNJ5w+fY6amltXYDQaFVFRYSxZ8ixTpoy+5ddOF21tdkRR9OVD/umTt7NT7nTd3AXoaAiUcwIuJYL0KIKIosCiRdPIzBzHsWOlXLzYCECfPuGkpj7AkCFxfsqJidFs3ry0qyKk8VV8MjPHkZwciyAImM2B96Pcbhm9Xs2qVXPIyBhBYeE57HYnMTGRpKen3PFOldvtISQkiJycF3jyyVTOnKnE6XQzcGBfHntsBJGRoQE6cXFRbNnyOkVFFZSWVtPU1IJGoyIxMZqxY4fSu3eIn/z06Y8ydOgABEEgMjIs0AjzeJi24873sHy/Hk7oM1rxsJ5EkJuIjo4gO/uxX1QOCzMG3H0CiI83+/UvuvUfT2e0GTt2CGPHDrlrg29WodLTU0hPT7krHUkSGTMmmTFjkn9RNiGhn18/JPBsGAMJMYrn3G9JugIFCu4ygvxWcDrdWK0O3+v/Tq/jv9ZToOB3RZAnnhhFTEwkoigwYMDdN9SysiYwcmQisuwlOTlW+dYU/N8gKP9qokDBnfGfAQA9nOAwz2UemwAAAABJRU5ErkJgggo=";
325 //background_image_url = base_image_url + "background.png";
326 background_image_url = "data:image/png;charset=utf-8;base64,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Llccuo/bX7mtHavu9cv5eoDJDda5Pqy1sepe31SbHYj247Uj1V/nst/6md4GjwFsDetFqTkGrWO9729auKY364HqwumpX1VTtRqnqc71dtDWm7aAq2/Y+bq53o7Ucufr5noTs+7jjG2zgtVEph2n5uuZqpo6cOCOj+39yK2fn5nZ8dler39Tr9ff1+v1rtmk5weukOFwOD8cDo4NB4OfnFta+Pe33n3x8SNHDh2uUagWazVayzVqQzdeY9uMaaY9ITWxml45Zm644c4b9u05+Bcz03NfrOpNbcLzAVvKcHlx8czXjh7//pePHDn0eo2itdQ6lmvt0nFskwarvYxrh2q6quYO3vrFz+/c+dG/r15v54TPA2xxw+Fw/uTJo1964aWHH6+qszUKV3O0l41jLw8nmXg2itVMVW3/9ME//KPt26//cq/Xm5vgOYAQvV5vdnZ21xf2XPfx08feev75zrc3ZQ9rkgmrvQxsQjVTVdtu+/h9X9i1a/8/9nq9NY9/8y37655776zP3HFb7d+/p3bs0DJIs7Bwto4efbuee/aFeuzRZ+qVl4+u+f5wWIMTJ177k/995bFvVNWZGk1bZ2t1edhMW5ds3GB196xmaxSruX37fu2mGw/c+a/tDfXp6an60z/7/brv/ruq3++v/4hAnMFgUA8/9FQ9+MAjtbS0fP724XA4//Jr3/zd48d/8GqNonWmqs7V6r7WWPtZ4y4Jm2A1pyrM1Cha2z9x02//1fT07K82d5yenqoH/+GP6+7P3V6dgQsI1+v16pc+dWN9+lduricf/04NBsPm9tkd266/9o03v/eftbpv1d58rxpjmThJsJpTF2aqaq6q5vbu/eWb9u659e+qeufHqC/9+R/U3Z+7fcynARLccMPe2r17Rz3z9A/P3zY9PfuJhbMnvnHmzPH3au27hGOf4jDO+qx7GkOz2T67b89tv9U+deHmW/bXffffNc7rAsLcd/9ddfMt+1u39Kb2XX/w7qraXqvbRu1zNC95yTXJhlL77PWZqpqdm939G+073HPvnfas4EOi3+/XPffeuea27XPX/XqNVmCztTrcTNWFf5J3cc8x5mtb7x3CuX5/+hfad/rMHbeN+fBAou7vfH9q5kBVbatRsGZr7YR1ycYNVvtPcM4vCfv9qb3tO+3fv2fMhwcSdX/np3pT19dowmpOe2omrO4nuFyUcfewmssmXNNVNdPr9be37+g8K/hw6f7O9/pTzXTV7F+NHauqyZaE7T2sZsoC6Gomq+a4Ypvu3Y+D6XcOgK7uR0t1+3HRJt10735CA0BX+93Bsaerqsmmom4lncYOrGe9yeqKB6vqwkkLoGviUDUmnbAAfpaN3hG8ome6t1+ICQvYyHr/W9ZVWRIC/CybthoTLCDGJKc1AIzrii4Ju2tRAQPez0a9uGJ/Swhwsd6vGxfdFHtYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXE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";
327 //close_image_url = base_image_url + "close.png";
328 close_image_url = "data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAIAAAC0D9CtAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGiSURBVHjaYvz//z8DiYAFU+jhg5cXLtx9/+4LLy+nlpa8hpYsIyMjTj03rj/u71l74fxdZEEFRfG8wkBrG224CCPcbfv2XKivWfjr1x+s7snM8U1IcoOwmeA24NEABNOnbN698yyKHqCTIBrcPU2WrKiIjHYEsh2c9BctK0tMcYeomdC37sePXyAW0G0P7r8wM8yBoFs3n/wHgwP7L/79+xfI+Pnzl6VpHkR27+7zQBGQPcie3rr5JIRh76DHxASS3bHtzN8//yCCF87fgbrt/fsvcD3Ll+4/eOASnPvg/suO1hVwLjACoHqA8QAXBfrB1k4HOaDjEl3hXF4+LqgeYMTBRZNS3CFOAtoAEUlIdGNmgQaVlrYcVA8wpoHmQUT377v469fvTRuOR4W1zZi25cf3X6DAAPuHi4vd1l4XEadHj1wtypsB0QY0Fe5pZHZOvn9svAsifoBJAxjTEDZcETLbw8s0Js4ZPe0AATCmgRH35vUn5BQAdFJSqgdQAzylMqLlBWBMHztyDRgPoHTNxwX0NNAP/PzcyGoYycg/AAEGABYVzxqE3YcJAAAAAElFTkSuQmCCCg==";
329
330 //newDiv.parentNode.removeChild(newDiv);
331 newDiv = document.createElement('div');
332 newDiv.setAttribute("id", "clipperz_bookmarklet");
333 //newDiv.setAttribute("style", "width:270px; height:400px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ");");
334
335 innerHTML = "";
336 innerHTML +="<style>div#ClipperzBackgroundDIV { width:290px; height:420px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ") }</style>";
337 innerHTML +="<div style=\"border:0px; margin:0px; padding:0px; padding-left:10px;\">" +
338 "<img style=\"padding-top:5px;\" src=\"" + logo_image_url + "\">" +
339 "<a href=\"javascript:closeBookmarklet();\">" +
340 "<img style=\"padding-left:28px; padding-bottom:10px;\" border=0 src=\"" + close_image_url + "\">" +
341 "</a>" +
342 "</div>";
343
344 if ((someParameters != null) && (anException == null)) {
345 innerHTML +="<div style=\"width:255px; border-top:1px dotted #336;\">" +
346 "<div style=\"line-height:10pt; margin-right:10px; margin-top:5px; padding:5px 10px; color:#666; text-align:left; font-family:sans-serif;\">" +
347 "<p style=\"margin:0px; font-weight:bold; font-size:10pt; font-family:sans-serif;\">How to add a new card or a direct login to an existing card for this website:</p>" +
348 "<ol style=\"padding:0px 0px 0px 20px; font-size:9pt; font-family:sans-serif;\">" +
349 "<li>Copy the content of the text area below (Ctrl-C)</li>" +
350 "<li>Go to your Clipperz account</li>" +
351 "<li>Click \"Add new card\" or select the related card</li>" +
352 "<li>Paste the direct login configuration (Ctrl-V)</li>" +
353 "<li>Complete and review the details, then click \"Save\"</li>" +
354 "</ol>" +
355 "</div>" +
356 "</div>";
357 innerHTML +="<textarea id=\"bookmarklet_textarea\" style=\"border:2px solid #333366; font-family:sans-serif; font-size:8pt; color:#336; width:240px; height:135px; padding:4px; background-color:white; margin:0px 10px;\">" +
358 serializeJSON(someParameters) +
359 "</textarea>";
360 } else if ((someParameters == null) && (anException == null)) {
361 innerHTML += "<div>No login form has been found on the page</div><div>Get some help <a href=\"#\">here</a></div>";
362 } else {
363 innerHTML += "<div>An error happened while processing the page</div><div>Get some help <a href=\"#\">here</a></div><div>" + anException.name + " - " + anException.message + "</div>";
364 }
365
366 //newDiv.innerHTML = "<div style='width:290px; height:420px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ")'>" + innerHTML + "</div>";
367 newDiv.innerHTML = "<div id=\"ClipperzBackgroundDIV\">" + innerHTML + "</div>";
368
369 document.body.appendChild(newDiv);
370
371 if ((someParameters != null) && (anException == null)) {
372 bookmarklet_textarea = document.getElementById("bookmarklet_textarea");
373 bookmarklet_textarea.focus();
374 bookmarklet_textarea.select();
375 }
376};
377
378//-----------------------------------------------------------------------------
379
380getLoginFormConfiguration = function() {
381 varparameters;
382
383 try {
384 parameters = {};
385 parameters.page = pageParameters();
386 parameters.form = formParameters(findLoginForm(document, 0));
387 parameters.version = "0.2.3";
388 logFormParameters(parameters, _cble);
389 } catch (e) {
390 //parameters = "No login form has been found"
391 logFormParameters(parameters, e);
392 }
393}
394
395//-----------------------------------------------------------------------------
396
397getLoginFormConfiguration();
398
399
400
diff --git a/frontend/gamma/js/Bookmarklet_2.js b/frontend/gamma/js/Bookmarklet_2.js
new file mode 100644
index 0000000..f9c40a9
--- a/dev/null
+++ b/frontend/gamma/js/Bookmarklet_2.js
@@ -0,0 +1,767 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29clipperz_copiedContentToClipboard = false;
30
31//#############################################################################
32
33// Simple Set Clipboard System
34// Author: Joseph Huckaby
35
36var ZeroClipboard = {
37
38 version: "1.0.4",
39 clients: {}, // registered upload clients on page, indexed by id
40 //moviePath: 'ZeroClipboard.swf', // URL to movie
41 //moviePath: 'data:application/octet-stream;charset=utf-8;base64,Q1dTCYgGAAB4nH1V61LbRhTeXV2OJNsYczFgIEC4JCGABSRpSy+B2JDQQtWJocl0BqK1tUZqhOSRZAj/8ih9hz5AXsGZTl+ndHUhxU2nO56z3/l05uye7+wc6xr6DeUxqpcUhFCNXF9ffxjNcYhRo8U8NruO0IeRLTkm+BpEa4i8/+t3GRGUrRf5tktDe41dMC8Kpd14Q/DM911GPfHCd6zCLyzwa67Tafo0sAppuOWEHZdeyY1O4ERMbnajyPcKIYteUM+qdYPQD/It12m9jX2XBcSx5EYUON6ZwunOEXsXAY+O94HsAu8iFnjULe1mYN/je5u2WLnvAsnRNGrZ6rnfDZlxwQKxRV1XSd1ulPJ1/9KDBB13pDCiZ2ygEdsGj2WHvsXU3dc7taM3e/tHanjDZVqEV2HEzpUGa3V5dVd4Ocfz+5d1/5w6nnbgU4sF+17bFwPfjzT3k691aEDPGb92KBvNX1krmrOjqLNVrVLLb7K1ln9e3WlsVjd0/Um12XXcyPFy6ZHdyHHDkT5tt1JtF/rJerqn6Wu+F/ErsWCmPyiRjrYi54KlgZP/k2Tq9gPYSh5APZOYBVra2VicAtfyn+4qZwHt2E4rVJvszPH2HNcVD2lkS5eOxW3b9f1AtplzZkeKFdDLl/wkibodmyrUsmq241raYdye5ECpdrBf+2GQf0ncA4c3gJelHRrHjd03xs+7L9UMHh9lZN149aOSwuOfcnFO3qQmbb0V44aoSVEXlHeikXQzz1/bpzek8E50XN6o4r/KLfQpU/pMx/J/yz9cxmWhDOOyhMqD5SkJjQnKYnmpIlfuVe5XHlSWKw8rC6QoEayoWk7MFwaKg6Whx4AJEBGIBEQGQQFJBaKBlAMpD6QA0gCQIsglICNAxkGYAFIBMgkwDWQGhFkgc0DuApkHsqDmMZAVIKtA1oBUgejqOmc21E1uHwF5DOQJ4C+AfAnkKyBbQL4G8g2Qb4F8B+o2wA6QZ4DrIOyCsAfCcw0lUwR/ZvgiOP3IhwgWcDZIsCipIpJkPmskBBiBgpGiIqQJOJdYPqbiOaRiUcRIQ5hrIfT055ySiKYVzMLKkKmuDM8aAyInyW1yNCOF22Q5I8Xb5FhGSjLR8n/gnv5q+U+9t4/MojnYLtEhc3jljjGCGT4Z7bXL7bG9Udwefz9xjk9Vhl3crtjqqXwifS8hWzblJToZmylTbk+vYuMOjsECWjZnkuDZvTmcwbscGvOiKVcxXThZNGVjkQebS+17pmLcJwl8sI1v4PI2uYEPt4UbuLItxrCwoplgrMagaOZTENf2NK0NryE8gWRCVE3p6ae5j3aOFwyZb8of6RT3FYn7Y9yvmjlDx1mKGncSfVTC9Z/v6QyZE7q5rpsburmpm490U+K/12g6WXYc+nR4CKX/H31zGG1z5m9Pt5okCg==',
42 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf',
43 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf',
44 nextId: 1, // ID of next movie
45
46 $: function(thingy) {
47 // simple DOM lookup utility function
48 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
49 if (!thingy.addClass) {
50 // extend element with a few useful methods
51 thingy.hide = function() { this.style.display = 'none'; };
52 thingy.show = function() { this.style.display = ''; };
53 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
54 thingy.removeClass = function(name) {
55 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
56 };
57 thingy.hasClass = function(name) {
58 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
59 }
60 }
61 return thingy;
62 },
63
64 setMoviePath: function(path) {
65 // set path to ZeroClipboard.swf
66 this.moviePath = path;
67 },
68
69 dispatch: function(id, eventName, args) {
70 // receive event from flash movie, send to client
71 var client = this.clients[id];
72 if (client) {
73 client.receiveEvent(eventName, args);
74 }
75 },
76
77 register: function(id, client) {
78 // register new client to receive events
79 this.clients[id] = client;
80 },
81
82 getDOMObjectPosition: function(obj) {
83 // get absolute coordinates for dom element
84 var info = {
85 left: 0,
86 top: 0,
87 width: obj.width ? obj.width : obj.offsetWidth,
88 height: obj.height ? obj.height : obj.offsetHeight
89 };
90
91 while (obj) {
92 info.left += obj.offsetLeft;
93 info.top += obj.offsetTop;
94 obj = obj.offsetParent;
95 }
96
97 return info;
98 },
99
100 Client: function(elem) {
101 // constructor for new simple upload client
102 this.handlers = {};
103
104 // unique ID
105 this.id = ZeroClipboard.nextId++;
106 this.movieId = 'ZeroClipboardMovie_' + this.id;
107
108 // register client with singleton to receive flash events
109 ZeroClipboard.register(this.id, this);
110
111 // create movie
112 if (elem) this.glue(elem);
113 }
114};
115
116ZeroClipboard.Client.prototype = {
117
118 id: 0, // unique ID for us
119 ready: false, // whether movie is ready to receive events or not
120 movie: null, // reference to movie object
121 clipText: '', // text to copy to clipboard
122 handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
123 cssEffects: true, // enable CSS mouse effects on dom container
124 handlers: null, // user event handlers
125
126 glue: function(elem) {
127 // glue to DOM element
128 // elem can be ID or actual DOM element object
129//console.log(">>> glue");
130 this.domElement = ZeroClipboard.$(elem);
131
132 // float just above object, or zIndex 99 if dom element isn't set
133 var zIndex = 99;
134 if (this.domElement.style.zIndex) {
135 zIndex = parseInt(this.domElement.style.zIndex) + 1;
136 }
137
138 // find X/Y position of domElement
139 var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
140
141 // create floating DIV above element
142 this.div = document.createElement('div');
143 var style = this.div.style;
144 style.position = 'absolute';
145 style.left = '' + box.left + 'px';
146 style.top = '' + box.top + 'px';
147 style.width = '' + box.width + 'px';
148 style.height = '' + box.height + 'px';
149 style.zIndex = zIndex;
150
151 // style.backgroundColor = '#f00'; // debug
152
153 var body = document.getElementsByTagName('body')[0];
154 body.appendChild(this.div);
155
156 this.div.innerHTML = this.getHTML( box.width, box.height );
157//console.log("<<< glue");
158 },
159
160 getHTML: function(width, height) {
161 // return HTML for movie
162 var html = '';
163 var flashvars = 'id=' + this.id +
164 '&width=' + width +
165 '&height=' + height;
166
167 if (navigator.userAgent.match(/MSIE/)) {
168 // IE gets an OBJECT tag
169 var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
170 html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
171 }
172 else {
173 // all other browsers get an EMBED tag
174 html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
175 }
176 return html;
177 },
178
179 hide: function() {
180 // temporarily hide floater offscreen
181 if (this.div) {
182 this.div.style.left = '-2000px';
183 }
184 },
185
186 show: function() {
187 // show ourselves after a call to hide()
188 this.reposition();
189 },
190
191 destroy: function() {
192 // destroy control and floater
193 if (this.domElement && this.div) {
194 this.hide();
195 this.div.innerHTML = '';
196
197 var body = document.getElementsByTagName('body')[0];
198 try { body.removeChild( this.div ); } catch(e) {;}
199
200 this.domElement = null;
201 this.div = null;
202 }
203 },
204
205 reposition: function(elem) {
206 // reposition our floating div, optionally to new container
207 // warning: container CANNOT change size, only position
208 if (elem) {
209 this.domElement = ZeroClipboard.$(elem);
210 if (!this.domElement) this.hide();
211 }
212
213 if (this.domElement && this.div) {
214 var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
215 var style = this.div.style;
216 style.left = '' + box.left + 'px';
217 style.top = '' + box.top + 'px';
218 }
219 },
220
221 setText: function(newText) {
222 // set text to be copied to clipboard
223 this.clipText = newText;
224 if (this.ready) this.movie.setText(newText);
225 },
226
227 addEventListener: function(eventName, func) {
228 // add user event listener for event
229 // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
230 eventName = eventName.toString().toLowerCase().replace(/^on/, '');
231 if (!this.handlers[eventName]) this.handlers[eventName] = [];
232 this.handlers[eventName].push(func);
233 },
234
235 setHandCursor: function(enabled) {
236 // enable hand cursor (true), or default arrow cursor (false)
237 this.handCursorEnabled = enabled;
238 if (this.ready) this.movie.setHandCursor(enabled);
239 },
240
241 setCSSEffects: function(enabled) {
242 // enable or disable CSS effects on DOM container
243 this.cssEffects = !!enabled;
244 },
245
246 receiveEvent: function(eventName, args) {
247 // receive event from flash
248 eventName = eventName.toString().toLowerCase().replace(/^on/, '');
249
250 // special behavior for certain events
251 switch (eventName) {
252 case 'load':
253 // movie claims it is ready, but in IE this isn't always the case...
254 // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
255 this.movie = document.getElementById(this.movieId);
256 if (!this.movie) {
257 var self = this;
258 setTimeout( function() { self.receiveEvent('load', null); }, 1 );
259 return;
260 }
261
262 // firefox on pc needs a "kick" in order to set these in certain cases
263 if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
264 var self = this;
265 setTimeout( function() { self.receiveEvent('load', null); }, 100 );
266 this.ready = true;
267 return;
268 }
269
270 this.ready = true;
271 this.movie.setText( this.clipText );
272 this.movie.setHandCursor( this.handCursorEnabled );
273 break;
274
275 case 'mouseover':
276 if (this.domElement && this.cssEffects) {
277 this.domElement.addClass('hover');
278 if (this.recoverActive) this.domElement.addClass('active');
279 }
280 break;
281
282 case 'mouseout':
283 if (this.domElement && this.cssEffects) {
284 this.recoverActive = false;
285 if (this.domElement.hasClass('active')) {
286 this.domElement.removeClass('active');
287 this.recoverActive = true;
288 }
289 this.domElement.removeClass('hover');
290 }
291 break;
292
293 case 'mousedown':
294 if (this.domElement && this.cssEffects) {
295 this.domElement.addClass('active');
296 }
297 break;
298
299 case 'mouseup':
300 if (this.domElement && this.cssEffects) {
301 this.domElement.removeClass('active');
302 this.recoverActive = false;
303 }
304 break;
305 } // switch eventName
306
307 if (this.handlers[eventName]) {
308 for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
309 var func = this.handlers[eventName][idx];
310
311 if (typeof(func) == 'function') {
312 // actual function reference
313 func(this, args);
314 }
315 else if ((typeof(func) == 'object') && (func.length == 2)) {
316 // PHP style object + method, i.e. [myObject, 'myMethod']
317 func[0][ func[1] ](this, args);
318 }
319 else if (typeof(func) == 'string') {
320 // name of function
321 window[func](this, args);
322 }
323 } // foreach event handler defined
324 } // user defined handler for event
325 }
326
327};
328
329//#############################################################################
330
331var clip = null;
332
333function $(id) { return document.getElementById(id); }
334
335function initClip() {
336//console.log(">>> initClip");
337 clip = new ZeroClipboard.Client();
338 clip.setHandCursor( true );
339
340 //clip.addEventListener('load', my_load);
341 //clip.addEventListener('mouseOver', my_mouse_over);
342 clip.addEventListener('complete', my_complete);
343
344 //clip.glue( 'd_clip_button' );
345//console.log("<<< initClip");
346}
347
348//function my_load(client) {
349 //console.log("Flash movie loaded and ready.");
350//}
351
352//function my_mouse_over(client) {
353 //// we can cheat a little here -- update the text on mouse over
354 //clip.setText( $('fe_text').value );
355//}
356
357function my_complete(client, text) {
358 //console.log("Copied text to clipboard: ... ");
359 //console.log("Copied text to clipboard: " + text );
360 clipperz_copiedContentToClipboard = true;
361 showTooltip();
362}
363
364//function debugstr(msg) {
365 //var p = document.createElement('p');
366 //p.innerHTML = msg;
367 //$('d_debug').appendChild(p);
368//}
369
370//#############################################################################
371
372_cble = null;
373
374//-----------------------------------------------------------------------------
375
376isLoginForm = function(aForm) {
377 var inputFields;
378 var passwordFieldsFound;
379 var i,c;
380
381//console.log("is login form: " + aForm.name + " (" + aForm.id + ")");
382 passwordFieldsFound = 0;
383 inputFields = aForm.elements;
384 c = inputFields.length;
385 for (i=0; i<c; i++) {
386 if (inputFields[i].type == "password") {
387 passwordFieldsFound ++;
388 }
389 }
390//console.log("number of password fields found: " + passwordFieldsFound);
391 return (passwordFieldsFound == 1);
392};
393
394//-----------------------------------------------------------------------------
395
396findLoginForm = function(aDocument, aLevel) {
397 varresult;
398 vardocumentForms;
399 var i,c;
400
401 result = null;
402
403 try {
404 documentForms = aDocument.getElementsByTagName('form');
405
406 c = documentForms.length;
407 for (i=0; (i<c) && (result == null); i++) {
408 if (isLoginForm(documentForms[i])) {
409 result = documentForms[i];
410 }
411 }
412
413 if ((result == null) && (aLevel == 0)) {
414 var iFrames;
415
416 iFrames = aDocument.getElementsByTagName('iframe');
417 c = iFrames.length;
418 for (i=0; (i<c) && (result == null); i++) {
419 result = findLoginForm(iFrames[i].contentDocument, (aLevel + 1));
420 }
421 }
422 } catch (e) {
423 _cble = e;
424 }
425
426 return result;
427};
428
429//-----------------------------------------------------------------------------
430
431inputElementValues = function(anInputElement) {
432 varresult;
433
434 //if ((anInputElement instanceof HTMLInputElement) && (anInputElement.getAttribute('name') != null)) {
435 if ((anInputElement.tagName.toLowerCase() == "input") && (anInputElement.getAttribute('name') != null)) {
436 result = {};
437 result.type = anInputElement.getAttribute('type') || "text";
438 result.name = anInputElement.getAttribute('name');
439 // result.value = anInputElement.getAttribute('value');
440 result.value = anInputElement.value;
441 if (anInputElement.type.toLowerCase() == 'radio') {
442 result.checked = anInputElement.checked;
443 }
444 //} else if ((anInputElement instanceof HTMLSelectElement) && (anInputElement.getAttribute('name') != null)) {
445 } else if ((anInputElement.tagName.toLowerCase() == 'select') && (anInputElement.getAttribute('name') != null)) {
446 varoptions;
447 var c,i;
448
449//console.log("input element values: %o", anInputElement);
450 result = {};
451 result.type = "select";
452 result.name = anInputElement.getAttribute('name');
453
454 result.options = [];
455 options = anInputElement.options;
456 c = options.length;
457 for (i=0; i<c; i++) {
458 varoption;
459
460 option = {};
461 option.selected = options[i].selected;
462 option.label = options[i].label || options[i].innerHTML;
463 option.value = options[i].value;
464 result.options.push(option);
465 }
466 } else {
467 result = null;
468 }
469
470 return result;
471};
472
473//-----------------------------------------------------------------------------
474
475formParameters = function(aLoginForm) {
476 varresult;
477 vari, c;
478 varaction;
479
480 if (aLoginForm == null) {
481 result = null;
482 } else {
483 varradioValues;
484 varradioValueName;
485
486 result = {};
487 radioValues = {};
488
489 action = aLoginForm.action;
490 if (action.constructor != String) {
491 action = aLoginForm.getAttribute('action');
492 }
493
494 if (/^https?\:\/\/.*/.test(action)) {
495 action = action;
496 } else if (/^\/.*/.test(action)) {
497 action = window.location.protocol + '/' + '/' + window.location.hostname + action;
498 } else {
499 action = window.location.href.replace(/\/[^\/]*$/, '/' + action);
500 }
501
502 result.attributes = {};
503 result.attributes.action = action;
504 result.attributes.method = aLoginForm.getAttribute('method');
505
506 result.inputs = [];
507 c = aLoginForm.elements.length;
508 for (i=0; i<c; i++) {
509 varinputElement;
510 varelementValues;
511
512 inputElement = aLoginForm.elements[i];
513 elementValues = inputElementValues(inputElement);
514 if (elementValues != null) {
515 if (elementValues.type != "radio") {
516 result.inputs.push(elementValues);
517 } else {
518 varradioValue;
519 varvalues;
520
521 radioValue = radioValues[elementValues.name];
522 if (radioValue == null) {
523 radioValue = {};
524 radioValue.name = elementValues.name;
525 radioValue.type = "radio";
526 radioValue.options = [];
527
528 radioValues[elementValues.name] = radioValue;
529 }
530
531 values = {};
532 values.value = elementValues.value;
533 values.checked = elementValues.checked;
534
535 radioValue.options.push(values);
536 }
537 }
538 }
539
540 for (radioValueName in radioValues) {
541 if (typeof(radioValues[radioValueName]) != "function") {
542 result.inputs.push(radioValues[radioValueName]);
543 }
544 }
545 }
546
547 return result;
548};
549
550//-----------------------------------------------------------------------------
551
552pageParameters = function() {
553 var result;
554
555 result = {};
556 result['title'] = document.title;
557//<link rel="icon" href="http://example.com/favicon.ico" type="image/x-icon">
558
559 return result;
560};
561
562//-----------------------------------------------------------------------------
563
564reprString = function (o) {
565 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
566 ).replace(/[\f]/g, "\\f"
567 ).replace(/[\b]/g, "\\b"
568 ).replace(/[\n]/g, "\\n"
569 ).replace(/[\t]/g, "\\t"
570 ).replace(/[\r]/g, "\\r");
571};
572
573//-----------------------------------------------------------------------------
574
575serializeJSON = function (o) {
576 var objtype = typeof(o);
577 if (objtype == "number" || objtype == "boolean") {
578 return o + "";
579 } else if (o === null) {
580 return "null";
581 }
582
583 //var m = MochiKit.Base;
584 //var reprString = m.reprString;
585 if (objtype == "string") {
586 return reprString(o);
587 }
588
589 //recurse
590 var me = arguments.callee;
591 //array
592 if (objtype != "function" && typeof(o.length) == "number") {
593 var res = [];
594 for (var i = 0; i < o.length; i++) {
595 var val = me(o[i]);
596 if (typeof(val) != "string") {
597 val = "undefined";
598 }
599 res.push(val);
600 }
601 return "[" + res.join(",\n") + "]";
602 }
603
604 //undefined is outside of the spec
605 if (objtype == "undefined") {
606 // throw new TypeError("undefined can not be serialized as JSON");
607 throw new TypeError("error");
608 }
609
610 //generic object code path
611 res = [];
612 for (var k in o) {
613 if (typeof(o[k]) != "function") {
614 var useKey;
615 if (typeof(k) == "number") {
616 useKey = '"' + k + '"';
617 } else if (typeof(k) == "string") {
618 useKey = reprString(k);
619 } else {
620 //skip non-string or number keys
621 continue;
622 }
623
624 val = me(o[k]);
625 if (typeof(val) != "string") {
626 //skip non-serializable values
627 continue;
628 }
629 res.push(useKey + ":" + " " + val);
630 }
631 }
632
633 return "{" + res.join(",\n") + "}";
634};
635
636//-----------------------------------------------------------------------------
637
638getLoginFormConfiguration = function() {
639 varparameters;
640
641 parameters = {};
642 parameters.page = pageParameters();
643 parameters.form = formParameters(findLoginForm(document, 0));
644 parameters.version = "0.3.0";
645
646 return parameters;
647}
648
649//#############################################################################
650
651//-----------------------------------------------------------------------------
652
653closeClick = function () {
654 varbookmarkletDiv;
655
656 bookmarkletDiv = document.getElementById("clipperzBookmarkletWrapper");
657 bookmarkletDiv.parentNode.removeChild(bookmarkletDiv);
658};
659
660//-----------------------------------------------------------------------------
661
662logFormParameters = function(someParameters, anException) {
663 var showException;
664 varmessage;
665
666 if ((someParameters != null) && (someParameters.form != null) && (anException == null)) {
667 showException = false;
668 message = "The direct login configuration has been collected.";
669 } else {
670 showException = true
671 message = "Sorry! There was an error while processing the page.";
672 }
673
674 var newCSS = document.createElement('link');
675 newCSS.setAttribute("type", "text/css");
676 newCSS.setAttribute("rel", "stylesheet");
677 newCSS.setAttribute("media", "screen");
678 newCSS.setAttribute("href", "http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/Bookmarklet.css");
679 //newCSS.innerHTML = cssHTML;
680 document.getElementsByTagName("head")[0].appendChild(newCSS);
681
682 var innerHTML;
683
684 innerHTML = "";
685 // innerHTML +="<div id='clipperzBookmarklet' style='" + reset_css + clipperzBookmarklet_style + "'>" +
686 // "<div id='clipperzBookmarkletClose' style='" + reset_css + clipperzBookmarkletClose_style + "'></div>" +
687 // "<div id='clipperzBookmarkletResult' style='" + reset_css + clipperzBookmarkletResult_style + "'>" +
688 // "<div id='clipperzBookmarkletResultIcon' style='" + reset_css + clipperzBookmarkletResultIcon_style + "'></div>" +
689 // "<p id='clipperzBookmarkletResultText' style='" + reset_css + clipperzBookmarkletResultText_style + "'>" + message + "</p>" +
690 // "</div>";
691//
692 //if (showException == false) {
693 // innerHTML +="<div id='clipperzBookmarletButton' style='" + clipperzBookmarletButton_style + "'></div>" +
694 // "<div id='clipperzBookmarletAfterCopyHint' style='" + clipperzBookmarletAfterCopyHint_style + "'>" +
695 // "<p id='clipperzBookmarkletHintText' style='" + clipperzBookmarkletHintText_style + "'></p>" +
696 // "</div>";
697 //}
698
699 innerHTML +="<div id='clipperzBookmarklet'>" +
700 "<div id='clipperzBookmarkletClose'></div>" +
701 "<div id='clipperzBookmarkletResult'>" +
702 "<div id='clipperzBookmarkletResultIcon'></div>" +
703 "<p id='clipperzBookmarkletResultText'>" + message + "</p>" +
704 "</div>";
705
706 if (showException == false) {
707 innerHTML +="<div id='clipperzBookmarletButton'></div>" +
708 "<div id='clipperzBookmarletAfterCopyHint' class='hidden'>" +
709 "<p id='clipperzBookmarkletHintText'>Lorem ipsum</p>" +
710 "</div>";
711 }
712
713 innerHTML +="</div>";
714
715 var newDiv = document.createElement('div');
716 newDiv.setAttribute("id", "clipperzBookmarkletWrapper");
717 newDiv.innerHTML = innerHTML;
718 document.body.appendChild(newDiv);
719
720 $('clipperzBookmarkletClose').onclick = closeClick;
721
722 if (showException == false) {
723 $('clipperzBookmarletButton').onclick = showTooltip;
724 setTimeout("clip.glue('clipperzBookmarletButton');", 1000);
725 }
726}
727
728showTooltip = function () {
729 if (clipperz_copiedContentToClipboard == true) {
730//console.log("SUCCEED");
731 $('clipperzBookmarkletHintText').innerHTML = "DONE!";
732 $('clipperzBookmarletAfterCopyHint').className = 'visible';
733 } else {
734//console.log("FAIL");
735 $('clipperzBookmarkletHintText').innerHTML = "Failed! :(";
736 }
737}
738
739//#############################################################################
740
741//#############################################################################
742
743runBookmarklet = function () {
744 varparameters;
745
746 try {
747 initClip();
748
749 parameters = getLoginFormConfiguration();
750//console.log("configuration", serializeJSON(parameters))
751 clip.setText(serializeJSON(parameters));
752 // clip.glue('clipperzBookmarletButton');
753
754 logFormParameters(parameters, _cble);
755 } catch (e) {
756 logFormParameters(parameters, e);
757 }
758
759}
760
761//#############################################################################
762
763if (document.body != null) {
764 runBookmarklet();
765}
766
767//#############################################################################
diff --git a/frontend/gamma/js/Bookmarklet_IE.js b/frontend/gamma/js/Bookmarklet_IE.js
new file mode 100644
index 0000000..6b3e5c0
--- a/dev/null
+++ b/frontend/gamma/js/Bookmarklet_IE.js
@@ -0,0 +1,23 @@
1//
2 //IE limit: 508 characters!!!!!
3//
4
5loadClipperzBookmarklet = function() {
6 varheadNode;
7 var clipperzScript;
8
9 clipperzScript = document.getElementById('clipperzScript');
10 headNode = document.getElementsByTagName("head").item(0);
11
12 if (clipperzScript) {
13 headNode.removeChild(clipperzScript);
14 }
15
16 clipperzScript = document.createElement('script');
17 clipperzScript.setAttribute('src', 'http%3a%2f%2fclipperz.com%2ffiles%2fclipperz.com%2fbookmarklet%2fBookmarklet.js');
18 clipperzScript.setAttribute('type', 'text/javascript');
19 clipperzScript.setAttribute('defer', true);
20 headNode.appendChild(clipperzScript);
21};
22
23loadClipperzBookmarklet();
diff --git a/frontend/gamma/js/Clipperz/Async.js b/frontend/gamma/js/Clipperz/Async.js
new file mode 100644
index 0000000..e80c3a2
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Async.js
@@ -0,0 +1,707 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//Clipperz.Async = MochiKit.Async;
30
31
32if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
33if (typeof(Clipperz.Async) == 'undefined') { Clipperz.Async = {}; }
34
35Clipperz.Async.VERSION = "0.1";
36Clipperz.Async.NAME = "Clipperz.Async";
37
38Clipperz.Async.Deferred = function(aName, args) {
39 args = args || {};
40
41 Clipperz.Async.Deferred.superclass.constructor.call(this, args.canceller);
42
43 this._args = args;
44 this._name = aName || "Anonymous deferred";
45 this._count = 0;
46 this._shouldTrace = ((CLIPPERZ_DEFERRED_TRACING_ENABLED === true) || (args.trace === true));
47 this._vars = null;
48
49 return this;
50}
51
52//=============================================================================
53
54Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, {
55
56 'name': function () {
57 return this._name;
58 },
59
60 'args': function () {
61 return this._args;
62 },
63
64 //-----------------------------------------------------------------------------
65
66 'callback': function (aValue) {
67 if (this._shouldTrace) {
68 Clipperz.log("CALLBACK " + this._name, aValue);
69 }
70
71 if (this.chained == false) {
72 var message;
73
74 message = "ERROR [" + this._name + "]";
75 this.addErrback(function(aResult) {
76 if (! (aResult instanceof MochiKit.Async.CancelledError)) {
77 Clipperz.log(message, aResult);
78 }
79 return aResult;
80 });
81
82 if (this._shouldTrace) {
83 var resultMessage;
84
85 resultMessage = "RESULT " + this._name + " <==";
86 // this.addCallback(function(aResult) {
87 Clipperz.Async.Deferred.superclass.addCallback.call(this, function(aResult) {
88 Clipperz.log(resultMessage, aResult);
89
90 return aResult;
91 });
92 }
93 }
94
95 if (CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED === true) {
96 Clipperz.log("callback " + this._name, this);
97 }
98
99 return Clipperz.Async.Deferred.superclass.callback.apply(this, arguments);
100 },
101
102 //-----------------------------------------------------------------------------
103
104 'addCallback': function () {
105 var message;
106
107 if (this._shouldTrace) {
108 this._count ++;
109 message = "[" + this._count + "] " + this._name + " ";
110 // this.addBoth(function(aResult) {Clipperz.log(message + "-->", aResult); return aResult;});
111 this.addCallbacks(
112 function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;},
113 function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
114 );
115 }
116
117 Clipperz.Async.Deferred.superclass.addCallback.apply(this, arguments);
118
119 if (this._shouldTrace) {
120 // this.addBoth(function(aResult) {Clipperz.log(message + "<--", aResult); return aResult;});
121 this.addCallbacks(
122 function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;},
123 function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;}
124 );
125 }
126 },
127
128 //=============================================================================
129
130 'addCallbackPass': function() {
131 var passFunction;
132
133 passFunction = MochiKit.Base.partial.apply(null, arguments);
134
135 this.addCallback(function() {
136 var result;
137
138 result = arguments[arguments.length -1];
139 passFunction();
140
141 return result;
142 });
143 },
144
145 //-----------------------------------------------------------------------------
146
147 'addErrbackPass': function() {
148 var passFunction;
149
150 passFunction = MochiKit.Base.partial.apply(null, arguments);
151
152 this.addErrback(function() {
153 var result;
154
155 result = arguments[arguments.length -1];
156 passFunction();
157
158 return result;
159 });
160 },
161
162 //-----------------------------------------------------------------------------
163
164 'addBothPass': function() {
165 var passFunction;
166
167 passFunction = MochiKit.Base.partial.apply(null, arguments);
168
169 this.addBoth(function() {
170 var result;
171
172 result = arguments[arguments.length -1];
173 passFunction();
174
175 return result;
176 });
177 },
178
179 //-----------------------------------------------------------------------------
180
181 'addIf': function (aThenBlock, anElseBlock) {
182 this.addCallback(MochiKit.Base.bind(function (aValue) {
183 var deferredResult;
184
185 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) {
186 deferredResult = Clipperz.Async.callbacks(this._name + " <then>", aThenBlock, null, aValue);
187 } else {
188 deferredResult = Clipperz.Async.callbacks(this._name + " <else>", anElseBlock, null, aValue);
189 }
190
191 return deferredResult;
192 }))
193 },
194
195 //-----------------------------------------------------------------------------
196
197 'addMethod': function () {
198 this.addCallback(MochiKit.Base.method.apply(this, arguments));
199 },
200
201 //-----------------------------------------------------------------------------
202
203 'addMethodcaller': function () {
204 this.addCallback(MochiKit.Base.methodcaller.apply(this, arguments));
205 },
206
207 //=============================================================================
208
209 'addLog': function (aLog) {
210 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) {
211 this.addBothPass(function(res) {Clipperz.log(aLog + " ", res);});
212 // this.addBothPass(function(res) {console.log(aLog + " ", res);});
213 }
214 },
215
216 //=============================================================================
217
218 'acquireLock': function (aLock) {
219 // this.addCallback(function (aResult) {
220 // return Clipperz.Async.callbacks("Clipperz.Async.acquireLock", [
221 // MochiKit.Base.method(aLock, 'acquire'),
222 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult)
223 // ], {trace:false});
224 // });
225
226 this.addCallback(MochiKit.Base.method(aLock, 'acquire'));
227 },
228
229 'releaseLock': function (aLock) {
230 // this.addCallback(function (aResult) {
231 // return Clipperz.Async.callbacks("Clipperz.Async.release <ok>", [
232 // MochiKit.Base.method(aLock, 'release'),
233 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult)
234 // ], {trace:false});
235 // });
236 // this.addErrback(function (aResult) {
237///console.log("releaseLock.addErrback:", aResult);
238 // return Clipperz.Async.callbacks("Clipperz.Async.release <fail>", [
239 // MochiKit.Base.method(aLock, 'release'),
240 // MochiKit.Base.partial(MochiKit.Async.fail, aResult)
241 // ], {trace:false});
242 // });
243
244 // this.addBothPass(MochiKit.Base.method(aLock, 'release'));
245 this.addCallbackPass(MochiKit.Base.method(aLock, 'release'));
246 this.addErrback(function (anError) {
247 aLock.release();
248
249 return anError;
250 });
251 },
252
253 //=============================================================================
254
255 'collectResults': function (someRequests) {
256 this.addCallback(Clipperz.Async.collectResults(this._name + " <collect results>", someRequests, this._args));
257 },
258
259 'addCallbackList': function (aRequestList) {
260 this.addCallback(Clipperz.Async.callbacks, this._name + " <callback list>", aRequestList, this._args);
261 },
262
263 //=============================================================================
264
265 'vars': function () {
266 if (this._vars == null) {
267 this._vars = {}
268 }
269
270 return this._vars;
271 },
272
273 'setValue': function (aKey) {
274 this.addCallback(MochiKit.Base.bind(function (aValue) {
275 this.vars()[aKey] = aValue;
276 return aValue;
277 }, this));
278 },
279
280 'getValue': function (aKey) {
281 this.addCallback(MochiKit.Base.bind(function () {
282 return this.vars()[aKey];
283 }, this));
284 },
285
286 //=============================================================================
287
288 __syntaxFix__: "syntax fix"
289});
290
291//#############################################################################
292
293Clipperz.Async.DeferredSynchronizer = function(aName, someMethods) {
294 this._name = aName || "Anonymous deferred Synchronizer";
295 this._methods = someMethods;
296
297 this._numberOfMethodsDone= 0;
298 this._methodResults = [];
299
300 this._result = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer # " + this.name(), {trace:false});
301 this._result.addMethod(this, 'methodResults');
302 this._result.addCallback(function(someResults) {
303 varcancels;
304 var errors;
305 var result;
306
307 cancels = MochiKit.Base.filter(function(aResult) { return (aResult instanceof MochiKit.Async.CancelledError)}, someResults);
308
309 if (cancels.length == 0) {
310 errors = MochiKit.Base.filter(function(aResult) { return (aResult instanceof Error)}, someResults);
311
312 if (errors.length == 0) {
313 // result = MochiKit.Async.succeed(someResults);
314 result = someResults;
315 } else {
316 result = MochiKit.Async.fail(someResults);
317 }
318 } else {
319 result = MochiKit.Async.fail(cancels[0]);
320 }
321
322 return result;
323 }/*, this._methodResults */);
324
325 return this;
326}
327
328MochiKit.Base.update(Clipperz.Async.DeferredSynchronizer.prototype, {
329
330 //-----------------------------------------------------------------------------
331
332 'name': function() {
333 return this._name;
334 },
335
336 //-----------------------------------------------------------------------------
337
338 'methods': function() {
339 return this._methods;
340 },
341
342 'methodResults': function() {
343 return this._methodResults;
344 },
345
346 //-----------------------------------------------------------------------------
347
348 'result': function() {
349 return this._result;
350 },
351
352 //-----------------------------------------------------------------------------
353
354 'numberOfMethodsDone':function() {
355 return this._numberOfMethodsDone;
356 },
357
358 'incrementNumberOfMethodsDone': function() {
359 this._numberOfMethodsDone ++;
360 },
361
362 //-----------------------------------------------------------------------------
363
364 'run': function(args, aValue) {
365 var deferredResults;
366 var i, c;
367
368 deferredResults = [];
369 args = args || {};
370
371 c = this.methods().length;
372 for (i=0; i<c; i++) {
373 var deferredResult;
374 varmethodCalls;
375 var ii, cc;
376
377//console.log("TYPEOF", typeof(this.methods()[i]));
378 if (typeof(this.methods()[i]) == 'function') {
379 methodCalls = [ this.methods()[i] ];
380 } else {
381 methodCalls = this.methods()[i];
382 }
383
384 cc = methodCalls.length;
385 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer.run => " + this.name() + "[" + i + "]", args);
386 for (ii=0; ii<cc; ii++) {
387 deferredResult.addCallback(methodCalls[ii]);
388 }
389 deferredResult.addBoth(MochiKit.Base.method(this, 'handleMethodCallDone', i));
390
391 deferredResults.push(deferredResult);
392 }
393
394 for (i=0; i<c; i++) {
395 deferredResults[i].callback(aValue);
396 }
397
398 return this.result();
399 },
400
401 //-----------------------------------------------------------------------------
402
403 'handleMethodCallDone': function(anIndexValue, aResult) {
404 this.incrementNumberOfMethodsDone();
405 this.methodResults()[anIndexValue] = aResult;
406
407 if (this.numberOfMethodsDone() < this.methods().length) {
408 //nothing to do here other than possibly log something
409 } else if (this.numberOfMethodsDone() == this.methods().length) {
410 this.result().callback();
411 } else if (this.numberOfMethodsDone() > this.methods().length) {
412 //WTF!!! :(
413 }
414
415 },
416
417 //-----------------------------------------------------------------------------
418
419 __syntaxFix__: "syntax fix"
420});
421
422//#############################################################################
423
424MochiKit.Base.update(Clipperz.Async, {
425
426 'callbacks': function (aName, someFunctions, someArguments, aCallbackValue) {
427 var deferredResult;
428 var i, c;
429
430 deferredResult = new Clipperz.Async.Deferred(aName, someArguments);
431 c = someFunctions.length;
432 for (i=0; i<c; i++) {
433 deferredResult.addCallback(someFunctions[i]);
434 }
435 deferredResult.callback(aCallbackValue);
436
437 return deferredResult;
438 },
439
440 //-------------------------------------------------------------------------
441
442 'forkAndJoin': function (aName, someMethods, args) {
443 return MochiKit.Base.partial(function (aName, someMethods, args, aValue) {
444 var synchronizer;
445 varresult;
446
447 args = args || {};
448 synchronizer = new Clipperz.Async.DeferredSynchronizer(aName, someMethods);
449 result = synchronizer.run(args, aValue);
450
451 return result;
452 }, aName, someMethods, args);
453 },
454
455 //-------------------------------------------------------------------------
456
457 'collectResults': function(aName, someRequests, args) {
458 return MochiKit.Base.partial(function(aName, someRequests, args, aValue) {
459 var deferredResult;
460 var requestKeys;
461 var methods;
462
463 requestKeys = MochiKit.Base.keys(someRequests);
464 methods = MochiKit.Base.values(someRequests);
465
466 deferredResult = new Clipperz.Async.Deferred(aName, args);
467 deferredResult.addCallback(Clipperz.Async.forkAndJoin(aName + " [inner forkAndJoin]", methods, args));
468 deferredResult.addBoth(function(someResults) {
469 var returnFunction;
470 var results;
471 var i,c;
472 var result;
473
474 if (someResults instanceof MochiKit.Async.CancelledError) {
475 returnFunction = MochiKit.Async.fail;
476 result = someResults;
477 } else {
478 if (someResults instanceof Error) {
479 returnFunction = MochiKit.Async.fail;
480 results = someResults['message'];
481 } else {
482 returnFunction = MochiKit.Async.succeed;
483 results = someResults;
484 }
485
486 result = {};
487
488 c = requestKeys.length;
489 for (i=0; i<c; i++) {
490 result[requestKeys[i]] = results[i];
491 }
492 }
493
494 return returnFunction.call(null, result);
495 });
496 deferredResult.callback(aValue);
497
498 return deferredResult;
499 }, aName, someRequests, args);
500 },
501
502 //-------------------------------------------------------------------------
503
504 'collectAll': function (someDeferredObjects) {
505 var deferredResult;
506
507 deferredResult = new MochiKit.Async.DeferredList(someDeferredObjects, false, false, false);
508 deferredResult.addCallback(function (aResultList) {
509 return MochiKit.Base.map(function (aResult) {
510 if (aResult[0]) {
511 return aResult[1];
512 } else {
513 throw aResult[1];
514 }
515 }, aResultList);
516 });
517
518 return deferredResult;
519 },
520
521 //-------------------------------------------------------------------------
522
523 'setItem': function (anObject, aKey, aValue) {
524 anObject[aKey] = aValue;
525
526 return anObject;
527 },
528
529 'setItemOnObject': function (aKey, aValue, anObject) {
530 anObject[aKey] = aValue;
531
532 return anObject;
533 },
534
535 'setDeferredItemOnObject': function (aKey, aDeferredFunction, anObject) {
536 return Clipperz.Async.callbacks("Clipperz.Async.setDeferredItemOnObject", [
537 aDeferredFunction,
538 MochiKit.Base.partial(Clipperz.Async.setItem, anObject, aKey)
539 ], {trace:false}, anObject);
540 },
541
542 //-------------------------------------------------------------------------
543
544 'deferredIf': function (aName, aThenBlock, anElseBlock) {
545 return function (aValue) {
546 var deferredResult;
547
548 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) {
549 deferredResult = Clipperz.Async.callbacks(aName + " <then>", aThenBlock, null, aValue);
550 } else {
551 deferredResult = Clipperz.Async.callbacks(aName + " <else>", anElseBlock, null, aValue);
552 }
553
554 return deferredResult;
555 }
556 },
557
558 //-------------------------------------------------------------------------
559
560 'log': function(aMessage, aResult) {
561 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) {
562 Clipperz.log(aMessage + " ", aResult);
563 }
564
565 return aResult;
566 },
567
568 //=========================================================================
569
570 'deferredCompare': function (aComparator, aDeferred, bDeferred) {
571 var deferredResult;
572
573 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredCompare", {trace:false});
574 deferredResult.addCallback(Clipperz.Async.collectAll, [aDeferred, bDeferred]);
575 deferredResult.addCallback(function (someResults) {
576 var result;
577
578 if (aComparator(someResults[0], someResults[1]) > 0) {
579 result = MochiKit.Async.succeed();
580 } else {
581 result = MochiKit.Async.fail();
582 };
583
584 return result;
585 });
586 deferredResult.callback();
587
588 return deferredResult;
589 },
590
591 //-------------------------------------------------------------------------
592
593 'insertIntoSortedArray': function (anObject, aDeferredComparator, aSortedResult) {
594 var deferredResult;
595 var i, c;
596
597 if (aSortedResult.length == 0) {
598 deferredResult = MochiKit.Async.succeed([anObject]);
599 } else {
600 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray", {trace:false});
601 c = aSortedResult.length + 1;
602 for (i=0; i<c; i++) {
603 deferredResult.addCallback(function (aDeferredComparator, aObject, bObject, aContext) {
604 var innerDeferredResult;
605
606 innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray <inner compare>", {trace:false});
607 innerDeferredResult.addCallback(aDeferredComparator, aObject, bObject);
608 innerDeferredResult.addErrback(MochiKit.Async.fail, aContext);
609 innerDeferredResult.callback();
610
611 return innerDeferredResult;
612 }, aDeferredComparator, anObject, aSortedResult[i], i);
613 }
614 deferredResult.addMethod(aSortedResult, 'push', anObject);
615 deferredResult.addErrback(function (anError) {
616 aSortedResult.splice(anError.message, 0, anObject);
617 })
618 deferredResult.addBoth(MochiKit.Async.succeed, aSortedResult);
619 deferredResult.callback();
620 }
621
622 return deferredResult;
623 },
624
625 //-------------------------------------------------------------------------
626
627 'deferredSort': function (aDeferredComparator, someObjects) {
628 var deferredResult;
629 var i, c;
630
631 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredSort", {trace:false});
632 c = someObjects.length;
633 for (i=0; i<c; i++) {
634 deferredResult.addCallback(Clipperz.Async.insertIntoSortedArray, someObjects[i], aDeferredComparator);
635 if ((i % 50) == 0) {
636 //console.log("######### sort wait ##########");
637 deferredResult.addCallback(MochiKit.Async.wait, 0.5);
638 }
639 }
640 deferredResult.callback([]);
641
642 return deferredResult;
643 },
644
645 //=========================================================================
646
647 'deferredFilter': function (aFunction, someObjects) {
648 vardeferredResult;
649 vari, c;
650
651 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter", {trace:false});
652 c = someObjects.length;
653 for (i=0; i<c; i++) {
654 deferredResult.addCallback(function (aFunction, anObject, anIndex, aResult) {
655 var innerDeferredResult;
656
657 innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter <inner - " + anIndex + ">", {trace:false});
658 innerDeferredResult.addCallback(aFunction, anObject);
659 innerDeferredResult.addCallback(function (aFilterResult) {
660 if (aFilterResult) {
661 aResult.push(anObject);
662 };
663 });
664 innerDeferredResult.addBoth(MochiKit.Async.succeed, aResult);
665 innerDeferredResult.callback();
666
667 return innerDeferredResult;
668 }, aFunction, someObjects[i], i);
669 }
670 deferredResult.callback([]);
671
672 return deferredResult;
673 },
674
675 'forEach': function (aFunction) {
676 return MochiKit.Base.partial(function (aFunction, anIterable) {
677 MochiKit.Iter.forEach(anIterable, aFunction);
678 }, aFunction);
679 },
680
681 //=========================================================================
682
683 'or': function (someValues) {
684 return Clipperz.Async.callbacks("Clipperz.Async.or", [
685 MochiKit.Base.values,
686 MochiKit.Base.flattenArguments,
687//function (aValue) { console.log("Record.hasAnyCleanTextData - flatten", aValue); return aValue; },
688 function(someInnerValues) {
689 return MochiKit.Iter.some(someInnerValues, MochiKit.Base.operator.identity);
690 }
691 ], {trace:false}, someValues);
692 },
693
694 //=========================================================================
695
696 'clearResult': function () {},
697
698 //=========================================================================
699 __syntaxFix__: "syntax fix"
700});
701
702
703//#############################################################################
704
705CLIPPERZ_DEFERRED_LOGGING_ENABLED = true;
706CLIPPERZ_DEFERRED_TRACING_ENABLED = false;
707CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED = false;
diff --git a/frontend/gamma/js/Clipperz/Base.js b/frontend/gamma/js/Clipperz/Base.js
new file mode 100644
index 0000000..7f321ef
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Base.js
@@ -0,0 +1,531 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; }
31
32Clipperz.Base.VERSION = "0.2";
33Clipperz.Base.NAME = "Clipperz.Base";
34
35MochiKit.Base.update(Clipperz.Base, {
36
37 //-------------------------------------------------------------------------
38
39 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]";
41 },
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return this.__repr__();
47 },
48
49 //-------------------------------------------------------------------------
50
51 'itemgetter': function (aKeyPath) {
52 // return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]);
53 return MochiKit.Base.compose.apply(null,
54 MochiKit.Base.map(
55 MochiKit.Base.itemgetter,
56 MochiKit.Iter.reversed(
57 aKeyPath.split('.')
58 )
59 )
60 );
61 },
62
63 //-------------------------------------------------------------------------
64
65 'isUrl': function (aValue) {
66 return (MochiKit.Base.urlRegExp.test(aValue));
67 },
68
69 'isEmail': function (aValue) {
70 return (MochiKit.Base.emailRegExp.test(aValue));
71 },
72
73 //-------------------------------------------------------------------------
74
75 'caseInsensitiveCompare': function (a, b) {
76 return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase());
77 },
78
79 'reverseComparator': function (aComparator) {
80 return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator);
81 },
82
83 //-------------------------------------------------------------------------
84/*
85 'dependsOn': function(module, deps) {
86 if (!(module in Clipperz)) {
87 MochiKit[module] = {};
88 }
89
90 if (typeof(dojo) != 'undefined') {
91 dojo.provide('Clipperz.' + module);
92 }
93 for (var i = 0; i < deps.length; i++) {
94 if (typeof(dojo) != 'undefined') {
95 dojo.require('Clipperz.' + deps[i]);
96 }
97 if (typeof(JSAN) != 'undefined') {
98 JSAN.use('Clipperz.' + deps[i], []);
99 }
100 if (!(deps[i] in Clipperz)) {
101 throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!'
102 }
103 }
104 },
105*/
106 //-------------------------------------------------------------------------
107
108 'trim': function (aValue) {
109 return aValue.replace(/^\s+|\s+$/g, "");
110 },
111
112 //-------------------------------------------------------------------------
113
114 'stringToByteArray': function (aValue) {
115 varresult;
116 var i, c;
117
118 result = [];
119
120 c = aValue.length;
121 for (i=0; i<c; i++) {
122 result[i] = aValue.charCodeAt(i);
123 }
124
125 return result;
126 },
127
128 //.........................................................................
129
130 'byteArrayToString': function (anArrayOfBytes) {
131 varresult;
132 var i, c;
133
134 result = "";
135
136 c = anArrayOfBytes.length;
137 for (i=0; i<c; i++) {
138 result += String.fromCharCode(anArrayOfBytes[i]);
139 }
140
141 return result;
142 },
143
144 //-------------------------------------------------------------------------
145
146 'getValueForKeyInFormContent': function (aFormContent, aKey) {
147 return aFormContent[1][MochiKit.Base.find(aFormContent[0], aKey)];
148 },
149
150 //-------------------------------------------------------------------------
151
152 'indexOfObjectInArray': function(anObject, anArray) {
153 varresult;
154 vari, c;
155
156 result = -1;
157
158 c = anArray.length;
159 for (i=0; ((i<c) && (result < 0)); i++) {
160 if (anArray[i] === anObject) {
161 result = i;
162 }
163 }
164
165 return result;
166 },
167
168 //-------------------------------------------------------------------------
169
170 'removeObjectAtIndexFromArray': function(anIndex, anArray) {
171 anArray.splice(anIndex, 1);
172 },
173
174 //-------------------------------------------------------------------------
175
176 'removeObjectFromArray': function(anObject, anArray) {
177 varobjectIndex;
178
179 objectIndex = Clipperz.Base.indexOfObjectInArray(anObject, anArray);
180 if (objectIndex > -1) {
181 Clipperz.Base.removeObjectAtIndexFromArray(objectIndex, anArray);
182 } else {
183 Clipperz.log("Trying to remove an object not present in the array");
184 throw Clipperz.Base.exception.ObjectNotFound;
185 }
186 },
187
188 'removeFromArray': function(anArray, anObject) {
189 return Clipperz.Base.removeObjectFromArray(anObject, anArray);
190 },
191
192 //-------------------------------------------------------------------------
193
194 'splitStringAtFixedTokenSize': function(aString, aTokenSize) {
195 var result;
196 varstringToProcess;
197
198 stringToProcess = aString;
199 result = [];
200 if (stringToProcess != null) {
201 while (stringToProcess.length > aTokenSize) {
202 result.push(stringToProcess.substring(0, aTokenSize));
203 stringToProcess = stringToProcess.substring(aTokenSize);
204 }
205
206 result.push(stringToProcess);
207 }
208
209 return result;
210 },
211
212 //-------------------------------------------------------------------------
213
214 'objectType': function(anObject) {
215 var result;
216
217 if (anObject == null) {
218 result = null;
219 } else {
220 result = typeof(anObject);
221
222 if (result == "object") {
223 if (anObject instanceof Array) {
224 result = 'array'
225 } else if (anObject.constructor == Boolean) {
226 result = 'boolean'
227 } else if (anObject instanceof Date) {
228 result = 'date'
229 } else if (anObject instanceof Error) {
230 result = 'error'
231 } else if (anObject instanceof Function) {
232 result = 'function'
233 } else if (anObject.constructor == Number) {
234 result = 'number'
235 } else if (anObject.constructor == String) {
236 result = 'string'
237 } else if (anObject instanceof Object) {
238 result = 'object'
239 } else {
240 throw Clipperz.Base.exception.UnknownType;
241 }
242 }
243 }
244
245 return result;
246 },
247
248 //-------------------------------------------------------------------------
249
250 'escapeHTML': function(aValue) {
251 var result;
252
253 result = aValue;
254 result = result.replace(/</g, "&lt;");
255 result = result.replace(/>/g, "&gt;");
256
257 return result;
258 },
259
260 //-------------------------------------------------------------------------
261
262 'deepClone': function(anObject) {
263 var result;
264
265 result = Clipperz.Base.evalJSON(Clipperz.Base.serializeJSON(anObject));
266
267 return result;
268 },
269
270 //-------------------------------------------------------------------------
271
272 //'deepCompare': function (aObject, bObject) {
273 // return (Clipperz.Base.serializeJSON(aObject) == Clipperz.Base.serializeJSON(bObject));
274 //},
275
276 //-------------------------------------------------------------------------
277
278 'evalJSON': function(aString) {
279 return JSON.parse(aString);
280 },
281
282 'serializeJSON': function(anObject) {
283 return JSON.stringify(anObject);
284 },
285
286 'formatJSON': function (anObject, sIndent) {
287 var realTypeOf = function (v) {
288 if (typeof(v) == "object") {
289 if (v === null) return "null";
290 if (v.constructor == (new Array).constructor) return "array";
291 if (v.constructor == (new Date).constructor) return "date";
292 if (v.constructor == (new RegExp).constructor) return "regex";
293 return "object";
294 }
295 return typeof(v);
296 };
297
298 //function FormatJSON(oData, sIndent) {
299 if (arguments.length < 2) {
300 var sIndent = "";
301 }
302 // var sIndentStyle = " ";
303 var sIndentStyle = " ";
304 var sDataType = realTypeOf(anObject);
305
306 // open object
307 if (sDataType == "array") {
308 if (anObject.length == 0) {
309 return "[]";
310 }
311 var sHTML = "[";
312 } else if (sDataType == "object") {
313 var sHTML = "{";
314 } else {
315 return "{}";
316 }
317 // } else {
318 // var iCount = 0;
319 // $.each(anObject, function() {
320 // iCount++;
321 // return;
322 // });
323 // if (iCount == 0) { // object is empty
324 // return "{}";
325 // }
326 // var sHTML = "{";
327 // }
328
329 // loop through items
330 var iCount = 0;
331 // $.each(anObject, function(sKey, vValue) {
332 MochiKit.Iter.forEach(MochiKit.Base.keys(anObject), function(sKey) {
333 var vValue = anObject[sKey];
334
335 if (iCount > 0) {
336 sHTML += ",";
337 }
338 if (sDataType == "array") {
339 sHTML += ("\n" + sIndent + sIndentStyle);
340 } else {
341 sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": ");
342 }
343
344 // display relevant data type
345 switch (realTypeOf(vValue)) {
346 case "array":
347 case "object":
348 sHTML += Clipperz.Base.formatJSON(vValue, (sIndent + sIndentStyle));
349 break;
350 case "boolean":
351 case "number":
352 sHTML += vValue.toString();
353 break;
354 case "null":
355 sHTML += "null";
356 break;
357 case "string":
358 sHTML += ("\"" + vValue + "\"");
359 break;
360 default:
361 sHTML += ("TYPEOF: " + typeof(vValue));
362 }
363
364 // loop
365 iCount++;
366 });
367
368 // close object
369 if (sDataType == "array") {
370 sHTML += ("\n" + sIndent + "]");
371 } else {
372 sHTML += ("\n" + sIndent + "}");
373 }
374
375 // return
376 return sHTML;
377 },
378
379 //-------------------------------------------------------------------------
380
381 'mergeItems': function (anArrayOfValues) {
382 var result;
383 var i, c;
384
385 result = {};
386
387 c = anArrayOfValues.length;
388 for (i=0; i<c; i++) {
389 result[anArrayOfValues[i][0]] = anArrayOfValues[i][1];
390 }
391
392 return result;
393 },
394
395 //-------------------------------------------------------------------------
396
397 'map': function (fn, lstObj/*, lst... */) {
398 var result;
399
400 if (MochiKit.Base.isArrayLike(lstObj)) {
401 result = MochiKit.Base.map.apply(this, arguments);
402 } else {
403 varkeys;
404 var values;
405 var computedValues;
406
407 keys = MochiKit.Base.keys(lstObj);
408 values = MochiKit.Base.values(lstObj);
409 computedValues = MochiKit.Base.map(fn, values);
410
411 result = Clipperz.Base.mergeItems(MochiKit.Base.zip(keys, computedValues));
412 }
413
414 return result;
415 },
416
417 //-------------------------------------------------------------------------
418
419 'sanitizeString': function(aValue) {
420 var result;
421
422 if (Clipperz.Base.objectType(aValue) == 'string') {
423 result = aValue;
424 result = result.replace(/</img,"&lt;");
425 result = result.replace(/>/img,"&gt;");
426 } else {
427 result = aValue;
428 }
429
430 return result;
431 },
432
433 //-------------------------------------------------------------------------
434
435 'module': function(aValue) {
436 // aValue = 'Clipperz.PM.Compact'
437//
438 // if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
439 // if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
440 // if (typeof(Clipperz.PM.UI.Common.Components) == 'undefined') { Clipperz.PM.UI.Common.Components = {}; }
441
442//console.log(">>> module: " + aValue);
443 var currentScope;
444 var pathElements;
445 var i,c;
446
447 currentScope = window;
448 pathElements = aValue.split('.');
449 c = pathElements.length;
450 for (i=0; i<c; i++) {
451//console.log("--- current path element: " + pathElements[i]);
452//console.log("--- current scope", currentScope);
453 if (typeof(currentScope[pathElements[i]]) == 'undefined') {
454 currentScope[pathElements[i]] = {};
455 }
456
457 currentScope = currentScope[pathElements[i]];
458 }
459 },
460
461 //-------------------------------------------------------------------------
462
463 'exception': {
464 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
465 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType"),
466 'VulnerabilityIssue':new MochiKit.Base.NamedError("Clipperz.Base.exception.VulnerabilityIssue"),
467 'MandatoryParameter':new MochiKit.Base.NamedError("Clipperz.Base.exception.MandatoryParameter"),
468 'ObjectNotFound': new MochiKit.Base.NamedError("Clipperz.Base.exception.ObjectNotFound"),
469 'raise': function (aName) {
470 throw Clipperz.Base.exception[aName];
471 }
472 },
473
474 //-------------------------------------------------------------------------
475
476 'extend': YAHOO.extendX,
477
478 //-------------------------------------------------------------------------
479 __syntaxFix__: "syntax fix"
480
481});
482
483 //Original regExp courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
484 //Updated to match Clipperz usage pattern.
485//MochiKit.Base.urlRegExp = new RegExp(/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/);
486MochiKit.Base.urlRegExp = new RegExp(/^((([\w-]+:\/\/?)|(www\.))[^\s()<>]+((?:\([\w\d]+\)|([^[:punct:]\s]|\/)))?)/);
487
488 //RegExp found here: http://www.tipsntracks.com/117/validate-an-email-address-using-regular-expressions.html
489MochiKit.Base.emailRegExp = new RegExp(/^([a-zA-Z0-9_\-\.]+)@(([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3}))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d))$/);
490
491
492MochiKit.Base.registerComparator('Object dummy comparator',
493 function(a, b) {
494 return ((a.constructor == Object) && (b.constructor == Object));
495 },
496 function(a, b) {
497 var result;
498 var aKeys;
499 var bKeys;
500
501//MochiKit.Logging.logDebug(">>> comparator");
502//MochiKit.Logging.logDebug("- a: " + Clipperz.Base.serializeJSON(a));
503//MochiKit.Logging.logDebug("- b: " + Clipperz.Base.serializeJSON(a));
504 aKeys = MochiKit.Base.keys(a).sort();
505 bKeys = MochiKit.Base.keys(b).sort();
506
507 result = MochiKit.Base.compare(aKeys, bKeys);
508//if (result != 0) {
509 //MochiKit.Logging.logDebug("- comparator 'keys':");
510 //MochiKit.Logging.logDebug("- comparator aKeys: " + Clipperz.Base.serializeJSON(aKeys));
511 //MochiKit.Logging.logDebug("- comparator bKeys: " + Clipperz.Base.serializeJSON(bKeys));
512//}
513 if (result == 0) {
514 vari, c;
515
516 c = aKeys.length;
517 for (i=0; (i<c) && (result == 0); i++) {
518 result = MochiKit.Base.compare(a[aKeys[i]], b[bKeys[i]]);
519//if (result != 0) {
520 //MochiKit.Logging.logDebug("- comparator 'values':");
521 //MochiKit.Logging.logDebug("- comparator a[aKeys[i]]: " + Clipperz.Base.serializeJSON(a[aKeys[i]]));
522 //MochiKit.Logging.logDebug("- comparator b[bKeys[i]]: " + Clipperz.Base.serializeJSON(b[bKeys[i]]));
523//}
524 }
525 }
526
527//MochiKit.Logging.logDebug("<<< comparator - result: " + result);
528 return result;
529 },
530 true
531);
diff --git a/frontend/gamma/js/Clipperz/ByteArray.js b/frontend/gamma/js/Clipperz/ByteArray.js
new file mode 100644
index 0000000..86136c8
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/ByteArray.js
@@ -0,0 +1,1501 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30
31//=============================================================================
32
33Clipperz.ByteArray_abstract = function(args) {
34 return this;
35}
36
37Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, {
38
39 //-------------------------------------------------------------------------
40
41 'toString': function() {
42 return "Clipperz.ByteArray_abstract";
43 },
44
45 //-------------------------------------------------------------------------
46
47 'equals': function(aValue) {
48 return (this.compare(aValue) == 0);
49 },
50
51 //-------------------------------------------------------------------------
52
53 'compare': function(aValue) {
54 var result;
55 var i;
56
57 result = MochiKit.Base.compare(this.length(), aValue.length());
58 i = this.length();
59
60 while ((result == 0) && (i>0)) {
61 i--;
62 result = MochiKit.Base.compare(this.byteAtIndex(i), aValue.byteAtIndex(i));
63 }
64
65 return result;
66 },
67
68 //-------------------------------------------------------------------------
69
70 'clone': function() {
71 throw Clipperz.Base.exception.AbstractMethod;
72 },
73
74 //-------------------------------------------------------------------------
75
76 'newInstance': function() {
77 throw Clipperz.Base.exception.AbstractMethod;
78 },
79
80 //-------------------------------------------------------------------------
81
82 'reset': function() {
83 throw Clipperz.Base.exception.AbstractMethod;
84 },
85
86 //-------------------------------------------------------------------------
87
88 'length': function() {
89 throw Clipperz.Base.exception.AbstractMethod;
90 },
91
92 //-------------------------------------------------------------------------
93
94 'checkByteValue': function(aValue) {
95//Clipperz.log("aValue", aValue.toString(16));
96//Clipperz.log("(aValue & 0xff)", (aValue & 0xff).toString(16));
97
98 if ((aValue & 0xff) != aValue) {
99 MochiKit.Logging.logError("Clipperz.ByteArray.appendByte: the provided value (0x" + aValue.toString(16) + ") is not a byte value.");
100 throw Clipperz.ByteArray.exception.InvalidValue;
101 }
102 },
103
104 //-------------------------------------------------------------------------
105
106 'xorMergeWithBlock': function(aBlock, anAllignment, paddingMode) {
107 var result;
108 var a, b;
109 var aLength;
110 var bLength;
111 var i, c;
112
113 if (this.length() > aBlock.length()) {
114 a = this;
115 b = aBlock;
116 } else {
117 a = aBlock;
118 b = this;
119 }
120
121 aLength = a.length();
122 bLength = b.length();
123
124 if (aLength != bLength) {
125 if (paddingMode == 'truncate') {
126 if (anAllignment == 'left') {
127 a = a.split(0, bLength);
128 } else {
129 a = a.split(aLength - bLength);
130 }
131 } else {
132 var ii, cc;
133 var padding;
134
135 // padding = new Clipperz.ByteArray();
136 padding = this.newInstance();
137 cc = aLength - bLength;
138 for (ii=0; ii<cc; ii++) {
139 padding.appendByte(0);
140 }
141
142 if (anAllignment == 'left') {
143 b = b.appendBlock(padding);
144 } else {
145 b = padding.appendBlock(b);
146 }
147 }
148 }
149
150
151 // result = new Clipperz.ByteArray();
152 result = this.newInstance();
153 c = a.length();
154 for (i=0; i<c; i++) {
155 result.appendByte(a.byteAtIndex(i) ^ b.byteAtIndex(i));
156 }
157
158 return result;
159 },
160
161 //-------------------------------------------------------------------------
162/*
163 'shiftLeft': function(aNumberOfBitsToShift) {
164 var result;
165
166 result = this.clone(); //???????????
167
168 return result;
169 },
170 */
171 //-------------------------------------------------------------------------
172
173 'appendBlock': function(aBlock) {
174 throw Clipperz.Base.exception.AbstractMethod;
175 },
176
177 //-------------------------------------------------------------------------
178
179 'appendByte': function(aValue) {
180 throw Clipperz.Base.exception.AbstractMethod;
181 },
182
183 'appendBytes': function(args) {
184 varvalues;
185 vari,c;
186
187 if (args.constructor == Array) {
188 values = args;
189 } else {
190 values = arguments;
191 }
192
193 c = values.length;
194 for (i=0; i<c; i++) {
195 this.appendByte(values[i]);
196 }
197
198 return this;
199 },
200
201 //-------------------------------------------------------------------------
202
203 'appendWord': function(aValue, isLittleEndian) {
204 var result;
205 var processAsLittleEndian;
206
207 processAsLittleEndian = isLittleEndian === true ? true : false;
208
209 if (processAsLittleEndian) {
210 result = this.appendBytes( (aValue) & 0xff, (aValue >> 8) & 0xff, (aValue >> 16) & 0xff, (aValue >> 24) & 0xff ); //little endian
211 } else {
212 result = this.appendBytes( (aValue >> 24) & 0xff, (aValue >> 16) & 0xff, (aValue >> 8) & 0xff, (aValue) & 0xff ); //big endian - DEFAULT
213 }
214
215 return result;
216 },
217
218 'appendWords': function(args) {
219 varvalues;
220 vari,c;
221
222 if (args.constructor == Array) {
223 values = args;
224 } else {
225 values = arguments;
226 }
227
228 c = values.length;
229 for (i=0; i<c; i++) {
230 this.appendWord(values[i], false);
231 }
232
233 return this;
234 },
235
236 //-------------------------------------------------------------------------
237
238 'appendBigEndianWords': function(args) {
239 varvalues;
240 vari,c;
241
242 if (args.constructor == Array) {
243 values = args;
244 } else {
245 values = arguments;
246 }
247
248 c = values.length;
249 for (i=0; i<c; i++) {
250 this.appendWord(values[i], true);
251 }
252
253 return this;
254 },
255
256 //-------------------------------------------------------------------------
257
258 'appendBinaryString': function (aBinaryString) {
259 var i,c;
260
261 c = aBinaryString.length;
262 for (i=0; i<c; i++) {
263 this.appendByte(aBinaryString.charCodeAt(i));
264 };
265
266 return this;
267 },
268
269 //-------------------------------------------------------------------------
270
271 'byteAtIndex': function(anIndex) {
272 throw Clipperz.Base.exception.AbstractMethod;
273 },
274
275 'setByteAtIndex': function(aValue, anIndex) {
276 throw Clipperz.Base.exception.AbstractMethod;
277 },
278
279 //-------------------------------------------------------------------------
280
281 'bitAtIndex': function(aBitPosition) {
282 var result;
283 varbytePosition;
284 var bitPositionInSelectedByte;
285 var selectedByte;
286 var selectedByteMask;
287
288 bytePosition = this.length() - Math.ceil((aBitPosition + 1)/ 8);
289 bitPositionInSelectedByte = aBitPosition % 8;
290 selectedByte = this.byteAtIndex(bytePosition);
291
292 if (bitPositionInSelectedByte > 0) {
293 selectedByteMask = (1 << bitPositionInSelectedByte);
294 } else {
295 selectedByteMask = 1;
296 }
297 result = selectedByte & selectedByteMask ? 1 : 0;
298//console.log("aBitPosition: " + aBitPosition + ", length: " + this.length() + ", bytePosition: " + bytePosition + ", bitPositionInSelectedByte: " + bitPositionInSelectedByte + ", selectedByteMask: " + selectedByteMask);
299
300 return result;
301 },
302
303 //-------------------------------------------------------------------------
304
305 'bitBlockAtIndexWithSize': function(aBitPosition, aSize) {
306 var result;
307 var bitValue;
308 var i,c;
309
310 result = 0;
311 c = aSize;
312 for (i=0; i<c; i++) {
313 bitValue = this.bitAtIndex(aBitPosition + i);
314 result = result | bitValue << i;
315 }
316
317 return result;
318 },
319
320 //-------------------------------------------------------------------------
321
322 'asString': function() {
323 varresult;
324 varlength;
325 vari;
326
327//var startTime = new Date();
328
329 //# result = "";
330 result = [];
331
332 i = 0;
333 length = this.length();
334
335 while (i < length) {
336 varcurrentCharacter;
337 varcurrentByte;
338 varunicode;
339
340 currentByte = this.byteAtIndex(i);
341
342 if ((currentByte & 0x80) == 0x00 ) { //0xxxxxxx
343 unicode = currentByte;
344 currentCharacter = String.fromCharCode(unicode);
345 } else if ((currentByte & 0xe0) == 0xc0 ) { //110xxxxx 10xxxxxx
346 unicode = (currentByte & 0x1f) << 6;
347 i++; currentByte = this.byteAtIndex(i);
348 unicode = unicode | (currentByte & 0x3f);
349
350 currentCharacter = String.fromCharCode(unicode);
351 } else if ((currentByte & 0xf0) == 0xe0 ) { //1110xxxx 10xxxxxx 10xxxxxx
352 unicode = (currentByte & 0x0f) << (6+6);
353 i++; currentByte = this.byteAtIndex(i);
354 unicode = unicode | ((currentByte & 0x3f) << 6);
355 i++; currentByte = this.byteAtIndex(i);
356 unicode = unicode | (currentByte & 0x3f);
357
358 currentCharacter = String.fromCharCode(unicode);
359 } else { //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
360 unicode = (currentByte & 0x07) << (6+6+6);
361 i++; currentByte = this.byteAtIndex(i);
362 unicode = unicode | ((currentByte & 0x3f) << (6+6));
363 i++; currentByte = this.byteAtIndex(i);
364 unicode = unicode | ((currentByte & 0x3f) << 6);
365 i++; currentByte = this.byteAtIndex(i);
366 unicode = unicode | (currentByte & 0x3f);
367
368 currentCharacter = String.fromCharCode(unicode);
369 }
370
371 // result += currentCharacter;
372 result.push(currentCharacter);
373 i++;
374 }
375
376//MochiKit.Logging.logDebug("[" + (new Date() - startTime) + "] ByteArray.asString");
377
378 // return result;
379 return result.join("");
380 },
381
382 //-------------------------------------------------------------------------
383
384 'toHexString': function() {
385 throw Clipperz.Base.exception.AbstractMethod;
386 },
387
388 //-------------------------------------------------------------------------
389
390 'base64map': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
391 'base64mapIndex': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''),
392 //'base64mapInvertedIndex': {
393 // 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,
394 // 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19,
395 // 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29,
396 // 'e': 30, 'f': 31, 'g': 32, 'h': 33, 'i': 34, 'j': 35, 'k': 36, 'l': 37, 'm': 38, 'n': 39,
397 // 'o': 40, 'p': 41, 'q': 42, 'r': 43, 's': 44, 't': 45, 'u': 46, 'v': 47, 'w': 48, 'x': 49,
398 // 'y': 50, 'z': 51, '0': 52, '1': 53, '2': 54, '3': 55, '4': 56, '5': 57, '6': 58, '7': 59,
399 // '8': 60, '9': 61, '+': 62, '/': 63,
400 // "=": -1},
401
402 //-------------------------------------------------------------------------
403
404 'appendBase64String': function(aValue) {
405 var i;
406 var length;
407
408 length = aValue.length;
409
410 if ((length % 4) != 0) {
411 MochiKit.Logging.logError("the value passed to the 'ByteArray.setBase64Value' is not correct");
412 throw Clipperz.ByteArray.exception.InvalidValue;
413 }
414
415 i = 0;
416 while (i<length) {
417 var value1, value2, value3, value4;
418 var byte1, byte2, byte3;
419
420 value1 = this.base64map.indexOf(aValue.charAt(i));
421 value2 = this.base64map.indexOf(aValue.charAt(i+1));
422 value3 = this.base64map.indexOf(aValue.charAt(i+2));
423 value4 = this.base64map.indexOf(aValue.charAt(i+3));
424
425 // value1 = this.base64mapInvertedIndex[aValue.charAt(i)];
426 // value2 = this.base64mapInvertedIndex[aValue.charAt(i+1)];
427 // value3 = this.base64mapInvertedIndex[aValue.charAt(i+2)];
428 // value4 = this.base64mapInvertedIndex[aValue.charAt(i+3)];
429
430 byte1 = (value1 << 2) | ((value2 & 0x30) >> 4);
431 if (value3 != -1) {
432 byte2 = ((value2 & 0x0f) << 4) | ((value3 & 0x3c) >> 2);
433
434 if (value4 != -1) {
435 byte3 = ((value3 & 0x03) << 6) | (value4);
436 } else {
437 byte3 = null;
438 }
439 } else {
440 byte2 = null;
441 byte3 = null;
442 }
443
444 this.appendByte(byte1);
445 this.appendByte(byte2);
446 this.appendByte(byte3);
447
448 i += 4;
449 }
450
451 return this;
452 },
453
454 //-------------------------------------------------------------------------
455
456 'toBase64String': function() {
457 var result;
458 var length;
459 var i;
460 var byte1, byte2, byte3;
461 var char1, char2, char3, char4;
462
463 i = 0;
464 length = this.length();
465 result = new Array(Math.ceil(length/3));
466
467 while (i < length) {
468 byte1 = this.byteAtIndex(i);
469 if ((i+2) < length) {
470 byte2 = this.byteAtIndex(i+1);
471 byte3 = this.byteAtIndex(i+2);
472 } else if ((i+2) == length) {
473 byte2 = this.byteAtIndex(i+1);
474 byte3 = null;
475 } else {
476 byte2 = null;
477 byte3 = null;
478 }
479
480 char1 = this.base64mapIndex[byte1 >> 2];
481 if (byte2 != null) {
482 char2 = this.base64mapIndex[((byte1 & 0x03) << 4) | ((byte2 & 0xf0) >> 4)];
483 if (byte3 != null) {
484 char3 = this.base64mapIndex[((byte2 & 0x0f) << 2) | ((byte3 & 0xc0) >> 6)];
485 char4 = this.base64mapIndex[(byte3 & 0x3f)];
486 } else {
487 char3 = this.base64mapIndex[(byte2 & 0x0f) << 2];
488 char4 = "=";
489 }
490 } else {
491 char2 = this.base64mapIndex[(byte1 & 0x03) << 4];
492 char3 = "=";
493 char4 = "=";
494 }
495
496 result.push(char1 + char2 + char3 + char4);
497
498 i += 3;
499 }
500
501 return result.join("");
502 },
503
504 //-------------------------------------------------------------------------
505
506 'base32map': "0123456789abcdefghjkmnpqrstvwxyz",
507 'base32mapIndex': "0123456789abcdefghjkmnpqrstvwxyz".split(''),
508
509 //-------------------------------------------------------------------------
510
511 'appendBase32String': function(aValue) {
512 var value;
513 var i;
514 var length;
515 var value1, value2, value3, value4, value5, value6, value7, value8;
516 var byte1, byte2, byte3, byte4, byte5;
517
518 value = aValue.toLowerCase();
519 value = value.replace(/[\s\-]/g, '');
520 value = value.replace(/[0o]/g, '0');
521 value = value.replace(/[1il]/g, '1');
522
523 length = value.length;
524
525 if ((length % 8) != 0) {
526 MochiKit.Logging.logError("the value passed to the 'ByteArray.setBase32Value' is not correct");
527 throw Clipperz.ByteArray.exception.InvalidValue;
528 }
529
530 i = 0;
531 while (i<length) {
532 value1 = this.base32map.indexOf(value.charAt(i));
533 value2 = this.base32map.indexOf(value.charAt(i+1));
534 value3 = this.base32map.indexOf(value.charAt(i+2));
535 value4 = this.base32map.indexOf(value.charAt(i+3));
536 value5 = this.base32map.indexOf(value.charAt(i+4));
537 value6 = this.base32map.indexOf(value.charAt(i+5));
538 value7 = this.base32map.indexOf(value.charAt(i+6));
539 value8 = this.base32map.indexOf(value.charAt(i+7));
540
541 byte1 = byte2 = byte3 = byte4 = byte5 = null;
542
543 byte1 = (value1 << 3) | ((value2 & 0x1c) >> 2);
544 if (value3 != -1) {
545 byte2 = ((value2 & 0x03) << 6) | (value3 << 1) | ((value4 & 0x10) >> 4);
546 if (value5 != -1) {
547 byte3 = ((value4 & 0x0f) << 4) | ((value5 & 0x1e) >> 1);
548 if (value6 != -1) {
549 byte4 = ((value5 & 0x01) << 7) | (value6 << 2) | ((value7 & 0x18) >> 3);
550 if (value8 != -1) {
551 byte5 = ((value7 & 0x07) << 5) | (value8);
552 }
553 }
554 }
555 }
556
557 this.appendByte(byte1);
558 this.appendByte(byte2);
559 this.appendByte(byte3);
560 this.appendByte(byte4);
561 this.appendByte(byte5);
562
563 i += 8;
564 }
565
566 return this;
567 },
568
569 //-------------------------------------------------------------------------
570
571 'toBase32String': function() {
572 var result;
573 var length;
574 var i;
575 var byte1, byte2, byte3, byte4, byte5;
576 var char1, char2, char3, char4, char5, char6, char7, char8;
577
578 i = 0;
579 length = this.length();
580 result = new Array(Math.ceil(length/5));
581
582 while (i < length) {
583 byte1 = this.byteAtIndex(i);
584
585 if ((i+4) < length) {
586 byte2 = this.byteAtIndex(i+1);
587 byte3 = this.byteAtIndex(i+2);
588 byte4 = this.byteAtIndex(i+3);
589 byte5 = this.byteAtIndex(i+4);
590 } else if ((i+4) == length) {
591 byte2 = this.byteAtIndex(i+1);
592 byte3 = this.byteAtIndex(i+2);
593 byte4 = this.byteAtIndex(i+3);
594 byte5 = null;
595 } else if ((i+3) == length) {
596 byte2 = this.byteAtIndex(i+1);
597 byte3 = this.byteAtIndex(i+2);
598 byte4 = null;
599 byte5 = null;
600 } else if ((i+2) == length) {
601 byte2 = this.byteAtIndex(i+1);
602 byte3 = null;
603 byte4 = null;
604 byte5 = null;
605 } else {
606 byte2 = null;
607 byte3 = null;
608 byte4 = null;
609 byte5 = null;
610 }
611
612
613 char1 = this.base32mapIndex[byte1 >> 3];
614 char2 = char3 = char4 = char5 = char6 = char7 = char8 = "=";
615
616 if (byte2 != null) {
617 char2 = this.base32mapIndex[((byte1 & 0x07) << 2) | ((byte2 & 0xc0) >> 6)];
618 char3 = this.base32mapIndex[((byte2 & 0x3e) >> 1)];
619 if (byte3 != null) {
620 char4 = this.base32mapIndex[((byte2 & 0x01) << 4) | ((byte3 & 0xf0) >> 4)];
621 if (byte4 != null) {
622 char5 = this.base32mapIndex[((byte3 & 0x0f) << 1) | ((byte4 & 0x80) >> 7)];
623 char6 = this.base32mapIndex[(byte4 & 0x7c) >> 2];
624 if (byte5 != null) {
625 char7 = this.base32mapIndex[((byte4 & 0x03) << 3) | ((byte5 & 0xe0) >> 5)];
626 char8 = this.base32mapIndex[(byte5 & 0x1f)];
627 } else {
628 char7 = this.base32mapIndex[(byte4 & 0x03) << 3];
629 }
630 } else {
631 char5 = this.base32mapIndex[(byte3 & 0x0f) << 1];
632 }
633
634 } else {
635 char4 = this.base32mapIndex[(byte2 & 0x01) << 4];
636 }
637 } else {
638 char2 = this.base32mapIndex[(byte1 & 0x07) << 2];
639 }
640
641 result.push(char1 + char2 + char3 + char4 + char5 + char6 + char7 + char8);
642 i += 5;
643 }
644
645 return result.join("");
646 },
647
648 //-------------------------------------------------------------------------
649
650 'toBinaryString': function () {
651 vari, c;
652 var result;
653
654 result = '';
655
656 c = this.length();
657 for (i=0; i<c; i++) {
658 result += String.fromCharCode(this.byteAtIndex(i));
659 }
660
661 return result;
662 },
663
664
665 //-------------------------------------------------------------------------
666
667 'split': function(aStartingIndex, anEndingIndex) {
668 throw Clipperz.Base.exception.AbstractMethod;
669 },
670
671 //-------------------------------------------------------------------------
672
673 'increment': function() {
674 var i;
675 var done;
676
677 done = false;
678 i = this.length() - 1;
679
680 while ((i>=0) && (done == false)) {
681 var currentByteValue;
682
683 currentByteValue = this.byteAtIndex(i);
684
685 if (currentByteValue == 0xff) {
686 this.setByteAtIndex(0, i);
687 if (i>= 0) {
688 i --;
689 } else {
690 done = true;
691 }
692 } else {
693 this.setByteAtIndex(currentByteValue + 1, i);
694 done = true;
695 }
696 }
697 },
698
699 //-------------------------------------------------------------------------
700
701 'arrayValues': function() {
702 throw Clipperz.Base.exception.AbstractMethod;
703 },
704
705 //-------------------------------------------------------------------------
706 __syntaxFix__: "syntax fix"
707
708});
709
710//=============================================================================
711//
712 //Clipperz.ByteArray_hex
713//
714//=============================================================================
715/*
716Clipperz.ByteArray_hex = function (args) {
717 this._value = "";
718
719 if (typeof(args) != 'undefined') {
720 if (args.constructor == Array) {
721 this.appendBytes(args);
722 } else if (args.constructor == String) {
723 if (args.indexOf("0x") == 0) {
724 varvalue;
725
726 value = args.substring(2).toLowerCase();
727 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activate
728 if ((value.length % 2) == 0) {
729 this._value = value;
730 } else {
731 this._value = "0" + value;
732 }
733 } else {
734MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string.");
735 throw Clipperz.ByteArray.exception.InvalidValue;
736 }
737 } else {
738 varvalue;
739 vari,c;
740
741 c = args.length;
742 value = new Array(c);
743 for (i=0; i<c; i++) {
744 value.push(Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i)));
745 }
746
747 this._value = value.join("");
748 }
749 } else {
750 this.appendBytes(MochiKit.Base.extend(null, arguments));
751 }
752 }
753 return this;
754}
755
756Clipperz.ByteArray_hex.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
757
758 //-------------------------------------------------------------------------
759
760 'toString': function() {
761 return "Clipperz.ByteArray_hex";
762 },
763
764 //-------------------------------------------------------------------------
765
766 'clone': function() {
767 var result;
768
769 result = this.newInstance();
770 result._value = this._value;
771
772 return result;
773 },
774
775 //-------------------------------------------------------------------------
776
777 'newInstance': function() {
778 return new Clipperz.ByteArray_hex();
779 },
780
781 //-------------------------------------------------------------------------
782
783 'reset': function() {
784 this._value = "";
785 },
786
787 //-------------------------------------------------------------------------
788
789 'length': function() {
790 return (this._value.length / 2);
791 },
792
793 //-------------------------------------------------------------------------
794
795 'appendBlock': function(aBlock) {
796 this._value = this._value += aBlock.toHexString().substring(2);
797
798 return this;
799 },
800
801 //-------------------------------------------------------------------------
802
803 'appendByte': function(aValue) {
804 if (aValue != null) {
805 this.checkByteValue(aValue);
806 this._value += Clipperz.ByteArray.byteToHex(aValue);
807 }
808
809 return this;
810 },
811
812 //-------------------------------------------------------------------------
813
814 'byteAtIndex': function(anIndex) {
815 return parseInt(this._value.substr(anIndex*2, 2), 16);
816 },
817
818 'setByteAtIndex': function(aValue, anIndex) {
819 varmissingBytes;
820
821 this.checkByteValue(aValue);
822
823 missingBytes = anIndex - this.length();
824
825 if (missingBytes < 0) {
826 varcurrentValue;
827 varfirstCutIndex;
828 var secondCutIndex;
829
830 firstCutIndex = anIndex * 2;
831 secondCutIndex = firstCutIndex + 2;
832 currentValue = this._value;
833 this._value =currentValue.substring(0, firstCutIndex) +
834 Clipperz.ByteArray.byteToHex(aValue) +
835 currentValue.substring(secondCutIndex);
836 } else if (missingBytes == 0) {
837 this.appendByte(aValue);
838 } else {
839 var i,c;
840
841 c = missingBytes;
842 for (i=0; i<c; i++) {
843 this.appendByte(0);
844 }
845
846 this.appendByte(aValue);
847 }
848 },
849
850 //-------------------------------------------------------------------------
851
852 'toHexString': function() {
853 return "0x" + this._value;
854 },
855
856 //-------------------------------------------------------------------------
857
858 'split': function(aStartingIndex, anEndingIndex) {
859 var result;
860 varstartingIndex;
861 var endingIndex;
862
863 result = this.newInstance();
864
865 startingIndex = aStartingIndex * 2;
866 if (typeof(anEndingIndex) != 'undefined') {
867 endingIndex = anEndingIndex * 2;
868 result._value = this._value.substring(startingIndex, endingIndex);
869 } else {
870 result._value = this._value.substring(startingIndex);
871 }
872
873 return result;
874 },
875
876 //-------------------------------------------------------------------------
877
878 'arrayValues': function() {
879 var result;
880 var i,c;
881
882 c = this.length();
883
884 result = new Array(c);
885 for (i=0; i<c; i++) {
886 result[i] = this.byteAtIndex(i);
887 }
888
889 return result;
890 },
891
892 //-------------------------------------------------------------------------
893 __syntaxFix__: "syntax fix"
894});
895*/
896
897//=============================================================================
898//
899 //Clipperz.ByteArray_array
900//
901//=============================================================================
902
903Clipperz.ByteArray_array = function (args) {
904 if (typeof(args) != 'undefined') {
905 if (args.constructor == Array) {
906 this._value = args.slice(0);
907 } else if (args.constructor == String) {
908 var result;
909 varvalue;
910 var i, c;
911
912 if (args.indexOf("0x") == 0) {
913
914 value = args.substring(2).toLowerCase();
915 if (/[0123456789abcdef]*/.test(value)) {
916 if ((value.length % 2) != 0) {
917 value = "0" + value;
918 }
919 } else {
920MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string.");
921 throw Clipperz.ByteArray.exception.InvalidValue;
922 }
923
924 c = value.length / 2
925 result = new Array(c);
926 for (i=0; i<c; i++) {
927 result[i] = parseInt(value.substr(i*2, 2), 16);
928 }
929
930 } else {
931 var unicode;
932 result = [];
933 c = args.length;
934 for (i=0; i<c; i++) {
935 // Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar(result, args.charCodeAt(i));
936
937 unicode = args.charCodeAt(i);
938 if (unicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
939 result.push(unicode);
940 // } else if ((unicode >= 0x80) && (unicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
941 } else if (unicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
942 result.push((unicode >> 6) | 0xc0);
943 result.push((unicode & 0x3F) | 0x80);
944 // } else if ((unicode >= 0x0800) && (unicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
945 } else if (unicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
946 result.push((unicode >> 12) | 0xe0);
947 result.push(((unicode >> 6) & 0x3f) | 0x80);
948 result.push((unicode & 0x3f) | 0x80);
949 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
950 result.push((unicode >> 18) | 0xf0);
951 result.push(((unicode >> 12) & 0x3f) | 0x80);
952 result.push(((unicode >> 6) & 0x3f) | 0x80);
953 result.push((unicode & 0x3f) | 0x80);
954 }
955 }
956 }
957
958
959 this._value = result;
960 } else {
961 this._value = [];
962 this.appendBytes(MochiKit.Base.extend(null, arguments));
963 }
964 } else {
965 this._value = [];
966 }
967
968 return this;
969}
970
971Clipperz.ByteArray_array.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
972
973 //-------------------------------------------------------------------------
974
975 'toString': function() {
976 return "Clipperz.ByteArray_array";
977 },
978
979 //-------------------------------------------------------------------------
980
981 'clone': function() {
982 var result;
983
984 result = this.newInstance();
985 result.appendBytes(this._value);
986
987 return result;
988 },
989
990 //-------------------------------------------------------------------------
991
992 'newInstance': function() {
993 return new Clipperz.ByteArray_array();
994 },
995
996 //-------------------------------------------------------------------------
997
998 'reset': function() {
999 this._value = [];
1000 },
1001
1002 //-------------------------------------------------------------------------
1003
1004 'length': function() {
1005 return (this._value.length);
1006 },
1007
1008 //-------------------------------------------------------------------------
1009
1010 'appendBlock': function(aBlock) {
1011 MochiKit.Base.extend(this._value, aBlock._value);
1012
1013 return this;
1014 },
1015
1016 //-------------------------------------------------------------------------
1017
1018 'appendByte': function(aValue) {
1019 if (aValue != null) {
1020 this.checkByteValue(aValue);
1021 this._value.push(aValue);
1022 }
1023
1024 return this;
1025 },
1026
1027 //-------------------------------------------------------------------------
1028
1029 'byteAtIndex': function(anIndex) {
1030 return this._value[anIndex];
1031 },
1032
1033 'setByteAtIndex': function(aValue, anIndex) {
1034 varmissingBytes;
1035
1036 this.checkByteValue(aValue);
1037
1038 missingBytes = anIndex - this.length();
1039
1040 if (missingBytes < 0) {
1041 this._value[anIndex] = aValue;
1042 } else if (missingBytes == 0) {
1043 this._value.push(aValue);
1044 } else {
1045 var i,c;
1046
1047 c = missingBytes;
1048 for (i=0; i<c; i++) {
1049 this._value.push(0);
1050 }
1051
1052 this._value.push(aValue);
1053 }
1054 },
1055
1056 //-------------------------------------------------------------------------
1057
1058 'toHexString': function() {
1059 var result;
1060 var i, c;
1061
1062 result = "0x";
1063 c = this.length();
1064 for (i=0; i<c; i++) {
1065 result += Clipperz.ByteArray.byteToHex(this._value[i]);
1066 }
1067
1068 return result;
1069 },
1070
1071 //-------------------------------------------------------------------------
1072
1073 'split': function(aStartingIndex, anEndingIndex) {
1074 var result;
1075
1076 result = this.newInstance();
1077 result._value = this._value.slice(aStartingIndex, anEndingIndex ? anEndingIndex : this.length());
1078
1079 return result;
1080 },
1081
1082 //-------------------------------------------------------------------------
1083
1084 'arrayValues': function() {
1085 return this._value.slice(0);
1086 },
1087
1088 //-------------------------------------------------------------------------
1089 __syntaxFix__: "syntax fix"
1090});
1091
1092
1093
1094
1095
1096//=============================================================================
1097//
1098 //Clipperz.ByteArray_string
1099//
1100//=============================================================================
1101/*
1102Clipperz.ByteArray_string = function (args) {
1103 this._value = "";
1104
1105 if (typeof(args) != 'undefined') {
1106 if (args.constructor == Array) {
1107 this.appendBytes(args);
1108 } else if (args.constructor == String) {
1109 var result;
1110 varvalue;
1111 var i, c;
1112
1113 if (args.indexOf("0x") == 0) {
1114
1115 value = args.substring(2).toLowerCase();
1116 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activated
1117 if ((value.length % 2) != 0) {
1118 value = "0" + value;
1119 }
1120 } else {
1121MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string.");
1122 throw Clipperz.ByteArray.exception.InvalidValue;
1123 }
1124 } else {
1125 value = "";
1126 c = args.length;
1127 for (i=0; i<c; i++) {
1128 value += Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i));
1129 }
1130 }
1131
1132 c = value.length / 2
1133 for (i=0; i<c; i++) {
1134 this.appendByte(parseInt(value.substr(i*2, 2), 16));
1135 }
1136 } else {
1137 this.appendBytes(MochiKit.Base.extend(null, arguments));
1138 }
1139 }
1140
1141 return this;
1142}
1143
1144Clipperz.ByteArray_string.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
1145
1146 //-------------------------------------------------------------------------
1147
1148 'toString': function() {
1149 return "Clipperz.ByteArray_string";
1150 },
1151
1152 //-------------------------------------------------------------------------
1153
1154 'clone': function() {
1155 var result;
1156
1157 result = this.newInstance();
1158 result._value = this._value;
1159
1160 return result;
1161 },
1162
1163 //-------------------------------------------------------------------------
1164
1165 'newInstance': function() {
1166 return new Clipperz.ByteArray_string();
1167 },
1168
1169 //-------------------------------------------------------------------------
1170
1171 'reset': function() {
1172 this._value = "";
1173 },
1174
1175 //-------------------------------------------------------------------------
1176
1177 'length': function() {
1178 return (this._value.length);
1179 },
1180
1181 //-------------------------------------------------------------------------
1182
1183 'appendBlock': function(aBlock) {
1184 this._value += aBlock._value;
1185
1186 return this;
1187 },
1188
1189 //-------------------------------------------------------------------------
1190
1191 'appendByte': function(aValue) {
1192 if (aValue != null) {
1193 this.checkByteValue(aValue);
1194 this._value += String.fromCharCode(aValue);
1195 }
1196
1197 return this;
1198 },
1199
1200 //-------------------------------------------------------------------------
1201
1202 'byteAtIndex': function(anIndex) {
1203 return this._value.charCodeAt(anIndex);
1204 },
1205
1206 'setByteAtIndex': function(aValue, anIndex) {
1207 varmissingBytes;
1208
1209 this.checkByteValue(aValue);
1210
1211 missingBytes = anIndex - this.length();
1212
1213 if (missingBytes < 0) {
1214 this._value = this._value.substring(0, anIndex) + String.fromCharCode(aValue) + this._value.substring(anIndex + 1);
1215 } else if (missingBytes == 0) {
1216 this.appendByte(aValue);
1217 } else {
1218 var i,c;
1219
1220 c = missingBytes;
1221 for (i=0; i<c; i++) {
1222 this.appendByte(0);
1223 }
1224
1225 this.appendByte(aValue);
1226 }
1227 },
1228
1229 //-------------------------------------------------------------------------
1230
1231 'toHexString': function() {
1232 var result;
1233 var i, c;
1234
1235 result = "0x";
1236 c = this.length();
1237 for (i=0; i<c; i++) {
1238 result += Clipperz.ByteArray.byteToHex(this.byteAtIndex(i));
1239 }
1240
1241 return result;
1242 },
1243
1244 //-------------------------------------------------------------------------
1245
1246 'split': function(aStartingIndex, anEndingIndex) {
1247 var result;
1248 result = this.newInstance();
1249 result._value = this._value.substring(aStartingIndex, anEndingIndex ? anEndingIndex : this.length());
1250
1251 return result;
1252 },
1253
1254 //-------------------------------------------------------------------------
1255
1256 'arrayValues': function() {
1257 var result;
1258 var i,c;
1259
1260 c = this.length();
1261
1262 result = new Array(c);
1263 for (i=0; i<c; i++) {
1264 result[i] = this.byteAtIndex(i);
1265 }
1266
1267 return result;
1268 },
1269
1270 //-------------------------------------------------------------------------
1271 __syntaxFix__: "syntax fix"
1272});
1273*/
1274
1275//=============================================================================
1276//
1277 //Clipperz.ByteArray
1278//
1279//=============================================================================
1280
1281Clipperz.ByteArray = Clipperz.ByteArray_array;
1282//Clipperz.ByteArray = Clipperz.ByteArray_string;
1283//Clipperz.ByteArray = Clipperz.ByteArray_hex;
1284
1285//#############################################################################
1286
1287Clipperz.ByteArray.byteToHex = function(aByte) {
1288 return ((aByte < 16) ? "0" : "") + aByte.toString(16);
1289}
1290
1291
1292Clipperz.ByteArray.unicodeToUtf8HexString = function(aUnicode) {
1293 var result;
1294 varself;
1295
1296 self = Clipperz.ByteArray;
1297
1298 if (aUnicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
1299 result = self.byteToHex(aUnicode);
1300 // } else if ((aUnicode >= 0x80) && (aUnicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1301 } else if (aUnicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1302 result = self.byteToHex((aUnicode >> 6) | 0xc0);
1303 result += self.byteToHex((aUnicode & 0x3F) | 0x80);
1304 // } else if ((aUnicode >= 0x0800) && (aUnicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1305 } else if (aUnicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1306 result = self.byteToHex((aUnicode >> 12) | 0xe0);
1307 result += self.byteToHex(((aUnicode >> 6) & 0x3f) | 0x80);
1308 result += self.byteToHex((aUnicode & 0x3f) | 0x80);
1309 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1310 result = self.byteToHex((aUnicode >> 18) | 0xf0);
1311 result += self.byteToHex(((aUnicode >> 12) & 0x3f) | 0x80);
1312 result += self.byteToHex(((aUnicode >> 6) & 0x3f) | 0x80);
1313 result += self.byteToHex((aUnicode & 0x3f) | 0x80);
1314 }
1315
1316 return result;
1317}
1318
1319Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar = function(anArray, aUnicode) {
1320 varself;
1321
1322 self = Clipperz.ByteArray;
1323
1324 if (aUnicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
1325 anArray.push(aUnicode);
1326 // } else if ((aUnicode >= 0x80) && (aUnicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1327 } else if (aUnicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1328 anArray.push((aUnicode >> 6) | 0xc0);
1329 anArray.push((aUnicode & 0x3F) | 0x80);
1330 // } else if ((aUnicode >= 0x0800) && (aUnicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1331 } else if (aUnicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1332 anArray.push((aUnicode >> 12) | 0xe0);
1333 anArray.push(((aUnicode >> 6) & 0x3f) | 0x80);
1334 anArray.push((aUnicode & 0x3f) | 0x80);
1335 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1336 anArray.push((aUnicode >> 18) | 0xf0);
1337 anArray.push(((aUnicode >> 12) & 0x3f) | 0x80);
1338 anArray.push(((aUnicode >> 6) & 0x3f) | 0x80);
1339 anArray.push((aUnicode & 0x3f) | 0x80);
1340 }
1341}
1342
1343Clipperz.ByteArray.prefixMatchingBits = function (aValue, bValue) {
1344 varresult;
1345 var i,c;
1346
1347 result = 0;
1348
1349 c = Math.min(aValue.length(), bValue.length());
1350 i = 0;
1351 while (i<c && (aValue.byteAtIndex(i) == bValue.byteAtIndex(i))) {
1352 result += 8;
1353 i++;
1354 }
1355
1356 if (i<c) {
1357 varxorValue;
1358
1359 xorValue = (aValue.byteAtIndex(i) ^ bValue.byteAtIndex(i));
1360
1361 if (xorValue >= 128) {
1362 result += 0;
1363 } else if (xorValue >= 64) {
1364 result += 1;
1365 } else if (xorValue >= 32) {
1366 result += 2;
1367 } else if (xorValue >= 16) {
1368 result += 3;
1369 } else if (xorValue >= 8) {
1370 result += 4;
1371 } else if (xorValue >= 4) {
1372 result += 5;
1373 } else if (xorValue >= 2) {
1374 result += 6;
1375 } else if (xorValue >= 1) {
1376 result += 7;
1377 }
1378 }
1379
1380 return result;
1381};
1382
1383Clipperz.ByteArray.exception = {
1384 InvalidValue: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue")
1385};
1386
1387//#############################################################################
1388
1389Clipperz.ByteArrayIterator = function(args) {
1390 args = args || {};
1391
1392 this._byteArray = args.byteArray;
1393 this._blockSize = args.blockSize;
1394 this._finalPadding = args.finalPadding || false;
1395
1396 this._currentPosition = 0;
1397
1398 return this;
1399}
1400
1401Clipperz.ByteArrayIterator.prototype = MochiKit.Base.update(null, {
1402
1403 //-------------------------------------------------------------------------
1404
1405 'toString': function() {
1406 return "Clipperz.ByteArrayIterator";
1407 },
1408
1409 //-------------------------------------------------------------------------
1410
1411 'blockSize': function() {
1412 var result;
1413
1414 result = this._blockSize;
1415
1416 return result;
1417 },
1418
1419 //-------------------------------------------------------------------------
1420
1421 'currentPosition': function() {
1422 var result;
1423
1424 result = this._currentPosition;
1425
1426 return result;
1427 },
1428
1429 //-------------------------------------------------------------------------
1430
1431 'byteArray': function() {
1432 var result;
1433
1434 result = this._byteArray;
1435
1436 return result;
1437 },
1438
1439 //-------------------------------------------------------------------------
1440
1441 'finalPadding': function() {
1442 var result;
1443
1444 result = this._finalPadding;
1445
1446 return result;
1447 },
1448
1449 //-------------------------------------------------------------------------
1450
1451 'nextBlock': function() {
1452 var result;
1453 var currentPosition;
1454 varbyteArrayLength;
1455
1456 currentPosition = this._currentPosition;
1457 byteArrayLength = this.byteArray().length();
1458
1459 if (currentPosition < byteArrayLength) {
1460 var i,c;
1461
1462 c = this.blockSize();
1463 result = new Array(c);
1464 for (i=0; i<c; i++) {
1465 if (currentPosition < byteArrayLength) {
1466 result[i] = this.byteArray().byteAtIndex(currentPosition);
1467 currentPosition++;
1468 } else if (this.finalPadding() == true) {
1469 result[i] = 0;
1470 }
1471 }
1472
1473 this._currentPosition = currentPosition;
1474 } else {
1475 result = null;
1476 }
1477
1478 return result;
1479 },
1480
1481 //-------------------------------------------------------------------------
1482
1483 'nextBlockArray': function() {
1484 var result;
1485 var nextBlock;
1486
1487 nextBlock = this.nextBlock();
1488
1489 if (nextBlock != null) {
1490 result = new Clipperz.ByteArray(nextBlock);
1491 } else {
1492 result = null;
1493 }
1494
1495 return result;
1496 },
1497
1498 //-----------------------------------------------------------------------------
1499 __syntaxFix__: "syntax fix"
1500
1501});
diff --git a/frontend/gamma/js/Clipperz/CSVProcessor.js b/frontend/gamma/js/Clipperz/CSVProcessor.js
new file mode 100644
index 0000000..d481ba2
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/CSVProcessor.js
@@ -0,0 +1,349 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30
31
32Clipperz.CSVProcessor = function(args) {
33 args = args || {};
34
35 // this._status = undefined;
36 // this._error_input= undefined;
37 // this._string = undefined;
38 // this._fields = undefined;
39
40 this._quoteChar = args['quoteChar'] ||"\042";
41 this._eol = args['eol'] ||"";
42 this._escapeChar = args['escapeChar'] ||"\042";
43 this._separatorChar = args['separatorChar'] ||",";
44 this._binary = args['binary'] ||false;
45 this._alwaysQuote = args['alwaysQuote'] ||false;
46
47 return this;
48}
49
50//=============================================================================
51
52Clipperz.CSVProcessor.prototype = MochiKit.Base.update(null, {
53
54 //-------------------------------------------------------------------------
55
56 'quoteChar': function() {
57 return this._quoteChar;
58 },
59
60 //-------------------------------------------------------------------------
61
62 'eol': function() {
63 return this._eol;
64 },
65
66 //-------------------------------------------------------------------------
67
68 'escapeChar': function() {
69 return this._escapeChar;
70 },
71
72 //-------------------------------------------------------------------------
73
74 'separatorChar': function() {
75 return this._separatorChar;
76 },
77
78 'setSeparatorChar': function(aValue) {
79 this._separatorChar = aValue;
80 },
81
82 //-------------------------------------------------------------------------
83
84 'binary': function() {
85 return this._binary;
86 },
87
88 //-------------------------------------------------------------------------
89
90 'alwaysQuote': function() {
91 return this._alwaysQuote;
92 },
93
94 //-------------------------------------------------------------------------
95/*
96 'parse': function(aValue) {
97 var result;
98 var lines;
99 var parameter;
100
101//MochiKit.Logging.logDebug(">>> CSVProcessor.parse");
102 result = [];
103
104 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n* /g, "").replace(/\n$/g, "");;
105 parameter = {
106 line: lines
107 }
108
109 do {
110 var fields;
111
112 fields = this.parseLine(parameter);
113
114 if (fields != null) {
115 result.push(fields);
116 }
117
118 parameter.line = parameter.line.replace(/^\n* /g, "").replace(/\n$/g, "");
119
120//MochiKit.Logging.logDebug("line: '" + parameter.line + "'");
121 } while (parameter.line != "");
122//MochiKit.Logging.logDebug("--- CSVProcessor.parse - result: " + Clipperz.Base.serializeJSON(result));
123//MochiKit.Logging.logDebug("<<< CSVProcessor.parse");
124
125 return result;
126 },
127*/
128 //-------------------------------------------------------------------------
129
130 'deferredParse_core': function(aContext) {
131 var deferredResult;
132
133 if (aContext.line == "") {
134 deferredResult = MochiKit.Async.succeed(aContext.result);
135 } else {
136 var fields;
137
138 fields = this.parseLine(aContext);
139 if (fields != null) {
140 aContext.result.push(fields);
141 }
142
143 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
144
145 deferredResult = new Clipperz.Async.Deferred("CVSProcessor.deferredParse_core");
146 // deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
147 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
148 deferredResult.addCallback(MochiKit.Async.wait, 0.2);
149 deferredResult.addMethod(this, 'deferredParse_core')
150 deferredResult.callback(aContext);
151 }
152
153 return deferredResult;
154 },
155
156 //.........................................................................
157
158 'deferredParse': function(aValue) {
159 var deferredResult;
160 var lines;
161 var context;
162
163 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n*/g, "").replace(/\n$/g, "");
164
165 context = {
166 line: lines,
167 size: lines.length,
168 result: []
169 }
170
171 deferredResult = new Clipperz.Async.Deferred("CSVProcessor.deferredParse");
172 deferredResult.addMethod(this, 'deferredParse_core');
173 deferredResult.callback(context);
174
175 return deferredResult;
176 },
177
178 //-------------------------------------------------------------------------
179
180 'parseLine': function(aParameter) {
181 var result;
182 var palatable;
183 var line;
184 var processedField;
185
186 result = [];
187
188 do {
189 processedField = this.parseField(aParameter);
190 if (processedField != null) {
191 result.push(processedField)
192 };
193 } while (processedField != null);
194
195 return result;
196 },
197
198 //-------------------------------------------------------------------------
199
200 'parseField': function(aParameter) {
201 var result;
202
203 var inQuotes;
204 var validRegExp;
205 var singleQuoteBeginRegexp;
206 var escapedQuoteBeginRegexp;
207 var singleQuoteCommaEndRegexp;
208 var singleQuoteNewLineEndRegexp;
209 var commaBeginRegexp;
210 var newlineRegexp;
211
212
213 singleQuoteBeginRegexp = new RegExp("^" + '\\' + this.quoteChar());
214 escapedQuoteBeginRegexp = new RegExp("^" + '\\' + this.escapeChar() + '\\' + this.quoteChar());
215 singleQuoteCommaEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + '\\' + this.separatorChar());
216 singleQuoteNewLineEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + "\n");
217 commaBeginRegexp = new RegExp("^" + '\\' + this.separatorChar());
218 newlineRegexp = new RegExp("^\n");
219
220 inQuotes = false;
221
222//MochiKit.Logging.logDebug("#################################### '" + aParameter.line + "'");
223 if (aParameter.line == "") {
224 if (aParameter.isThereAnEmptyFinalField == true) {
225 aParameter.isThereAnEmptyFinalField = false;
226 result = "";
227 } else {
228 result = null;
229 }
230 } else {
231 if (this.binary()) {
232 validRegexp = /^./;
233 // validRegexp = /^[^\\]/;
234 } else {
235 validRegexp = /^[\t\040-\176]/;
236 }
237
238 try {
239 var done;
240
241 done = false;
242 result = "";
243
244 while (!done) {
245 if (aParameter.line.length < 1) {
246//MochiKit.Logging.logDebug("---> 1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
247 if (inQuotes == true) {
248//MochiKit.Logging.logDebug("---> 1.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
249 throw new Error("CSV Parsing error; end of string, missing closing double-quote...");
250 } else {
251//MochiKit.Logging.logDebug("---> 1.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
252 done = true;
253 }
254 } else if (escapedQuoteBeginRegexp.test(aParameter.line)) {
255//MochiKit.Logging.logDebug("---> 2.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
256 result += this.quoteChar();
257 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
258//MochiKit.Logging.logDebug("<--- 2.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
259 } else if (singleQuoteBeginRegexp.test(aParameter.line)) {
260//MochiKit.Logging.logDebug("---> 3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
261 if (inQuotes == true) {
262 if (aParameter.line.length == 1) {
263//MochiKit.Logging.logDebug("---> 3.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
264 aParameter.line = '';
265 done = true;
266 } else if (singleQuoteCommaEndRegexp.test(aParameter.line)) {
267//MochiKit.Logging.logDebug("---> 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
268 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
269 done = true;
270//MochiKit.Logging.logDebug("<--- 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
271 } else if (singleQuoteNewLineEndRegexp.test(aParameter.line)) {
272 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
273 done = true;
274 } else {
275 throw new Error("CSV Parsing error; double-quote, followed by undesirable character (bad character sequence)... " + aParameter.line);
276 }
277 } else {
278//MochiKit.Logging.logDebug("---> 4: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
279 if (result == "") {
280//MochiKit.Logging.logDebug("---> 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
281 inQuotes = true;
282 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
283//MochiKit.Logging.logDebug("<--- 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
284 } else {
285 throw new Error("CSV Parsing error; double-quote, outside of double-quotes (bad character sequence)...");
286 }
287 }
288 } else if (commaBeginRegexp.test(aParameter.line)) {
289//MochiKit.Logging.logDebug("---> 5: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
290 if (inQuotes) {
291//MochiKit.Logging.logDebug("---> 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
292 result += aParameter.line.substr(0 ,1);
293 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
294//MochiKit.Logging.logDebug("<--- 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
295 } else {
296//MochiKit.Logging.logDebug("---> 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
297 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
298 if (newlineRegexp.test(aParameter.line) || aParameter.line == "") {
299//MochiKit.Logging.logDebug("######");
300 aParameter.isThereAnEmptyFinalField = true;
301 };
302 done = true;
303//MochiKit.Logging.logDebug("<--- 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
304 }
305 } else if (validRegexp.test(aParameter.line)) {
306//MochiKit.Logging.logDebug("---> 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
307 result += aParameter.line.substr(0, 1);
308 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
309//MochiKit.Logging.logDebug("<--- 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
310 } else if (newlineRegexp.test(aParameter.line)) {
311 if (inQuotes == true) {
312 result += aParameter.line.substr(0 ,1);
313 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
314 } else {
315 if (result == "") {
316 if (aParameter.isThereAnEmptyFinalField == true) {
317 aParameter.isThereAnEmptyFinalField = false;
318 } else {
319 result = null;
320 }
321 }
322
323 done = true;
324 }
325 } else {
326 throw new Error("CSV Parsing error; an undesirable character... '" + aParameter.line.substr(0,1) + "'");
327 }
328 }
329 } catch(exception) {
330 MochiKit.Logging.logError(exception.message);
331 // result = null;
332 throw exception;
333 }
334 }
335
336//if (result != null) {
337 //MochiKit.Logging.logDebug("<=== result: '" + result.replace(/\n/g, "\\n") + "'");
338//} else {
339 //MochiKit.Logging.logDebug("<=== result: NULL");
340//}
341
342 return result;
343 },
344
345 //-------------------------------------------------------------------------
346 __syntaxFix__: "syntax fix"
347});
348
349
diff --git a/frontend/gamma/js/Clipperz/Crypto/AES.js b/frontend/gamma/js/Clipperz/Crypto/AES.js
new file mode 100644
index 0000000..36fc731
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/AES.js
@@ -0,0 +1,869 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!";
31}
32
33 //Dependency commented to avoid a circular reference
34//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
35 //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!";
36//}
37
38if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; }
39
40//#############################################################################
41
42Clipperz.Crypto.AES.DeferredExecutionContext = function(args) {
43 args = args || {};
44
45 this._key = args.key;
46 this._message = args.message;
47 this._result = args.message.clone();
48 this._nonce = args.nonce;
49 this._messageLength = this._message.length();
50
51 this._messageArray = this._message.arrayValues();
52 this._resultArray = this._result.arrayValues();
53 this._nonceArray = this._nonce.arrayValues();
54
55 this._executionStep = 0;
56
57 // this._elaborationChunkSize = 1024; // 4096; // 16384; //4096;
58 this._elaborationChunks = 10;
59 this._pauseTime = 0.02; // 0.02 //0.2;
60
61 return this;
62}
63
64Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, {
65
66 'key': function() {
67 return this._key;
68 },
69
70 'message': function() {
71 return this._message;
72 },
73
74 'messageLength': function() {
75 return this._messageLength;
76 },
77
78 'result': function() {
79 return new Clipperz.ByteArray(this.resultArray());
80 },
81
82 'nonce': function() {
83 return this._nonce;
84 },
85
86 'messageArray': function() {
87 return this._messageArray;
88 },
89
90 'resultArray': function() {
91 return this._resultArray;
92 },
93
94 'nonceArray': function() {
95 return this._nonceArray;
96 },
97
98 'elaborationChunkSize': function() {
99 // return Clipperz.Crypto.AES.DeferredExecution.chunkSize;
100 // return this._elaborationChunkSize;
101 return (this._elaborationChunks * 1024);
102 },
103
104 'executionStep': function() {
105 return this._executionStep;
106 },
107
108 'setExecutionStep': function(aValue) {
109 this._executionStep = aValue;
110 },
111
112 'tuneExecutionParameters': function (anElapsedTime) {
113//var originalChunks = this._elaborationChunks;
114 if (anElapsedTime > 0) {
115 this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2)));
116 }
117//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]");
118 },
119
120 'pause': function(aValue) {
121 // return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue);
122 return MochiKit.Async.wait(this._pauseTime, aValue);
123 },
124
125 'isDone': function () {
126//console.log("isDone", this.executionStep(), this.messageLength());
127 return (this._executionStep >= this._messageLength);
128 },
129
130 //-----------------------------------------------------------------------------
131 __syntaxFix__: "syntax fix"
132
133});
134
135//#############################################################################
136
137Clipperz.Crypto.AES.Key = function(args) {
138 args = args || {};
139
140 this._key = args.key;
141 this._keySize = args.keySize || this.key().length();
142
143 if (this.keySize() == 128/8) {
144 this._b = 176;
145 this._numberOfRounds = 10;
146 } else if (this.keySize() == 256/8) {
147 this._b = 240;
148 this._numberOfRounds = 14;
149 } else {
150 MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits");
151 throw Clipperz.Crypto.AES.exception.UnsupportedKeySize;
152 }
153
154 this._stretchedKey = null;
155
156 return this;
157}
158
159Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, {
160
161 'asString': function() {
162 return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")";
163 },
164
165 //-----------------------------------------------------------------------------
166
167 'key': function() {
168 return this._key;
169 },
170
171 'keySize': function() {
172 return this._keySize;
173 },
174
175 'b': function() {
176 return this._b;
177 },
178
179 'numberOfRounds': function() {
180 return this._numberOfRounds;
181 },
182 //=========================================================================
183
184 'keyScheduleCore': function(aWord, aRoundConstantsIndex) {
185 varresult;
186 var sbox;
187
188 sbox = Clipperz.Crypto.AES.sbox();
189
190 result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex],
191 sbox[aWord[2]],
192 sbox[aWord[3]],
193 sbox[aWord[0]]];
194
195 return result;
196 },
197
198 //-----------------------------------------------------------------------------
199
200 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) {
201 varresult;
202 var i,c;
203
204 result = [];
205 c = 4;
206 for (i=0; i<c; i++) {
207 result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i);
208 }
209
210 return result;
211 },
212
213 //-----------------------------------------------------------------------------
214
215 'sboxShakeup': function(aWord) {
216 var result;
217 var sbox;
218 var i,c;
219
220 result = [];
221 sbox = Clipperz.Crypto.AES.sbox();
222 c =4;
223 for (i=0; i<c; i++) {
224 result[i] = sbox[aWord[i]];
225 }
226
227 return result;
228 },
229
230 //-----------------------------------------------------------------------------
231
232 'stretchKey': function(aKey) {
233 varcurrentWord;
234 varkeyLength;
235 varpreviousStretchIndex;
236 var i,c;
237
238 keyLength = aKey.length();
239 previousStretchIndex = keyLength - this.keySize();
240
241 currentWord = [aKey.byteAtIndex(keyLength - 4),
242 aKey.byteAtIndex(keyLength - 3),
243 aKey.byteAtIndex(keyLength - 2),
244 aKey.byteAtIndex(keyLength - 1)];
245 currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize());
246
247 if (this.keySize() == 256/8) {
248 c = 8;
249 } else if (this.keySize() == 128/8){
250 c = 4;
251 }
252
253 for (i=0; i<c; i++) {
254 if (i == 4) {
255 //fifth streatch word
256 currentWord = this.sboxShakeup(currentWord);
257 }
258
259 currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4));
260 aKey.appendBytes(currentWord);
261 }
262
263 return aKey;
264 },
265
266 //-----------------------------------------------------------------------------
267
268 'stretchedKey': function() {
269 if (this._stretchedKey == null) {
270 var stretchedKey;
271
272 stretchedKey = this.key().clone();
273
274 while (stretchedKey.length() < this.keySize()) {
275 stretchedKey.appendByte(0);
276 }
277
278 while (stretchedKey.length() < this.b()) {
279 stretchedKey = this.stretchKey(stretchedKey);
280 }
281
282 this._stretchedKey = stretchedKey.split(0, this.b());
283 }
284
285 return this._stretchedKey;
286 },
287
288 //=========================================================================
289 __syntaxFix__: "syntax fix"
290});
291
292//#############################################################################
293
294Clipperz.Crypto.AES.State = function(args) {
295 args = args || {};
296
297 this._data = args.block;
298 this._key = args.key;
299
300 return this;
301}
302
303Clipperz.Crypto.AES.State.prototype = MochiKit.Base.update(null, {
304
305 'key': function() {
306 return this._key;
307 },
308
309 //-----------------------------------------------------------------------------
310
311 'data': function() {
312 return this._data;
313 },
314
315 'setData': function(aValue) {
316 this._data = aValue;
317 },
318
319 //=========================================================================
320
321 'addRoundKey': function(aRoundNumber) {
322 //each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule.
323 vardata;
324 varstretchedKey;
325 varfirstStretchedKeyIndex;
326 var i,c;
327
328 data = this.data();
329 stretchedKey = this.key().stretchedKey();
330 firstStretchedKeyIndex = aRoundNumber * (128/8);
331 c = 128/8;
332 for (i=0; i<c; i++) {
333 data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i);
334 }
335 },
336
337 //-----------------------------------------------------------------------------
338
339 'subBytes': function() {
340 // a non-linear substitution step where each byte is replaced with another according to a lookup table.
341 var i,c;
342 vardata;
343 var sbox;
344
345 data = this.data();
346 sbox = Clipperz.Crypto.AES.sbox();
347
348 c = 16;
349 for (i=0; i<c; i++) {
350 data[i] = sbox[data[i]];
351 }
352 },
353
354 //-----------------------------------------------------------------------------
355
356 'shiftRows': function() {
357 //a transposition step where each row of the state is shifted cyclically a certain number of steps.
358 varnewValue;
359 vardata;
360 varshiftMapping;
361 vari,c;
362
363 newValue = new Array(16);
364 data = this.data();
365 shiftMapping = Clipperz.Crypto.AES.shiftRowMapping();
366 // [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
367 c = 16;
368 for (i=0; i<c; i++) {
369 newValue[i] = data[shiftMapping[i]];
370 }
371 for (i=0; i<c; i++) {
372 data[i] = newValue[i];
373 }
374 },
375
376 //-----------------------------------------------------------------------------
377/*
378 'mixColumnsWithValues': function(someValues) {
379 varresult;
380 vara;
381 var i,c;
382
383 c = 4;
384 result = [];
385 a = [];
386 for (i=0; i<c; i++) {
387 a[i] = [];
388 a[i][1] = someValues[i]
389 if ((a[i][1] & 0x80) == 0x80) {
390 a[i][2] = (a[i][1] << 1) ^ 0x11b;
391 } else {
392 a[i][2] = a[i][1] << 1;
393 }
394
395 a[i][3] = a[i][2] ^ a[i][1];
396 }
397
398 for (i=0; i<c; i++) {
399 varx;
400
401 x = Clipperz.Crypto.AES.mixColumnsMatrix()[i];
402 result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]];
403 }
404
405 return result;
406 },
407
408 'mixColumns': function() {
409 //a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
410 var data;
411 var i, c;
412
413 data = this.data();
414 c = 4;
415 for(i=0; i<c; i++) {
416 varblockIndex;
417 var mixedValues;
418
419 blockIndex = i * 4;
420 mixedValues = this.mixColumnsWithValues([data[blockIndex + 0],
421 data[blockIndex + 1],
422 data[blockIndex + 2],
423 data[blockIndex + 3]]);
424 data[blockIndex + 0] = mixedValues[0];
425 data[blockIndex + 1] = mixedValues[1];
426 data[blockIndex + 2] = mixedValues[2];
427 data[blockIndex + 3] = mixedValues[3];
428 }
429 },
430*/
431
432 'mixColumns': function() {
433 //a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
434 var data;
435 var i, c;
436 var a_1;
437 var a_2;
438
439 a_1 = new Array(4);
440 a_2 = new Array(4);
441
442 data = this.data();
443 c = 4;
444 for(i=0; i<c; i++) {
445 varblockIndex;
446 var ii, cc;
447
448 blockIndex = i * 4;
449
450 cc = 4;
451 for (ii=0; ii<cc; ii++) {
452 var value;
453
454 value = data[blockIndex + ii];
455 a_1[ii] = value;
456 a_2[ii] = (value & 0x80) ? ((value << 1) ^ 0x011b) : (value << 1);
457 }
458
459 data[blockIndex + 0] = a_2[0] ^ a_1[1] ^ a_2[1] ^ a_1[2] ^ a_1[3];
460 data[blockIndex + 1] = a_1[0] ^ a_2[1] ^ a_1[2] ^ a_2[2] ^ a_1[3];
461 data[blockIndex + 2] = a_1[0] ^ a_1[1] ^ a_2[2] ^ a_1[3] ^ a_2[3];
462 data[blockIndex + 3] = a_1[0] ^ a_2[0] ^ a_1[1] ^ a_1[2] ^ a_2[3];
463 }
464 },
465
466 //=========================================================================
467
468 'spinRound': function(aRoundNumber) {
469 this.addRoundKey(aRoundNumber);
470 this.subBytes();
471 this.shiftRows();
472 this.mixColumns();
473 },
474
475 'spinLastRound': function() {
476 this.addRoundKey(this.key().numberOfRounds() - 1);
477 this.subBytes();
478 this.shiftRows();
479 this.addRoundKey(this.key().numberOfRounds());
480 },
481
482 //=========================================================================
483
484 'encrypt': function() {
485 vari,c;
486
487 c = this.key().numberOfRounds() - 1;
488 for (i=0; i<c; i++) {
489 this.spinRound(i);
490 }
491
492 this.spinLastRound();
493 },
494
495 //=========================================================================
496 __syntaxFix__: "syntax fix"
497});
498
499//#############################################################################
500
501Clipperz.Crypto.AES.VERSION = "0.1";
502Clipperz.Crypto.AES.NAME = "Clipperz.Crypto.AES";
503
504MochiKit.Base.update(Clipperz.Crypto.AES, {
505
506 //http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-AES.html
507 //http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
508 //http://en.wikipedia.org/wiki/Rijndael_key_schedule
509 //http://en.wikipedia.org/wiki/Rijndael_S-box
510
511 '__repr__': function () {
512 return "[" + this.NAME + " " + this.VERSION + "]";
513 },
514
515 'toString': function () {
516 return this.__repr__();
517 },
518
519 //=============================================================================
520
521 '_sbox': null,
522 'sbox': function() {
523 if (Clipperz.Crypto.AES._sbox == null) {
524 Clipperz.Crypto.AES._sbox = [
5250x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
5260xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
5270xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
5280x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
5290x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
5300x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
5310xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
5320x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
5330xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
5340x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
5350xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
5360xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
5370xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
5380x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
5390xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
5400x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
541 ];
542 }
543
544 return Clipperz.Crypto.AES._sbox;
545 },
546
547 //-----------------------------------------------------------------------------
548 //
549 // 0 4 8 12 0 4 812
550 // 1 5 9 13 => 5 9 131
551 // 2 6 10 14 10 14 26
552 // 3 7 11 15 15 3 711
553 //
554 '_shiftRowMapping': null,
555 'shiftRowMapping': function() {
556 if (Clipperz.Crypto.AES._shiftRowMapping == null) {
557 Clipperz.Crypto.AES._shiftRowMapping = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
558 }
559
560 return Clipperz.Crypto.AES._shiftRowMapping;
561 },
562
563 //-----------------------------------------------------------------------------
564
565 '_mixColumnsMatrix': null,
566 'mixColumnsMatrix': function() {
567 if (Clipperz.Crypto.AES._mixColumnsMatrix == null) {
568 Clipperz.Crypto.AES._mixColumnsMatrix = [[2, 3, 1 ,1],
569 [1, 2, 3, 1],
570 [1, 1, 2, 3],
571 [3, 1, 1, 2] ];
572 }
573
574 return Clipperz.Crypto.AES._mixColumnsMatrix;
575 },
576
577 '_roundConstants': null,
578 'roundConstants': function() {
579 if (Clipperz.Crypto.AES._roundConstants == null) {
580 Clipperz.Crypto.AES._roundConstants = [ , 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154];
581 // Clipperz.Crypto.AES._roundConstants = [ , 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a];
582 }
583
584 return Clipperz.Crypto.AES._roundConstants;
585 },
586
587 //=============================================================================
588
589 'incrementNonce': function(aNonce) {
590//Clipperz.Profile.start("Clipperz.Crypto.AES.incrementNonce");
591 var i;
592 var done;
593
594 done = false;
595 i = aNonce.length - 1;
596
597 while ((i>=0) && (done == false)) {
598 var currentByteValue;
599
600 currentByteValue = aNonce[i];
601
602 if (currentByteValue == 0xff) {
603 aNonce[i] = 0;
604 if (i>= 0) {
605 i --;
606 } else {
607 done = true;
608 }
609 } else {
610 aNonce[i] = currentByteValue + 1;
611 done = true;
612 }
613 }
614//Clipperz.Profile.stop("Clipperz.Crypto.AES.incrementNonce");
615 },
616
617 //-----------------------------------------------------------------------------
618
619 'encryptBlock': function(aKey, aBlock) {
620 varresult;
621 varstate;
622
623 state = new Clipperz.Crypto.AES.State({block:aBlock, key:aKey});
624//is(state.data(), 'before');
625 state.encrypt();
626 result = state.data();
627
628 return result;
629 },
630
631 //-----------------------------------------------------------------------------
632
633 'encryptBlocks': function(aKey, aMessage, aNonce) {
634 varresult;
635 var nonce;
636 var self;
637 varmessageIndex;
638 varmessageLength;
639 var blockSize;
640
641 self = Clipperz.Crypto.AES;
642 blockSize = 128/8;
643 messageLength = aMessage.length;
644 nonce = aNonce;
645
646 result = aMessage;
647 messageIndex = 0;
648 while (messageIndex < messageLength) {
649 var encryptedBlock;
650 var i,c;
651
652 self.incrementNonce(nonce);
653 encryptedBlock = self.encryptBlock(aKey, nonce);
654
655 if ((messageLength - messageIndex) > blockSize) {
656 c = blockSize;
657 } else {
658 c = messageLength - messageIndex;
659 }
660
661 for (i=0; i<c; i++) {
662 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
663 }
664
665 messageIndex += blockSize;
666 }
667
668 return result;
669 },
670
671 //-----------------------------------------------------------------------------
672
673 'encrypt': function(aKey, someData, aNonce) {
674 var result;
675 var nonce;
676 varencryptedData;
677 var key;
678
679 key = new Clipperz.Crypto.AES.Key({key:aKey});
680 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
681
682 encryptedData = Clipperz.Crypto.AES.encryptBlocks(key, someData.arrayValues(), nonce.arrayValues());
683
684 result = nonce.appendBytes(encryptedData);
685
686 return result;
687 },
688
689 //-----------------------------------------------------------------------------
690
691 'decrypt': function(aKey, someData) {
692 var result;
693 var nonce;
694 var encryptedData;
695 var decryptedData;
696 vardataIterator;
697 var key;
698
699 key = new Clipperz.Crypto.AES.Key({key:aKey});
700
701 encryptedData = someData.arrayValues();
702 nonce = encryptedData.slice(0, (128/8));
703 encryptedData = encryptedData.slice(128/8);
704 decryptedData = Clipperz.Crypto.AES.encryptBlocks(key, encryptedData, nonce);
705
706 result = new Clipperz.ByteArray(decryptedData);
707
708 return result;
709 },
710
711 //=============================================================================
712
713 'deferredEncryptExecutionChunk': function(anExecutionContext) {
714 varresult;
715 var nonce;
716 var self;
717 varmessageIndex;
718 varmessageLength;
719 var blockSize;
720 var executionLimit;
721 var startTime, endTime;
722
723 self = Clipperz.Crypto.AES;
724 startTime = new Date();
725 blockSize = 128/8;
726 messageLength = anExecutionContext.messageArray().length;
727 nonce = anExecutionContext.nonceArray();
728 result = anExecutionContext.resultArray();
729
730 messageIndex = anExecutionContext.executionStep();
731 executionLimit = messageIndex + anExecutionContext.elaborationChunkSize();
732 executionLimit = Math.min(executionLimit, messageLength);
733
734 while (messageIndex < executionLimit) {
735 var encryptedBlock;
736 var i,c;
737
738 self.incrementNonce(nonce);
739 encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce);
740
741 if ((executionLimit - messageIndex) > blockSize) {
742 c = blockSize;
743 } else {
744 c = executionLimit - messageIndex;
745 }
746
747 for (i=0; i<c; i++) {
748 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
749 }
750
751 messageIndex += blockSize;
752 }
753 anExecutionContext.setExecutionStep(messageIndex);
754 endTime = new Date();
755 anExecutionContext.tuneExecutionParameters(endTime - startTime);
756
757 return anExecutionContext;
758 },
759
760 //-----------------------------------------------------------------------------
761/*
762 'deferredEncryptBlocks': function(anExecutionContext) {
763 vardeferredResult;
764 varmessageSize;
765 var i,c;
766
767 messageSize = anExecutionContext.messageLength();
768
769 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncryptBloks");
770
771 c = Math.ceil(messageSize / anExecutionContext.elaborationChunkSize());
772 for (i=0; i<c; i++) {
773 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptExecutionChunk);
774 deferredResult.addMethod(anExecutionContext, 'pause');
775 }
776
777 deferredResult.callback(anExecutionContext);
778
779 return deferredResult;
780 },
781*/
782
783 'deferredEncryptBlocks': function(anExecutionContext) {
784 vardeferredResult;
785
786 if (! anExecutionContext.isDone()) {
787 deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES.deferredEncryptBloks", [
788 Clipperz.Crypto.AES.deferredEncryptExecutionChunk,
789 MochiKit.Base.method(anExecutionContext, 'pause'),
790 Clipperz.Crypto.AES.deferredEncryptBlocks
791 ], {trace:false}, anExecutionContext);
792 } else {
793 deferredResult = MochiKit.Async.succeed(anExecutionContext);
794 }
795
796 return deferredResult;
797 },
798
799 //-----------------------------------------------------------------------------
800
801 'deferredEncrypt': function(aKey, someData, aNonce) {
802 var deferredResult;
803 varexecutionContext;
804 var result;
805 var nonce;
806 var key;
807
808 key = new Clipperz.Crypto.AES.Key({key:aKey});
809 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
810
811 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:someData, nonce:nonce});
812
813 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt");
814//deferredResult.addCallback(function (aValue) { console.log(">>> deferredEncrypt"); return aValue; });
815 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
816 deferredResult.addCallback(function(anExecutionContext) {
817 var result;
818
819 result = anExecutionContext.nonce().clone();
820 result.appendBytes(anExecutionContext.resultArray());
821
822 return result;
823 });
824//deferredResult.addCallback(function (aValue) { console.log("<<< deferredEncrypt"); return aValue; });
825 deferredResult.callback(executionContext)
826
827 return deferredResult;
828 },
829
830 //-----------------------------------------------------------------------------
831
832 'deferredDecrypt': function(aKey, someData) {
833 var deferredResult
834 var nonce;
835 var message;
836 var key;
837
838 key = new Clipperz.Crypto.AES.Key({key:aKey});
839 nonce = someData.split(0, (128/8));
840 message = someData.split(128/8);
841 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:message, nonce:nonce});
842
843 deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt");
844//deferredResult.addCallback(function (aValue) { console.log(">>> deferredDecrypt"); return aValue; });
845 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
846 deferredResult.addCallback(function(anExecutionContext) {
847 return anExecutionContext.result();
848 });
849//deferredResult.addCallback(function (aValue) { console.log("<<< deferredDecrypt"); return aValue; });
850 deferredResult.callback(executionContext);
851
852 return deferredResult;
853 },
854
855 //-----------------------------------------------------------------------------
856 __syntaxFix__: "syntax fix"
857
858});
859
860//#############################################################################
861
862//Clipperz.Crypto.AES.DeferredExecution = {
863 // 'chunkSize': 16384, // 4096, // 1024 4096 8192 1638432768;
864 // 'pauseTime': 0.02 //0.2
865//}
866
867Clipperz.Crypto.AES.exception = {
868 'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES.exception.UnsupportedKeySize")
869};
diff --git a/frontend/gamma/js/Clipperz/Crypto/Base.js b/frontend/gamma/js/Clipperz/Crypto/Base.js
new file mode 100644
index 0000000..b69dcc8
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/Base.js
@@ -0,0 +1,1852 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.Base) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.Base depends on Clipperz.Base!";
31}
32
33if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
34if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; }
35
36Clipperz.Crypto.Base.VERSION = "0.1";
37Clipperz.Crypto.Base.NAME = "Clipperz.Crypto.Base";
38
39//#############################################################################
40 //Downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip (jsSha2/sha256.js)
41//#############################################################################
42
43/* A JavaScript implementation of the Secure Hash Algorithm, SHA-256
44 * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
45 * Distributed under the BSD License
46 * Some bits taken from Paul Johnston's SHA-1 implementation
47 */
48var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
49function safe_add (x, y) {
50 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
51 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
52 return (msw << 16) | (lsw & 0xFFFF);
53}
54function S (X, n) {return ( X >>> n ) | (X << (32 - n));}
55function R (X, n) {return ( X >>> n );}
56function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
57function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
58function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));}
59function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));}
60function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));}
61function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));}
62function core_sha256 (m, l) {
63 var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
64 var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
65 var W = new Array(64);
66 var a, b, c, d, e, f, g, h, i, j;
67 var T1, T2;
68 /* append padding */
69 m[l >> 5] |= 0x80 << (24 - l % 32);
70 m[((l + 64 >> 9) << 4) + 15] = l;
71 for ( var i = 0; i<m.length; i+=16 ) {
72 a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7];
73 for ( var j = 0; j<64; j++) {
74 if (j < 16) W[j] = m[j + i];
75 else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
76 T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
77 T2 = safe_add(Sigma0256(a), Maj(a, b, c));
78 h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2);
79 }
80 HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]);
81 }
82 return HASH;
83}
84function str2binb (str) {
85 var bin = Array();
86 var mask = (1 << chrsz) - 1;
87 for(var i = 0; i < str.length * chrsz; i += chrsz)
88 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
89 return bin;
90}
91function binb2hex (binarray) {
92 var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
93 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
94 var str = "";
95 for (var i = 0; i < binarray.length * 4; i++) {
96 str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
97 }
98 return str;
99}
100function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));}
101
102
103
104//#############################################################################
105 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (entropy.js)
106//#############################################################################
107
108 // Entropy collection utilities
109
110 /*Start by declaring static storage and initialise
111 the entropy vector from the time we come through
112 here. */
113
114 var entropyData = new Array(); // Collected entropy data
115 var edlen = 0; // Keyboard array data length
116
117 addEntropyTime(); // Start entropy collection with page load time
118 ce(); // Roll milliseconds into initial entropy
119
120 //Add a byte to the entropy vector
121
122 function addEntropyByte(b) {
123 entropyData[edlen++] = b;
124 }
125
126 /*Capture entropy. When the user presses a key or performs
127 various other events for which we can request
128 notification, add the time in 255ths of a second to the
129 entropyData array. The name of the function is short
130 so it doesn't bloat the form object declarations in
131 which it appears in various "onXXX" events. */
132
133 function ce() {
134 addEntropyByte(Math.floor((((new Date).getMilliseconds()) * 255) / 999));
135 }
136
137 //Add a 32 bit quantity to the entropy vector
138
139 function addEntropy32(w) {
140 var i;
141
142 for (i = 0; i < 4; i++) {
143 addEntropyByte(w & 0xFF);
144 w >>= 8;
145 }
146 }
147
148 /*Add the current time and date (milliseconds since the epoch,
149 truncated to 32 bits) to the entropy vector. */
150
151 function addEntropyTime() {
152 addEntropy32((new Date()).getTime());
153 }
154
155 /* Start collection of entropy from mouse movements. The
156 argument specifies the number of entropy items to be
157 obtained from mouse motion, after which mouse motion
158 will be ignored. Note that you can re-enable mouse
159 motion collection at any time if not already underway. */
160
161 var mouseMotionCollect = 0;
162 var oldMoveHandler; // For saving and restoring mouse move handler in IE4
163
164 function mouseMotionEntropy(maxsamp) {
165 if (mouseMotionCollect <= 0) {
166 mouseMotionCollect = maxsamp;
167 if ((document.implementation.hasFeature("Events", "2.0")) &&
168 document.addEventListener) {
169 // Browser supports Document Object Model (DOM) 2 events
170 document.addEventListener("mousemove", mouseMoveEntropy, false);
171 } else {
172 if (document.attachEvent) {
173 // Internet Explorer 5 and above event model
174 document.attachEvent("onmousemove", mouseMoveEntropy);
175 } else {
176 //Internet Explorer 4 event model
177 oldMoveHandler = document.onmousemove;
178 document.onmousemove = mouseMoveEntropy;
179 }
180 }
181//dump("Mouse enable", mouseMotionCollect);
182 }
183 }
184
185 /*Collect entropy from mouse motion events. Note that
186 this is craftily coded to work with either DOM2 or Internet
187 Explorer style events. Note that we don't use every successive
188 mouse movement event. Instead, we XOR the three bytes collected
189 from the mouse and use that to determine how many subsequent
190 mouse movements we ignore before capturing the next one. */
191
192 var mouseEntropyTime = 0; // Delay counter for mouse entropy collection
193
194 function mouseMoveEntropy(e) {
195 if (!e) {
196 e = window.event; // Internet Explorer event model
197 }
198 if (mouseMotionCollect > 0) {
199 if (mouseEntropyTime-- <= 0) {
200 addEntropyByte(e.screenX & 0xFF);
201 addEntropyByte(e.screenY & 0xFF);
202 ce();
203 mouseMotionCollect--;
204 mouseEntropyTime = (entropyData[edlen - 3] ^ entropyData[edlen - 2] ^
205 entropyData[edlen - 1]) % 19;
206//dump("Mouse Move", byteArrayToHex(entropyData.slice(-3)));
207 }
208 if (mouseMotionCollect <= 0) {
209 if (document.removeEventListener) {
210 document.removeEventListener("mousemove", mouseMoveEntropy, false);
211 } else if (document.detachEvent) {
212 document.detachEvent("onmousemove", mouseMoveEntropy);
213 } else {
214 document.onmousemove = oldMoveHandler;
215 }
216//dump("Spung!", 0);
217 }
218 }
219 }
220
221 /*Compute a 32 byte key value from the entropy vector.
222 We compute the value by taking the MD5 sum of the even
223 and odd bytes respectively of the entropy vector, then
224 concatenating the two MD5 sums. */
225
226 function keyFromEntropy() {
227 var i, k = new Array(32);
228
229 if (edlen == 0) {
230 alert("Blooie! Entropy vector void at call to keyFromEntropy.");
231 }
232//dump("Entropy bytes", edlen);
233
234 md5_init();
235 for (i = 0; i < edlen; i += 2) {
236 md5_update(entropyData[i]);
237 }
238 md5_finish();
239 for (i = 0; i < 16; i++) {
240 k[i] = digestBits[i];
241 }
242
243 md5_init();
244 for (i = 1; i < edlen; i += 2) {
245 md5_update(entropyData[i]);
246 }
247 md5_finish();
248 for (i = 0; i < 16; i++) {
249 k[i + 16] = digestBits[i];
250 }
251
252//dump("keyFromEntropy", byteArrayToHex(k));
253 return k;
254 }
255
256//#############################################################################
257 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aesprng.js)
258//#############################################################################
259
260
261 // AES based pseudorandom number generator
262
263 /* Constructor. Called with an array of 32 byte (0-255) values
264 containing the initial seed. */
265
266 function AESprng(seed) {
267 this.key = new Array();
268 this.key = seed;
269 this.itext = hexToByteArray("9F489613248148F9C27945C6AE62EECA3E3367BB14064E4E6DC67A9F28AB3BD1");
270 this.nbytes = 0; // Bytes left in buffer
271
272 this.next = AESprng_next;
273 this.nextbits = AESprng_nextbits;
274 this.nextInt = AESprng_nextInt;
275 this.round = AESprng_round;
276
277 /* Encrypt the initial text with the seed key
278 three times, feeding the output of the encryption
279 back into the key for the next round. */
280
281 bsb = blockSizeInBits;
282 blockSizeInBits = 256;
283 var i, ct;
284 for (i = 0; i < 3; i++) {
285 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
286 }
287
288 /* Now make between one and four additional
289 key-feedback rounds, with the number determined
290 by bits from the result of the first three
291 rounds. */
292
293 var n = 1 + (this.key[3] & 2) + (this.key[9] & 1);
294 for (i = 0; i < n; i++) {
295 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
296 }
297 blockSizeInBits = bsb;
298 }
299
300 function AESprng_round() {
301 bsb = blockSizeInBits;
302 blockSizeInBits = 256;
303 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
304 this.nbytes = 32;
305 blockSizeInBits = bsb;
306 }
307
308 //Return next byte from the generator
309
310 function AESprng_next() {
311 if (this.nbytes <= 0) {
312 this.round();
313 }
314 return(this.key[--this.nbytes]);
315 }
316
317 //Return n bit integer value (up to maximum integer size)
318
319 function AESprng_nextbits(n) {
320 var i, w = 0, nbytes = Math.floor((n + 7) / 8);
321
322 for (i = 0; i < nbytes; i++) {
323 w = (w << 8) | this.next();
324 }
325 return w & ((1 << n) - 1);
326 }
327
328 // Return integer between 0 and n inclusive
329
330 function AESprng_nextInt(n) {
331 var p = 1, nb = 0;
332
333 // Determine smallest p, 2^p > n
334 // nb = log_2 p
335
336 while (n >= p) {
337 p <<= 1;
338 nb++;
339 }
340 p--;
341
342 /* Generate values from 0 through n by first generating
343 values v from 0 to (2^p)-1, then discarding any results v > n.
344 For the rationale behind this (and why taking
345 values mod (n + 1) is biased toward smaller values, see
346 Ferguson and Schneier, "Practical Cryptography",
347 ISBN 0-471-22357-3, section 10.8). */
348
349 while (true) {
350 var v = this.nextbits(nb) & p;
351
352 if (v <= n) {
353 return v;
354 }
355 }
356 }
357
358//#############################################################################
359 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (md5.js)
360//#############################################################################
361
362/*
363 * md5.jvs 1.0b 27/06/96
364 *
365 * Javascript implementation of the RSA Data Security, Inc. MD5
366 * Message-Digest Algorithm.
367 *
368 * Copyright (c) 1996 Henri Torgemane. All Rights Reserved.
369 *
370 * Permission to use, copy, modify, and distribute this software
371 * and its documentation for any purposes and without
372 * fee is hereby granted provided that this copyright notice
373 * appears in all copies.
374 *
375 * Of course, this soft is provided "as is" without express or implied
376 * warranty of any kind.
377
378 This version contains some trivial reformatting modifications
379 by John Walker.
380
381 */
382
383function array(n) {
384 for (i = 0; i < n; i++) {
385 this[i] = 0;
386 }
387 this.length = n;
388}
389
390/* Some basic logical functions had to be rewritten because of a bug in
391 * Javascript.. Just try to compute 0xffffffff >> 4 with it..
392 * Of course, these functions are slower than the original would be, but
393 * at least, they work!
394 */
395
396function integer(n) {
397 return n % (0xffffffff + 1);
398}
399
400function shr(a, b) {
401 a = integer(a);
402 b = integer(b);
403 if (a - 0x80000000 >= 0) {
404 a = a % 0x80000000;
405 a >>= b;
406 a += 0x40000000 >> (b - 1);
407 } else {
408 a >>= b;
409 }
410 return a;
411}
412
413function shl1(a) {
414 a = a % 0x80000000;
415 if (a & 0x40000000 == 0x40000000) {
416 a -= 0x40000000;
417 a *= 2;
418 a += 0x80000000;
419 } else {
420 a *= 2;
421 }
422 return a;
423}
424
425function shl(a, b) {
426 a = integer(a);
427 b = integer(b);
428 for (var i = 0; i < b; i++) {
429 a = shl1(a);
430 }
431 return a;
432}
433
434function and(a, b) {
435 a = integer(a);
436 b = integer(b);
437 var t1 = a - 0x80000000;
438 var t2 = b - 0x80000000;
439 if (t1 >= 0) {
440 if (t2 >= 0) {
441 return ((t1 & t2) + 0x80000000);
442 } else {
443 return (t1 & b);
444 }
445 } else {
446 if (t2 >= 0) {
447 return (a & t2);
448 } else {
449 return (a & b);
450 }
451 }
452}
453
454function or(a, b) {
455 a = integer(a);
456 b = integer(b);
457 var t1 = a - 0x80000000;
458 var t2 = b - 0x80000000;
459 if (t1 >= 0) {
460 if (t2 >= 0) {
461 return ((t1 | t2) + 0x80000000);
462 } else {
463 return ((t1 | b) + 0x80000000);
464 }
465 } else {
466 if (t2 >= 0) {
467 return ((a | t2) + 0x80000000);
468 } else {
469 return (a | b);
470 }
471 }
472}
473
474function xor(a, b) {
475 a = integer(a);
476 b = integer(b);
477 var t1 = a - 0x80000000;
478 var t2 = b - 0x80000000;
479 if (t1 >= 0) {
480 if (t2 >= 0) {
481 return (t1 ^ t2);
482 } else {
483 return ((t1 ^ b) + 0x80000000);
484 }
485 } else {
486 if (t2 >= 0) {
487 return ((a ^ t2) + 0x80000000);
488 } else {
489 return (a ^ b);
490 }
491 }
492}
493
494function not(a) {
495 a = integer(a);
496 return 0xffffffff - a;
497}
498
499/* Here begin the real algorithm */
500
501var state = new array(4);
502var count = new array(2);
503 count[0] = 0;
504 count[1] = 0;
505var buffer = new array(64);
506var transformBuffer = new array(16);
507var digestBits = new array(16);
508
509var S11 = 7;
510var S12 = 12;
511var S13 = 17;
512var S14 = 22;
513var S21 = 5;
514var S22 = 9;
515var S23 = 14;
516var S24 = 20;
517var S31 = 4;
518var S32 = 11;
519var S33 = 16;
520var S34 = 23;
521var S41 = 6;
522var S42 = 10;
523var S43 = 15;
524var S44 = 21;
525
526function F(x, y, z) {
527 return or(and(x, y), and(not(x), z));
528}
529
530function G(x, y, z) {
531 return or(and(x, z), and(y, not(z)));
532}
533
534function H(x, y, z) {
535 return xor(xor(x, y), z);
536}
537
538function I(x, y, z) {
539 return xor(y ,or(x , not(z)));
540}
541
542function rotateLeft(a, n) {
543 return or(shl(a, n), (shr(a, (32 - n))));
544}
545
546function FF(a, b, c, d, x, s, ac) {
547 a = a + F(b, c, d) + x + ac;
548 a = rotateLeft(a, s);
549 a = a + b;
550 return a;
551}
552
553function GG(a, b, c, d, x, s, ac) {
554 a = a + G(b, c, d) + x + ac;
555 a = rotateLeft(a, s);
556 a = a + b;
557 return a;
558}
559
560function HH(a, b, c, d, x, s, ac) {
561 a = a + H(b, c, d) + x + ac;
562 a = rotateLeft(a, s);
563 a = a + b;
564 return a;
565}
566
567function II(a, b, c, d, x, s, ac) {
568 a = a + I(b, c, d) + x + ac;
569 a = rotateLeft(a, s);
570 a = a + b;
571 return a;
572}
573
574function transform(buf, offset) {
575 var a = 0, b = 0, c = 0, d = 0;
576 var x = transformBuffer;
577
578 a = state[0];
579 b = state[1];
580 c = state[2];
581 d = state[3];
582
583 for (i = 0; i < 16; i++) {
584 x[i] = and(buf[i * 4 + offset], 0xFF);
585 for (j = 1; j < 4; j++) {
586 x[i] += shl(and(buf[i * 4 + j + offset] ,0xFF), j * 8);
587 }
588 }
589
590 /* Round 1 */
591 a = FF( a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
592 d = FF( d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
593 c = FF( c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
594 b = FF( b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
595 a = FF( a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
596 d = FF( d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
597 c = FF( c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
598 b = FF( b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
599 a = FF( a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
600 d = FF( d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
601 c = FF( c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
602 b = FF( b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
603 a = FF( a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
604 d = FF( d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
605 c = FF( c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
606 b = FF( b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
607
608 /* Round 2 */
609 a = GG( a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
610 d = GG( d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
611 c = GG( c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
612 b = GG( b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
613 a = GG( a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
614 d = GG( d, a, b, c, x[10], S22, 0x2441453); /* 22 */
615 c = GG( c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
616 b = GG( b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
617 a = GG( a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
618 d = GG( d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
619 c = GG( c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
620 b = GG( b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
621 a = GG( a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
622 d = GG( d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
623 c = GG( c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
624 b = GG( b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
625
626 /* Round 3 */
627 a = HH( a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
628 d = HH( d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
629 c = HH( c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
630 b = HH( b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
631 a = HH( a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
632 d = HH( d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
633 c = HH( c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
634 b = HH( b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
635 a = HH( a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
636 d = HH( d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
637 c = HH( c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
638 b = HH( b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
639 a = HH( a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
640 d = HH( d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
641 c = HH( c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
642 b = HH( b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
643
644 /* Round 4 */
645 a = II( a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
646 d = II( d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
647 c = II( c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
648 b = II( b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
649 a = II( a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
650 d = II( d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
651 c = II( c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
652 b = II( b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
653 a = II( a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
654 d = II( d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
655 c = II( c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
656 b = II( b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
657 a = II( a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
658 d = II( d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
659 c = II( c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
660 b = II( b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
661
662 state[0] += a;
663 state[1] += b;
664 state[2] += c;
665 state[3] += d;
666
667}
668
669function md5_init() {
670 count[0] = count[1] = 0;
671 state[0] = 0x67452301;
672 state[1] = 0xefcdab89;
673 state[2] = 0x98badcfe;
674 state[3] = 0x10325476;
675 for (i = 0; i < digestBits.length; i++) {
676 digestBits[i] = 0;
677 }
678}
679
680function md5_update(b) {
681 var index, i;
682
683 index = and(shr(count[0],3) , 0x3F);
684 if (count[0] < 0xFFFFFFFF - 7) {
685 count[0] += 8;
686 } else {
687 count[1]++;
688 count[0] -= 0xFFFFFFFF + 1;
689 count[0] += 8;
690 }
691 buffer[index] = and(b, 0xff);
692 if (index >= 63) {
693 transform(buffer, 0);
694 }
695}
696
697function md5_finish() {
698 var bits = new array(8);
699 var padding;
700 var i = 0, index = 0, padLen = 0;
701
702 for (i = 0; i < 4; i++) {
703 bits[i] = and(shr(count[0], (i * 8)), 0xFF);
704 }
705 for (i = 0; i < 4; i++) {
706 bits[i + 4] = and(shr(count[1], (i * 8)), 0xFF);
707 }
708 index = and(shr(count[0], 3), 0x3F);
709 padLen = (index < 56) ? (56 - index) : (120 - index);
710 padding = new array(64);
711 padding[0] = 0x80;
712 for (i = 0; i < padLen; i++) {
713 md5_update(padding[i]);
714 }
715 for (i = 0; i < 8; i++) {
716 md5_update(bits[i]);
717 }
718
719 for (i = 0; i < 4; i++) {
720 for (j = 0; j < 4; j++) {
721 digestBits[i * 4 + j] = and(shr(state[i], (j * 8)) , 0xFF);
722 }
723 }
724}
725
726/* End of the MD5 algorithm */
727
728//#############################################################################
729 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aes.js)
730//#############################################################################
731
732
733/* rijndael.js Rijndael Reference Implementation
734
735 This is a modified version of the software described below,
736 produced in September 2003 by John Walker for use in the
737 JavsScrypt browser-based encryption package. The principal
738 changes are replacing the original getRandomBytes function with
739 one which calls our pseudorandom generator (which must
740 be instantiated and seeded before the first call on getRandomBytes),
741 and changing keySizeInBits to 256. Some code not required by the
742 JavsScrypt application has been commented out. Please see
743 http://www.fourmilab.ch/javascrypt/ for further information on
744 JavaScrypt.
745
746 The following is the original copyright and application
747 information.
748
749 Copyright (c) 2001 Fritz Schneider
750
751 This software is provided as-is, without express or implied warranty.
752 Permission to use, copy, modify, distribute or sell this software, with or
753 without fee, for any purpose and by any individual or organization, is hereby
754 granted, provided that the above copyright notice and this paragraph appear
755 in all copies. Distribution as a part of an application or binary must
756 include the above copyright notice in the documentation and/or other materials
757 provided with the application or distribution.
758
759 As the above disclaimer notes, you are free to use this code however you
760 want. However, I would request that you send me an email
761 (fritz /at/ cs /dot/ ucsd /dot/ edu) to say hi if you find this code useful
762 or instructional. Seeing that people are using the code acts as
763 encouragement for me to continue development. If you *really* want to thank
764 me you can buy the book I wrote with Thomas Powell, _JavaScript:
765 _The_Complete_Reference_ :)
766
767 This code is an UNOPTIMIZED REFERENCE implementation of Rijndael.
768 If there is sufficient interest I can write an optimized (word-based,
769 table-driven) version, although you might want to consider using a
770 compiled language if speed is critical to your application. As it stands,
771 one run of the monte carlo test (10,000 encryptions) can take up to
772 several minutes, depending upon your processor. You shouldn't expect more
773 than a few kilobytes per second in throughput.
774
775 Also note that there is very little error checking in these functions.
776 Doing proper error checking is always a good idea, but the ideal
777 implementation (using the instanceof operator and exceptions) requires
778 IE5+/NS6+, and I've chosen to implement this code so that it is compatible
779 with IE4/NS4.
780
781 And finally, because JavaScript doesn't have an explicit byte/char data
782 type (although JavaScript 2.0 most likely will), when I refer to "byte"
783 in this code I generally mean "32 bit integer with value in the interval
784 [0,255]" which I treat as a byte.
785
786 See http://www-cse.ucsd.edu/~fritz/rijndael.html for more documentation
787 of the (very simple) API provided by this code.
788
789 Fritz Schneider
790 fritz at cs.ucsd.edu
791
792*/
793
794
795// Rijndael parameters -- Valid values are 128, 192, or 256
796
797var keySizeInBits = 256;
798var blockSizeInBits = 128;
799
800//
801// Note: in the following code the two dimensional arrays are indexed as
802// you would probably expect, as array[row][column]. The state arrays
803// are 2d arrays of the form state[4][Nb].
804
805
806// The number of rounds for the cipher, indexed by [Nk][Nb]
807var roundsArray = [ ,,,,[,,,,10,, 12,, 14],,
808 [,,,,12,, 12,, 14],,
809 [,,,,14,, 14,, 14] ];
810
811// The number of bytes to shift by in shiftRow, indexed by [Nb][row]
812var shiftOffsets = [ ,,,,[,1, 2, 3],,[,1, 2, 3],,[,1, 3, 4] ];
813
814// The round constants used in subkey expansion
815var Rcon = [
8160x01, 0x02, 0x04, 0x08, 0x10, 0x20,
8170x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
8180xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
8190x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4,
8200xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ];
821
822// Precomputed lookup table for the SBox
823var SBox = [
824 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171,
825118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164,
826114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113,
827216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226,
828235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214,
829179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203,
830190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69,
831249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245,
832188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68,
83323, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42,
834144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73,
835 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109,
836141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37,
837 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62,
838181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225,
839248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
840140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187,
841 22 ];
842
843// Precomputed lookup table for the inverse SBox
844var SBoxInverse = [
845 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215,
846251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222,
847233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66,
848250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73,
849109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92,
850204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21,
851 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247,
852228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2,
853193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220,
854234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173,
855 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29,
856 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75,
857198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168,
858 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81,
859127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160,
860224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97,
861 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12,
862125 ];
863
864// This method circularly shifts the array left by the number of elements
865// given in its parameter. It returns the resulting array and is used for
866// the ShiftRow step. Note that shift() and push() could be used for a more
867// elegant solution, but they require IE5.5+, so I chose to do it manually.
868
869function cyclicShiftLeft(theArray, positions) {
870 var temp = theArray.slice(0, positions);
871 theArray = theArray.slice(positions).concat(temp);
872 return theArray;
873}
874
875// Cipher parameters ... do not change these
876var Nk = keySizeInBits / 32;
877var Nb = blockSizeInBits / 32;
878var Nr = roundsArray[Nk][Nb];
879
880// Multiplies the element "poly" of GF(2^8) by x. See the Rijndael spec.
881
882function xtime(poly) {
883 poly <<= 1;
884 return ((poly & 0x100) ? (poly ^ 0x11B) : (poly));
885}
886
887// Multiplies the two elements of GF(2^8) together and returns the result.
888// See the Rijndael spec, but should be straightforward: for each power of
889// the indeterminant that has a 1 coefficient in x, add y times that power
890// to the result. x and y should be bytes representing elements of GF(2^8)
891
892function mult_GF256(x, y) {
893 var bit, result = 0;
894
895 for (bit = 1; bit < 256; bit *= 2, y = xtime(y)) {
896 if (x & bit)
897 result ^= y;
898 }
899 return result;
900}
901
902// Performs the substitution step of the cipher. State is the 2d array of
903// state information (see spec) and direction is string indicating whether
904// we are performing the forward substitution ("encrypt") or inverse
905// substitution (anything else)
906
907function byteSub(state, direction) {
908 var S;
909 if (direction == "encrypt") // Point S to the SBox we're using
910 S = SBox;
911 else
912 S = SBoxInverse;
913 for (var i = 0; i < 4; i++) // Substitute for every byte in state
914 for (var j = 0; j < Nb; j++)
915 state[i][j] = S[state[i][j]];
916}
917
918// Performs the row shifting step of the cipher.
919
920function shiftRow(state, direction) {
921 for (var i=1; i<4; i++) // Row 0 never shifts
922 if (direction == "encrypt")
923 state[i] = cyclicShiftLeft(state[i], shiftOffsets[Nb][i]);
924 else
925 state[i] = cyclicShiftLeft(state[i], Nb - shiftOffsets[Nb][i]);
926
927}
928
929// Performs the column mixing step of the cipher. Most of these steps can
930// be combined into table lookups on 32bit values (at least for encryption)
931// to greatly increase the speed.
932
933function mixColumn(state, direction) {
934 var b = []; // Result of matrix multiplications
935 for (var j = 0; j < Nb; j++) { // Go through each column...
936 for (var i = 0; i < 4; i++) { // and for each row in the column...
937 if (direction == "encrypt")
938 b[i] = mult_GF256(state[i][j], 2) ^ // perform mixing
939 mult_GF256(state[(i+1)%4][j], 3) ^
940 state[(i+2)%4][j] ^
941 state[(i+3)%4][j];
942 else
943 b[i] = mult_GF256(state[i][j], 0xE) ^
944 mult_GF256(state[(i+1)%4][j], 0xB) ^
945 mult_GF256(state[(i+2)%4][j], 0xD) ^
946 mult_GF256(state[(i+3)%4][j], 9);
947 }
948 for (var i = 0; i < 4; i++) // Place result back into column
949 state[i][j] = b[i];
950 }
951}
952
953// Adds the current round key to the state information. Straightforward.
954
955function addRoundKey(state, roundKey) {
956 for (var j = 0; j < Nb; j++) { // Step through columns...
957 state[0][j] ^= (roundKey[j] & 0xFF); // and XOR
958 state[1][j] ^= ((roundKey[j]>>8) & 0xFF);
959 state[2][j] ^= ((roundKey[j]>>16) & 0xFF);
960 state[3][j] ^= ((roundKey[j]>>24) & 0xFF);
961 }
962}
963
964// This function creates the expanded key from the input (128/192/256-bit)
965// key. The parameter key is an array of bytes holding the value of the key.
966// The returned value is an array whose elements are the 32-bit words that
967// make up the expanded key.
968
969function keyExpansion(key) {
970 var expandedKey = new Array();
971 var temp;
972
973 // in case the key size or parameters were changed...
974 Nk = keySizeInBits / 32;
975 Nb = blockSizeInBits / 32;
976 Nr = roundsArray[Nk][Nb];
977
978 for (var j=0; j < Nk; j++) // Fill in input key first
979 expandedKey[j] =
980 (key[4*j]) | (key[4*j+1]<<8) | (key[4*j+2]<<16) | (key[4*j+3]<<24);
981
982 // Now walk down the rest of the array filling in expanded key bytes as
983 // per Rijndael's spec
984 for (j = Nk; j < Nb * (Nr + 1); j++) { // For each word of expanded key
985 temp = expandedKey[j - 1];
986 if (j % Nk == 0)
987 temp = ( (SBox[(temp>>8) & 0xFF]) |
988 (SBox[(temp>>16) & 0xFF]<<8) |
989 (SBox[(temp>>24) & 0xFF]<<16) |
990 (SBox[temp & 0xFF]<<24) ) ^ Rcon[Math.floor(j / Nk) - 1];
991 else if (Nk > 6 && j % Nk == 4)
992 temp = (SBox[(temp>>24) & 0xFF]<<24) |
993 (SBox[(temp>>16) & 0xFF]<<16) |
994 (SBox[(temp>>8) & 0xFF]<<8) |
995 (SBox[temp & 0xFF]);
996 expandedKey[j] = expandedKey[j-Nk] ^ temp;
997 }
998 return expandedKey;
999}
1000
1001// Rijndael's round functions...
1002
1003function Round(state, roundKey) {
1004 byteSub(state, "encrypt");
1005 shiftRow(state, "encrypt");
1006 mixColumn(state, "encrypt");
1007 addRoundKey(state, roundKey);
1008}
1009
1010function InverseRound(state, roundKey) {
1011 addRoundKey(state, roundKey);
1012 mixColumn(state, "decrypt");
1013 shiftRow(state, "decrypt");
1014 byteSub(state, "decrypt");
1015}
1016
1017function FinalRound(state, roundKey) {
1018 byteSub(state, "encrypt");
1019 shiftRow(state, "encrypt");
1020 addRoundKey(state, roundKey);
1021}
1022
1023function InverseFinalRound(state, roundKey){
1024 addRoundKey(state, roundKey);
1025 shiftRow(state, "decrypt");
1026 byteSub(state, "decrypt");
1027}
1028
1029// encrypt is the basic encryption function. It takes parameters
1030// block, an array of bytes representing a plaintext block, and expandedKey,
1031// an array of words representing the expanded key previously returned by
1032// keyExpansion(). The ciphertext block is returned as an array of bytes.
1033
1034function encrypt(block, expandedKey) {
1035 var i;
1036 if (!block || block.length*8 != blockSizeInBits)
1037 return;
1038 if (!expandedKey)
1039 return;
1040
1041 block = packBytes(block);
1042 addRoundKey(block, expandedKey);
1043 for (i=1; i<Nr; i++)
1044 Round(block, expandedKey.slice(Nb*i, Nb*(i+1)));
1045 FinalRound(block, expandedKey.slice(Nb*Nr));
1046 return unpackBytes(block);
1047}
1048
1049// decrypt is the basic decryption function. It takes parameters
1050// block, an array of bytes representing a ciphertext block, and expandedKey,
1051// an array of words representing the expanded key previously returned by
1052// keyExpansion(). The decrypted block is returned as an array of bytes.
1053
1054function decrypt(block, expandedKey) {
1055 var i;
1056 if (!block || block.length*8 != blockSizeInBits)
1057 return;
1058 if (!expandedKey)
1059 return;
1060
1061 block = packBytes(block);
1062 InverseFinalRound(block, expandedKey.slice(Nb*Nr));
1063 for (i = Nr - 1; i>0; i--)
1064 InverseRound(block, expandedKey.slice(Nb*i, Nb*(i+1)));
1065 addRoundKey(block, expandedKey);
1066 return unpackBytes(block);
1067}
1068
1069/* !NEEDED
1070// This method takes a byte array (byteArray) and converts it to a string by
1071// applying String.fromCharCode() to each value and concatenating the result.
1072// The resulting string is returned. Note that this function SKIPS zero bytes
1073// under the assumption that they are padding added in formatPlaintext().
1074// Obviously, do not invoke this method on raw data that can contain zero
1075// bytes. It is really only appropriate for printable ASCII/Latin-1
1076// values. Roll your own function for more robust functionality :)
1077
1078function byteArrayToString(byteArray) {
1079 var result = "";
1080 for(var i=0; i<byteArray.length; i++)
1081 if (byteArray[i] != 0)
1082 result += String.fromCharCode(byteArray[i]);
1083 return result;
1084}
1085*/
1086
1087// This function takes an array of bytes (byteArray) and converts them
1088// to a hexadecimal string. Array element 0 is found at the beginning of
1089// the resulting string, high nibble first. Consecutive elements follow
1090// similarly, for example [16, 255] --> "10ff". The function returns a
1091// string.
1092
1093function byteArrayToHex(byteArray) {
1094 var result = "";
1095 if (!byteArray)
1096 return;
1097 for (var i=0; i<byteArray.length; i++)
1098 result += ((byteArray[i]<16) ? "0" : "") + byteArray[i].toString(16);
1099
1100 return result;
1101}
1102
1103// This function converts a string containing hexadecimal digits to an
1104// array of bytes. The resulting byte array is filled in the order the
1105// values occur in the string, for example "10FF" --> [16, 255]. This
1106// function returns an array.
1107
1108function hexToByteArray(hexString) {
1109 var byteArray = [];
1110 if (hexString.length % 2) // must have even length
1111 return;
1112 if (hexString.indexOf("0x") == 0 || hexString.indexOf("0X") == 0)
1113 hexString = hexString.substring(2);
1114 for (var i = 0; i<hexString.length; i += 2)
1115 byteArray[Math.floor(i/2)] = parseInt(hexString.slice(i, i+2), 16);
1116 return byteArray;
1117}
1118
1119// This function packs an array of bytes into the four row form defined by
1120// Rijndael. It assumes the length of the array of bytes is divisible by
1121// four. Bytes are filled in according to the Rijndael spec (starting with
1122// column 0, row 0 to 3). This function returns a 2d array.
1123
1124function packBytes(octets) {
1125 var state = new Array();
1126 if (!octets || octets.length % 4)
1127 return;
1128
1129 state[0] = new Array(); state[1] = new Array();
1130 state[2] = new Array(); state[3] = new Array();
1131 for (var j=0; j<octets.length; j+= 4) {
1132 state[0][j/4] = octets[j];
1133 state[1][j/4] = octets[j+1];
1134 state[2][j/4] = octets[j+2];
1135 state[3][j/4] = octets[j+3];
1136 }
1137 return state;
1138}
1139
1140// This function unpacks an array of bytes from the four row format preferred
1141// by Rijndael into a single 1d array of bytes. It assumes the input "packed"
1142// is a packed array. Bytes are filled in according to the Rijndael spec.
1143// This function returns a 1d array of bytes.
1144
1145function unpackBytes(packed) {
1146 var result = new Array();
1147 for (var j=0; j<packed[0].length; j++) {
1148 result[result.length] = packed[0][j];
1149 result[result.length] = packed[1][j];
1150 result[result.length] = packed[2][j];
1151 result[result.length] = packed[3][j];
1152 }
1153 return result;
1154}
1155
1156// This function takes a prospective plaintext (string or array of bytes)
1157// and pads it with pseudorandom bytes if its length is not a multiple of the block
1158// size. If plaintext is a string, it is converted to an array of bytes
1159// in the process. The type checking can be made much nicer using the
1160// instanceof operator, but this operator is not available until IE5.0 so I
1161// chose to use the heuristic below.
1162
1163function formatPlaintext(plaintext) {
1164 var bpb = blockSizeInBits / 8; // bytes per block
1165 var fillWithRandomBits;
1166 var i;
1167
1168 // if primitive string or String instance
1169 if ((!((typeof plaintext == "object") &&
1170 ((typeof (plaintext[0])) == "number"))) &&
1171 ((typeof plaintext == "string") || plaintext.indexOf))
1172 {
1173 plaintext = plaintext.split("");
1174 // Unicode issues here (ignoring high byte)
1175 for (i=0; i<plaintext.length; i++) {
1176 plaintext[i] = plaintext[i].charCodeAt(0) & 0xFF;
1177 }
1178 }
1179
1180 i = plaintext.length % bpb;
1181 if (i > 0) {
1182//alert("adding " + (bpb - 1) + " bytes");
1183 // plaintext = plaintext.concat(getRandomBytes(bpb - i));
1184 {
1185 varpaddingBytes;
1186 var ii,cc;
1187
1188 paddingBytes = new Array();
1189 cc = bpb - i;
1190 for (ii=0; ii<cc; ii++) {
1191 paddingBytes[ii] = cc;
1192 }
1193
1194//is("cc", cc);
1195//is(getRandomBytes(bpb - i) + "", paddingBytes + "");
1196 plaintext = plaintext.concat(paddingBytes);
1197 }
1198 }
1199
1200 return plaintext;
1201}
1202
1203// Returns an array containing "howMany" random bytes.
1204
1205function getRandomBytes(howMany) {
1206 var i, bytes = new Array();
1207
1208//alert("getting some random bytes");
1209 for (i = 0; i < howMany; i++) {
1210 bytes[i] = prng.nextInt(255);
1211 }
1212 return bytes;
1213}
1214
1215// rijndaelEncrypt(plaintext, key, mode)
1216// Encrypts the plaintext using the given key and in the given mode.
1217// The parameter "plaintext" can either be a string or an array of bytes.
1218// The parameter "key" must be an array of key bytes. If you have a hex
1219// string representing the key, invoke hexToByteArray() on it to convert it
1220// to an array of bytes. The third parameter "mode" is a string indicating
1221// the encryption mode to use, either "ECB" or "CBC". If the parameter is
1222// omitted, ECB is assumed.
1223//
1224// An array of bytes representing the cihpertext is returned. To convert
1225// this array to hex, invoke byteArrayToHex() on it.
1226
1227function rijndaelEncrypt(plaintext, key, mode) {
1228 var expandedKey, i, aBlock;
1229 var bpb = blockSizeInBits / 8; // bytes per block
1230 var ct; // ciphertext
1231
1232 if (!plaintext || !key)
1233 return;
1234 if (key.length*8 != keySizeInBits)
1235 return;
1236 if (mode == "CBC") {
1237 ct = getRandomBytes(bpb); // get IV
1238//dump("IV", byteArrayToHex(ct));
1239 } else {
1240 mode = "ECB";
1241 ct = new Array();
1242 }
1243
1244 // convert plaintext to byte array and pad with zeros if necessary.
1245 plaintext = formatPlaintext(plaintext);
1246
1247 expandedKey = keyExpansion(key);
1248
1249 for (var block = 0; block < plaintext.length / bpb; block++) {
1250 aBlock = plaintext.slice(block * bpb, (block + 1) * bpb);
1251 if (mode == "CBC") {
1252 for (var i = 0; i < bpb; i++) {
1253 aBlock[i] ^= ct[(block * bpb) + i];
1254 }
1255 }
1256 ct = ct.concat(encrypt(aBlock, expandedKey));
1257 }
1258
1259 return ct;
1260}
1261
1262// rijndaelDecrypt(ciphertext, key, mode)
1263// Decrypts the using the given key and mode. The parameter "ciphertext"
1264// must be an array of bytes. The parameter "key" must be an array of key
1265// bytes. If you have a hex string representing the ciphertext or key,
1266// invoke hexToByteArray() on it to convert it to an array of bytes. The
1267// parameter "mode" is a string, either "CBC" or "ECB".
1268//
1269// An array of bytes representing the plaintext is returned. To convert
1270// this array to a hex string, invoke byteArrayToHex() on it. To convert it
1271// to a string of characters, you can use byteArrayToString().
1272
1273function rijndaelDecrypt(ciphertext, key, mode) {
1274 var expandedKey;
1275 var bpb = blockSizeInBits / 8; // bytes per block
1276 var pt = new Array(); // plaintext array
1277 var aBlock; // a decrypted block
1278 var block; // current block number
1279
1280 if (!ciphertext || !key || typeof ciphertext == "string")
1281 return;
1282 if (key.length*8 != keySizeInBits)
1283 return;
1284 if (!mode) {
1285 mode = "ECB"; // assume ECB if mode omitted
1286 }
1287
1288 expandedKey = keyExpansion(key);
1289
1290 // work backwards to accomodate CBC mode
1291 for (block=(ciphertext.length / bpb)-1; block>0; block--) {
1292 aBlock =
1293 decrypt(ciphertext.slice(block*bpb,(block+1)*bpb), expandedKey);
1294 if (mode == "CBC")
1295 for (var i=0; i<bpb; i++)
1296 pt[(block-1)*bpb + i] = aBlock[i] ^ ciphertext[(block-1)*bpb + i];
1297 else
1298 pt = aBlock.concat(pt);
1299 }
1300
1301 // do last block if ECB (skips the IV in CBC)
1302 if (mode == "ECB")
1303 pt = decrypt(ciphertext.slice(0, bpb), expandedKey).concat(pt);
1304
1305 return pt;
1306}
1307
1308//#############################################################################
1309 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (utf-8.js)
1310//#############################################################################
1311
1312
1313 /*Encoding and decoding of Unicode character strings as
1314 UTF-8 byte streams. */
1315
1316 //UNICODE_TO_UTF8 -- Encode Unicode argument string as UTF-8 return value
1317
1318 function unicode_to_utf8(s) {
1319 var utf8 = "";
1320
1321 for (var n = 0; n < s.length; n++) {
1322 var c = s.charCodeAt(n);
1323
1324 if (c <= 0x7F) {
1325 // 0x00 - 0x7F: Emit as single byte, unchanged
1326 utf8 += String.fromCharCode(c);
1327 } else if ((c >= 0x80) && (c <= 0x7FF)) {
1328 // 0x80 - 0x7FF: Output as two byte code, 0xC0 in first byte
1329 // 0x80 in second byte
1330 utf8 += String.fromCharCode((c >> 6) | 0xC0);
1331 utf8 += String.fromCharCode((c & 0x3F) | 0x80);
1332 } else {
1333 // 0x800 - 0xFFFF: Output as three bytes, 0xE0 in first byte
1334 // 0x80 in second byte
1335 // 0x80 in third byte
1336 utf8 += String.fromCharCode((c >> 12) | 0xE0);
1337 utf8 += String.fromCharCode(((c >> 6) & 0x3F) | 0x80);
1338 utf8 += String.fromCharCode((c & 0x3F) | 0x80);
1339 }
1340 }
1341 return utf8;
1342 }
1343
1344 //UTF8_TO_UNICODE -- Decode UTF-8 argument into Unicode string return value
1345
1346 function utf8_to_unicode(utf8) {
1347 var s = "", i = 0, b1, b2, b2;
1348
1349 while (i < utf8.length) {
1350 b1 = utf8.charCodeAt(i);
1351 if (b1 < 0x80) { // One byte code: 0x00 0x7F
1352 s += String.fromCharCode(b1);
1353 i++;
1354 } else if((b1 >= 0xC0) && (b1 < 0xE0)) {// Two byte code: 0x80 - 0x7FF
1355 b2 = utf8.charCodeAt(i + 1);
1356 s += String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F));
1357 i += 2;
1358 } else { // Three byte code: 0x800 - 0xFFFF
1359 b2 = utf8.charCodeAt(i + 1);
1360 b3 = utf8.charCodeAt(i + 2);
1361 s += String.fromCharCode(((b1 & 0xF) << 12) |
1362 ((b2 & 0x3F) << 6) |
1363 (b3 & 0x3F));
1364 i += 3;
1365 }
1366 }
1367 return s;
1368 }
1369
1370 /*ENCODE_UTF8 -- Encode string as UTF8 only if it contains
1371 a character of 0x9D (Unicode OPERATING
1372 SYSTEM COMMAND) or a character greater
1373 than 0xFF. This permits all strings
1374 consisting exclusively of 8 bit
1375 graphic characters to be encoded as
1376 themselves. We choose 0x9D as the sentinel
1377 character as opposed to one of the more
1378 logical PRIVATE USE characters because 0x9D
1379 is not overloaded by the regrettable
1380 "Windows-1252" character set. Now such characters
1381 don't belong in JavaScript strings, but you never
1382 know what somebody is going to paste into a
1383 text box, so this choice keeps Windows-encoded
1384 strings from bloating to UTF-8 encoding. */
1385
1386 function encode_utf8(s) {
1387 var i, necessary = false;
1388
1389 for (i = 0; i < s.length; i++) {
1390 if ((s.charCodeAt(i) == 0x9D) ||
1391 (s.charCodeAt(i) > 0xFF)) {
1392 necessary = true;
1393 break;
1394 }
1395 }
1396 if (!necessary) {
1397 return s;
1398 }
1399 return String.fromCharCode(0x9D) + unicode_to_utf8(s);
1400 }
1401
1402 /* DECODE_UTF8 -- Decode a string encoded with encode_utf8
1403 above. If the string begins with the
1404 sentinel character 0x9D (OPERATING
1405 SYSTEM COMMAND), then we decode the
1406 balance as a UTF-8 stream. Otherwise,
1407 the string is output unchanged, as
1408 it's guaranteed to contain only 8 bit
1409 characters excluding 0x9D. */
1410
1411 function decode_utf8(s) {
1412 if ((s.length > 0) && (s.charCodeAt(0) == 0x9D)) {
1413 return utf8_to_unicode(s.substring(1));
1414 }
1415 return s;
1416 }
1417
1418
1419//#############################################################################
1420 //Downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js
1421//#############################################################################
1422
1423/*
1424 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
1425 * Digest Algorithm, as defined in RFC 1321.
1426 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
1427 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
1428 * Distributed under the BSD License
1429 * See http://pajhome.org.uk/crypt/md5 for more info.
1430 */
1431
1432/*
1433 * Configurable variables. You may need to tweak these to be compatible with
1434 * the server-side, but the defaults work in most cases.
1435 */
1436var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
1437var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
1438var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
1439
1440/*
1441 * These are the functions you'll usually want to call
1442 * They take string arguments and return either hex or base-64 encoded strings
1443 */
1444function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
1445function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
1446function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
1447function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
1448function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
1449function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
1450
1451/*
1452 * Perform a simple self-test to see if the VM is working
1453 */
1454function md5_vm_test()
1455{
1456 return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
1457}
1458
1459/*
1460 * Calculate the MD5 of an array of little-endian words, and a bit length
1461 */
1462function core_md5(x, len)
1463{
1464 /* append padding */
1465 x[len >> 5] |= 0x80 << ((len) % 32);
1466 x[(((len + 64) >>> 9) << 4) + 14] = len;
1467
1468 var a = 1732584193;
1469 var b = -271733879;
1470 var c = -1732584194;
1471 var d = 271733878;
1472
1473 for(var i = 0; i < x.length; i += 16)
1474 {
1475 var olda = a;
1476 var oldb = b;
1477 var oldc = c;
1478 var oldd = d;
1479
1480 a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
1481 d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
1482 c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
1483 b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
1484 a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
1485 d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
1486 c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
1487 b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
1488 a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
1489 d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
1490 c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
1491 b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
1492 a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
1493 d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
1494 c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
1495 b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
1496
1497 a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
1498 d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
1499 c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
1500 b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
1501 a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
1502 d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
1503 c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
1504 b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
1505 a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
1506 d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
1507 c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
1508 b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
1509 a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
1510 d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
1511 c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
1512 b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
1513
1514 a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
1515 d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
1516 c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
1517 b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
1518 a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
1519 d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
1520 c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
1521 b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
1522 a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
1523 d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
1524 c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
1525 b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
1526 a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
1527 d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
1528 c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
1529 b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
1530
1531 a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
1532 d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
1533 c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
1534 b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
1535 a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
1536 d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
1537 c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
1538 b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
1539 a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
1540 d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
1541 c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
1542 b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
1543 a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
1544 d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
1545 c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
1546 b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
1547
1548 a = safe_add(a, olda);
1549 b = safe_add(b, oldb);
1550 c = safe_add(c, oldc);
1551 d = safe_add(d, oldd);
1552 }
1553 return Array(a, b, c, d);
1554
1555}
1556
1557/*
1558 * These functions implement the four basic operations the algorithm uses.
1559 */
1560function md5_cmn(q, a, b, x, s, t)
1561{
1562 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
1563}
1564function md5_ff(a, b, c, d, x, s, t)
1565{
1566 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
1567}
1568function md5_gg(a, b, c, d, x, s, t)
1569{
1570 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
1571}
1572function md5_hh(a, b, c, d, x, s, t)
1573{
1574 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
1575}
1576function md5_ii(a, b, c, d, x, s, t)
1577{
1578 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
1579}
1580
1581/*
1582 * Calculate the HMAC-MD5, of a key and some data
1583 */
1584function core_hmac_md5(key, data)
1585{
1586 var bkey = str2binl(key);
1587 if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
1588
1589 var ipad = Array(16), opad = Array(16);
1590 for(var i = 0; i < 16; i++)
1591 {
1592 ipad[i] = bkey[i] ^ 0x36363636;
1593 opad[i] = bkey[i] ^ 0x5C5C5C5C;
1594 }
1595
1596 var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
1597 return core_md5(opad.concat(hash), 512 + 128);
1598}
1599
1600/*
1601 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
1602 * to work around bugs in some JS interpreters.
1603 */
1604function safe_add(x, y)
1605{
1606 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
1607 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
1608 return (msw << 16) | (lsw & 0xFFFF);
1609}
1610
1611/*
1612 * Bitwise rotate a 32-bit number to the left.
1613 */
1614function bit_rol(num, cnt)
1615{
1616 return (num << cnt) | (num >>> (32 - cnt));
1617}
1618
1619/*
1620 * Convert a string to an array of little-endian words
1621 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
1622 */
1623function str2binl(str)
1624{
1625 var bin = Array();
1626 var mask = (1 << chrsz) - 1;
1627 for(var i = 0; i < str.length * chrsz; i += chrsz)
1628 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
1629 return bin;
1630}
1631
1632/*
1633 * Convert an array of little-endian words to a string
1634 */
1635function binl2str(bin)
1636{
1637 var str = "";
1638 var mask = (1 << chrsz) - 1;
1639 for(var i = 0; i < bin.length * 32; i += chrsz)
1640 str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
1641 return str;
1642}
1643
1644/*
1645 * Convert an array of little-endian words to a hex string.
1646 */
1647function binl2hex(binarray)
1648{
1649 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
1650 var str = "";
1651 for(var i = 0; i < binarray.length * 4; i++)
1652 {
1653 str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
1654 hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
1655 }
1656 return str;
1657}
1658
1659/*
1660 * Convert an array of little-endian words to a base-64 string
1661 */
1662function binl2b64(binarray)
1663{
1664 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1665 var str = "";
1666 for(var i = 0; i < binarray.length * 4; i += 3)
1667 {
1668 var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
1669 | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
1670 | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
1671 for(var j = 0; j < 4; j++)
1672 {
1673 if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
1674 else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
1675 }
1676 }
1677 return str;
1678}
1679
1680
1681//#############################################################################
1682//#############################################################################
1683//#############################################################################
1684
1685
1686
1687MochiKit.Base.update(Clipperz.Crypto.Base, {
1688
1689 '__repr__': function () {
1690 return "[" + this.NAME + " " + this.VERSION + "]";
1691 },
1692
1693 'toString': function () {
1694 return this.__repr__();
1695 },
1696
1697 //-----------------------------------------------------------------------------
1698
1699 'encryptUsingSecretKey': function (aKey, aMessage) {
1700//Clipperz.Profile.start("Clipperz.Crypto.Base.encryptUsingSecretKey");
1701 var result;
1702 var plaintext;
1703 varheader;
1704 varkey;
1705
1706 key = hexToByteArray(Clipperz.Crypto.Base.computeHashValue(aKey));
1707
1708 addEntropyTime();
1709 prng = new AESprng(keyFromEntropy());
1710
1711 plaintext = encode_utf8(aMessage);
1712
1713 header = Clipperz.Base.byteArrayToString(hexToByteArray(Clipperz.Crypto.Base.computeMD5HashValue(plaintext)));
1714
1715 // Add message length in bytes to header
1716 i = plaintext.length;
1717 header += String.fromCharCode(i >>> 24);
1718 header += String.fromCharCode(i >>> 16);
1719 header += String.fromCharCode(i >>> 8);
1720 header += String.fromCharCode(i & 0xFF);
1721
1722 //The format of the actual message passed to rijndaelEncrypt
1723 //is:
1724 //
1725 // Bytes Content
1726 // 0-15 MD5 signature of plaintext
1727 // 16-19 Length of plaintext, big-endian order
1728 // 20-end Plaintext
1729 //
1730 //Note that this message will be padded with zero bytes
1731 //to an integral number of AES blocks (blockSizeInBits / 8).
1732 //This does not include the initial vector for CBC
1733 //encryption, which is added internally by rijndaelEncrypt.
1734 result = byteArrayToHex(rijndaelEncrypt(header + plaintext, key, "CBC"));
1735
1736 delete prng;
1737
1738//Clipperz.Profile.stop("Clipperz.Crypto.Base.encryptUsingSecretKey");
1739 return result;
1740 },
1741
1742 //.............................................................................
1743
1744 'decryptUsingSecretKey': function (aKey, aMessage) {
1745//Clipperz.Profile.start("Clipperz.Crypto.Base.decryptUsingSecretKey");
1746 varkey;
1747 var decryptedText;
1748 vartextLength;
1749 varheader;
1750 varheaderDigest;
1751 var plaintext;
1752 var i;
1753
1754 key = hexToByteArray(Clipperz.Crypto.Base.computeHashValue(aKey));
1755
1756 decryptedText = rijndaelDecrypt(hexToByteArray(aMessage), key, "CBC");
1757
1758 header = decryptedText.slice(0, 20);
1759 decryptedText = decryptedText.slice(20);
1760
1761 headerDigest = byteArrayToHex(header.slice(0,16));
1762 textLength = (header[16] << 24) | (header[17] << 16) | (header[18] << 8) | header[19];
1763
1764 if ((textLength < 0) || (textLength > decryptedText.length)) {
1765 // jslog.warning("Message (length " + decryptedText.length + ") truncated. " + textLength + " characters expected.");
1766 //Try to sauve qui peut by setting length to entire message
1767 textLength = decryptedText.length;
1768 }
1769
1770 plainText = "";
1771
1772 for (i=0; i<textLength; i++) {
1773 plainText += String.fromCharCode(decryptedText[i]);
1774 }
1775
1776 if (Clipperz.Crypto.Base.computeMD5HashValue(plainText) != headerDigest) {
1777 // jslog.warning("Message corrupted. Checksum of decrypted message does not match.");
1778 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
1779 // throw new Error("Message corrupted. Checksum of decrypted message does not match. Parsed result: " + decode_utf8(plainText));
1780 }
1781
1782 // That's it; plug plaintext into the result field
1783
1784 result = decode_utf8(plainText);
1785
1786//Clipperz.Profile.stop("Clipperz.Crypto.Base.decryptUsingSecretKey");
1787 return result;
1788 },
1789
1790 //-----------------------------------------------------------------------------
1791
1792 'computeHashValue': function (aMessage) {
1793//Clipperz.Profile.start("Clipperz.Crypto.Base.computeHashValue");
1794 varresult;
1795
1796 result = hex_sha256(aMessage);
1797//Clipperz.Profile.stop("Clipperz.Crypto.Base.computeHashValue");
1798
1799 return result;
1800 },
1801
1802 //.........................................................................
1803
1804 'computeMD5HashValue': function (aMessage) {
1805 varresult;
1806//Clipperz.Profile.start("Clipperz.Crypto.Base.computeMD5HashValue");
1807 result = hex_md5(aMessage);
1808//Clipperz.Profile.stop("Clipperz.Crypto.Base.computeMD5HashValue");
1809
1810 return result;
1811 },
1812
1813 //-----------------------------------------------------------------------------
1814
1815 'generateRandomSeed': function () {
1816//Clipperz.Profile.start("Clipperz.Crypto.Base.generateRandomSeed");
1817 varresult;
1818 var seed;
1819 var prng;
1820 var charA;
1821 var i;
1822
1823 addEntropyTime();
1824
1825 seed = keyFromEntropy();
1826 prng = new AESprng(seed);
1827
1828 result = "";
1829 charA = ("A").charCodeAt(0);
1830
1831 for (i = 0; i < 64; i++) {
1832 result += String.fromCharCode(charA + prng.nextInt(25));
1833 }
1834
1835 delete prng;
1836
1837 result = Clipperz.Crypto.Base.computeHashValue(result);
1838
1839//Clipperz.Profile.stop("Clipperz.Crypto.Base.generateRandomSeed");
1840 return result;
1841 },
1842
1843 //-----------------------------------------------------------------------------
1844
1845 'exception': {
1846 'CorruptedMessage': new MochiKit.Base.NamedError("Clipperz.Crypto.Base.exception.CorruptedMessage")
1847 },
1848
1849 //.........................................................................
1850 __syntaxFix__: "syntax fix"
1851});
1852
diff --git a/frontend/gamma/js/Clipperz/Crypto/BigInt.js b/frontend/gamma/js/Clipperz/Crypto/BigInt.js
new file mode 100644
index 0000000..d4d05d2
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/BigInt.js
@@ -0,0 +1,1760 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
31
32//#############################################################################
33 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
34//#############################################################################
35
36
37////////////////////////////////////////////////////////////////////////////////////////
38// Big Integer Library v. 5.0
39// Created 2000, last modified 2006
40// Leemon Baird
41// www.leemon.com
42//
43// This file is public domain. You can use it for any purpose without restriction.
44// I do not guarantee that it is correct, so use it at your own risk. If you use
45// it for something interesting, I'd appreciate hearing about it. If you find
46// any bugs or make any improvements, I'd appreciate hearing about those too.
47// It would also be nice if my name and address were left in the comments.
48// But none of that is required.
49//
50// This code defines a bigInt library for arbitrary-precision integers.
51// A bigInt is an array of integers storing the value in chunks of bpe bits,
52// little endian (buff[0] is the least significant word).
53// Negative bigInts are stored two's complement.
54// Some functions assume their parameters have at least one leading zero element.
55// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
56// so the caller must make sure overflow won't happen.
57// For each function where a parameter is modified, that same
58// variable must not be used as another argument too.
59// So, you cannot square x by doing multMod_(x,x,n).
60// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
61//
62// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
63// For most functions, if it needs a BigInt as a local variable it will actually use
64// a global, and will only allocate to it when it's not the right size. This ensures
65// that when a function is called repeatedly with same-sized parameters, it only allocates
66// memory on the first call.
67//
68// Note that for cryptographic purposes, the calls to Math.random() must
69// be replaced with calls to a better pseudorandom number generator.
70//
71// In the following, "bigInt" means a bigInt with at least one leading zero element,
72// and "integer" means a nonnegative integer less than radix. In some cases, integer
73// can be negative. Negative bigInts are 2s complement.
74//
75// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
76//
77// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
78// function dup(x) //returns a copy of bigInt x
79// function findPrimes(n) //return array of all primes less than integer n
80// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
81// function int2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements
82// function trim(x,k) //return a copy of x with exactly k leading zero elements
83//
84// The following functions do not modify their inputs, so there is never a problem with the result being too big:
85//
86// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
87// function equals(x,y) //is the bigInt x equal to the bigint y?
88// function equalsInt(x,y) //is bigint x equal to integer y?
89// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
90// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
91// function isZero(x) //is the bigInt x equal to zero?
92// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)?
93// function modInt(x,n) //return x mod n for bigInt x and integer n.
94// function negative(x) //is bigInt x negative?
95//
96// The following functions do not modify their inputs, but allocate memory and call functions with underscores
97//
98// function add(x,y) //return (x+y) for bigInts x and y.
99// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
100// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
101// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
102// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
103// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
104// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
105// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
106// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
107// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
108//
109// The following functions write a bigInt result to one of the parameters, but
110// the result is never bigger than the original, so there can't be overflow problems:
111//
112// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
113// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
114// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
115// function mod_(x,n) //do x=x mod n for bigInts x and n.
116// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
117//
118// The following functions write a bigInt result to one of the parameters. The caller is responsible for
119// ensuring it is large enough to hold the result.
120//
121// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
122// function add_(x,y) //do x=x+y for bigInts x and y
123// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))
124// function copy_(x,y) //do x=y on bigInts x and y
125// function copyInt_(x,n) //do x=n on bigInt x and integer n
126// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.
127// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r
128// function eGCD_(x,y,d,a,b) //sets a,b,d to positive big integers such that d = GCD_(x,y) = a*x-b*y
129// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist
130// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
131// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.
132// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b
133// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys
134// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)
135// function mult_(x,y) //do x=x*y for bigInts x and y.
136// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.
137// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.
138// function powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.
139// function randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.
140// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.
141// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n
142// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.
143// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.
144//
145// The following functions are based on algorithms from the _Handbook of Applied Cryptography_
146// powMod_() = algorithm 14.94, Montgomery exponentiation
147// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_
148// GCD_() = algorothm 14.57, Lehmer's algorithm
149// mont_() = algorithm 14.36, Montgomery multiplication
150// divide_() = algorithm 14.20 Multiple-precision division
151// squareMod_() = algorithm 14.16 Multiple-precision squaring
152// randTruePrime_() = algorithm 4.62, Maurer's algorithm
153// millerRabin() = algorithm 4.24, Miller-Rabin algorithm
154//
155// Profiling shows:
156// randTruePrime_() spends:
157// 10% of its time in calls to powMod_()
158// 85% of its time in calls to millerRabin()
159// millerRabin() spends:
160// 99% of its time in calls to powMod_() (always with a base of 2)
161// powMod_() spends:
162// 94% of its time in calls to mont_() (almost always with x==y)
163//
164// This suggests there are several ways to speed up this library slightly:
165// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)
166// -- this should especially focus on being fast when raising 2 to a power mod n
167// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test
168// - tune the parameters in randTruePrime_(), including c, m, and recLimit
169// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking
170// within the loop when all the parameters are the same length.
171//
172// There are several ideas that look like they wouldn't help much at all:
173// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)
174// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)
175// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square
176// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that
177// method would be slower. This is unfortunate because the code currently spends almost all of its time
178// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring
179// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded
180// sentences that seem to imply it's faster to do a non-modular square followed by a single
181// Montgomery reduction, but that's obviously wrong.
182////////////////////////////////////////////////////////////////////////////////////////
183
184//globals
185bpe=0; //bits stored per array element
186mask=0; //AND this with an array element to chop it down to bpe bits
187radix=mask+1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask.
188
189//the digits for converting to different bases
190digitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-';
191
192//initialize the global variables
193for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
194bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
195mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
196radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask
197one=int2bigInt(1,1,1); //constant used in powMod_()
198
199//the following global variables are scratchpad memory to
200//reduce dynamic memory allocation in the inner loop
201t=new Array(0);
202ss=t; //used in mult_()
203s0=t; //used in multMod_(), squareMod_()
204s1=t; //used in powMod_(), multMod_(), squareMod_()
205s2=t; //used in powMod_(), multMod_()
206s3=t; //used in powMod_()
207s4=t; s5=t; //used in mod_()
208s6=t; //used in bigInt2str()
209s7=t; //used in powMod_()
210T=t; //used in GCD_()
211sa=t; //used in mont_()
212mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin()
213eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_()
214md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()
215
216primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t;
217 s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_()
218
219////////////////////////////////////////////////////////////////////////////////////////
220
221//return array of all primes less than integer n
222function findPrimes(n) {
223 var i,s,p,ans;
224 s=new Array(n);
225 for (i=0;i<n;i++)
226 s[i]=0;
227 s[0]=2;
228 p=0; //first p elements of s are primes, the rest are a sieve
229 for(;s[p]<n;) { //s[p] is the pth prime
230 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]
231 s[i]=1;
232 p++;
233 s[p]=s[p-1]+1;
234 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)
235 }
236 ans=new Array(p);
237 for(i=0;i<p;i++)
238 ans[i]=s[i];
239 return ans;
240}
241
242//does a single round of Miller-Rabin base b consider x to be a possible prime?
243//x is a bigInt, and b is an integer
244function millerRabin(x,b) {
245 var i,j,k,s;
246
247 if (mr_x1.length!=x.length) {
248 mr_x1=dup(x);
249 mr_r=dup(x);
250 mr_a=dup(x);
251 }
252
253 copyInt_(mr_a,b);
254 copy_(mr_r,x);
255 copy_(mr_x1,x);
256
257 addInt_(mr_r,-1);
258 addInt_(mr_x1,-1);
259
260 //s=the highest power of two that divides mr_r
261 k=0;
262 for (i=0;i<mr_r.length;i++)
263 for (j=1;j<mask;j<<=1)
264 if (x[i] & j) {
265 s=(k<mr_r.length+bpe ? k : 0);
266 i=mr_r.length;
267 j=mask;
268 } else
269 k++;
270
271 if (s)
272 rightShift_(mr_r,s);
273
274 powMod_(mr_a,mr_r,x);
275
276 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {
277 j=1;
278 while (j<=s-1 && !equals(mr_a,mr_x1)) {
279 squareMod_(mr_a,x);
280 if (equalsInt(mr_a,1)) {
281 return 0;
282 }
283 j++;
284 }
285 if (!equals(mr_a,mr_x1)) {
286 return 0;
287 }
288 }
289 return 1;
290}
291
292//returns how many bits long the bigInt is, not counting leading zeros.
293function bitSize(x) {
294 var j,z,w;
295 for (j=x.length-1; (x[j]==0) && (j>0); j--);
296 for (z=0,w=x[j]; w; (w>>=1),z++);
297 z+=bpe*j;
298 return z;
299}
300
301//return a copy of x with at least n elements, adding leading zeros if needed
302function expand(x,n) {
303 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);
304 copy_(ans,x);
305 return ans;
306}
307
308//return a k-bit true random prime using Maurer's algorithm.
309function randTruePrime(k) {
310 var ans=int2bigInt(0,k,0);
311 randTruePrime_(ans,k);
312 return trim(ans,1);
313}
314
315//return a new bigInt equal to (x mod n) for bigInts x and n.
316function mod(x,n) {
317 var ans=dup(x);
318 mod_(ans,n);
319 return trim(ans,1);
320}
321
322//return (x+n) where x is a bigInt and n is an integer.
323function addInt(x,n) {
324 var ans=expand(x,x.length+1);
325 addInt_(ans,n);
326 return trim(ans,1);
327}
328
329//return x*y for bigInts x and y. This is faster when y<x.
330function mult(x,y) {
331 var ans=expand(x,x.length+y.length);
332 mult_(ans,y);
333 return trim(ans,1);
334}
335
336//return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
337function powMod(x,y,n) {
338 var ans=expand(x,n.length);
339 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't
340 return trim(ans,1);
341}
342
343//return (x-y) for bigInts x and y. Negative answers will be 2s complement
344function sub(x,y) {
345 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
346 sub_(ans,y);
347 return trim(ans,1);
348}
349
350//return (x+y) for bigInts x and y.
351function add(x,y) {
352 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
353 add_(ans,y);
354 return trim(ans,1);
355}
356
357//return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
358function inverseMod(x,n) {
359 var ans=expand(x,n.length);
360 var s;
361 s=inverseMod_(ans,n);
362 return s ? trim(ans,1) : null;
363}
364
365//return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
366function multMod(x,y,n) {
367 var ans=expand(x,n.length);
368 multMod_(ans,y,n);
369 return trim(ans,1);
370}
371
372//generate a k-bit true random prime using Maurer's algorithm,
373//and put it into ans. The bigInt ans must be large enough to hold it.
374function randTruePrime_(ans,k) {
375 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;
376
377 if (primes.length==0)
378 primes=findPrimes(30000); //check for divisibility by primes <=30000
379
380 if (pows.length==0) {
381 pows=new Array(512);
382 for (j=0;j<512;j++) {
383 pows[j]=Math.pow(2,j/511.-1.);
384 }
385 }
386
387 //c and m should be tuned for a particular machine and value of k, to maximize speed
388 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC)
389 c=0.1;
390 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
391 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit
392
393 if (s_i2.length!=ans.length) {
394 s_i2=dup(ans);
395 s_R =dup(ans);
396 s_n1=dup(ans);
397 s_r2=dup(ans);
398 s_d =dup(ans);
399 s_x1=dup(ans);
400 s_x2=dup(ans);
401 s_b =dup(ans);
402 s_n =dup(ans);
403 s_i =dup(ans);
404 s_rm=dup(ans);
405 s_q =dup(ans);
406 s_a =dup(ans);
407 s_aa=dup(ans);
408 }
409
410 if (k <= recLimit) { //generate small random primes by trial division up to its square root
411 pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k)
412 copyInt_(ans,0);
413 for (dd=1;dd;) {
414 dd=0;
415 ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k)); //random, k-bit, odd integer, with msb 1
416 for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k)
417 if (0==(ans[0]%primes[j])) {
418 dd=1;
419 break;
420 }
421 }
422 }
423 carry_(ans);
424 return;
425 }
426
427 B=c*k*k; //try small primes up to B (or all the primes[] array if the largest is less than B).
428 if (k>2*m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
429 for (r=1; k-k*r<=m; )
430 r=pows[Math.floor(Math.random()*512)]; //r=Math.pow(2,Math.random()-1);
431 else
432 r=.5;
433
434 //simulation suggests the more complex algorithm using r=.333 is only slightly faster.
435
436 recSize=Math.floor(r*k)+1;
437
438 randTruePrime_(s_q,recSize);
439 copyInt_(s_i2,0);
440 s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe)); //s_i2=2^(k-2)
441 divide_(s_i2,s_q,s_i,s_rm); //s_i=floor((2^(k-1))/(2q))
442
443 z=bitSize(s_i);
444
445 for (;;) {
446 for (;;) { //generate z-bit numbers until one falls in the range [0,s_i-1]
447 randBigInt_(s_R,z,0);
448 if (greater(s_i,s_R))
449 break;
450 } //now s_R is in the range [0,s_i-1]
451 addInt_(s_R,1); //now s_R is in the range [1,s_i]
452 add_(s_R,s_i); //now s_R is in the range [s_i+1,2*s_i]
453
454 copy_(s_n,s_q);
455 mult_(s_n,s_R);
456 multInt_(s_n,2);
457 addInt_(s_n,1); //s_n=2*s_R*s_q+1
458
459 copy_(s_r2,s_R);
460 multInt_(s_r2,2); //s_r2=2*s_R
461
462 //check s_n for divisibility by small primes up to B
463 for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++)
464 if (modInt(s_n,primes[j])==0) {
465 divisible=1;
466 break;
467 }
468
469 if (!divisible) //if it passes small primes check, then try a single Miller-Rabin base 2
470 if (!millerRabin(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_
471 divisible=1;
472
473 if (!divisible) { //if it passes that test, continue checking s_n
474 addInt_(s_n,-3);
475 for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--); //strip leading zeros
476 for (zz=0,w=s_n[j]; w; (w>>=1),zz++);
477 zz+=bpe*j; //zz=number of bits in s_n, ignoring leading zeros
478 for (;;) { //generate z-bit numbers until one falls in the range [0,s_n-1]
479 randBigInt_(s_a,zz,0);
480 if (greater(s_n,s_a))
481 break;
482 } //now s_a is in the range [0,s_n-1]
483 addInt_(s_n,3); //now s_a is in the range [0,s_n-4]
484 addInt_(s_a,2); //now s_a is in the range [2,s_n-2]
485 copy_(s_b,s_a);
486 copy_(s_n1,s_n);
487 addInt_(s_n1,-1);
488 powMod_(s_b,s_n1,s_n); //s_b=s_a^(s_n-1) modulo s_n
489 addInt_(s_b,-1);
490 if (isZero(s_b)) {
491 copy_(s_b,s_a);
492 powMod_(s_b,s_r2,s_n);
493 addInt_(s_b,-1);
494 copy_(s_aa,s_n);
495 copy_(s_d,s_b);
496 GCD_(s_d,s_n); //if s_b and s_n are relatively prime, then s_n is a prime
497 if (equalsInt(s_d,1)) {
498 copy_(ans,s_aa);
499 return; //if we've made it this far, then s_n is absolutely guaranteed to be prime
500 }
501 }
502 }
503 }
504}
505
506//set b to an n-bit random BigInt. If s=1, then nth bit (most significant bit) is set to 1.
507//array b must be big enough to hold the result. Must have n>=1
508function randBigInt_(b,n,s) {
509 var i,a;
510 for (i=0;i<b.length;i++)
511 b[i]=0;
512 a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt
513 for (i=0;i<a;i++) {
514 b[i]=Math.floor(Math.random()*(1<<(bpe-1)));
515 }
516 b[a-1] &= (2<<((n-1)%bpe))-1;
517 if (s)
518 b[a-1] |= (1<<((n-1)%bpe));
519}
520
521//set x to the greatest common divisor of x and y.
522//x,y are bigInts with the same number of elements. y is destroyed.
523function GCD_(x,y) {
524 var i,xp,yp,A,B,C,D,q,sing;
525 if (T.length!=x.length)
526 T=dup(x);
527
528 sing=1;
529 while (sing) { //while y has nonzero elements other than y[0]
530 sing=0;
531 for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0
532 if (y[i]) {
533 sing=1;
534 break;
535 }
536 if (!sing) break; //quit when y all zero elements except possibly y[0]
537
538 for (i=x.length;!x[i] && i>=0;i--); //find most significant element of x
539 xp=x[i];
540 yp=y[i];
541 A=1; B=0; C=0; D=1;
542 while ((yp+C) && (yp+D)) {
543 q =Math.floor((xp+A)/(yp+C));
544 qp=Math.floor((xp+B)/(yp+D));
545 if (q!=qp)
546 break;
547 t= A-q*C; A=C; C=t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)
548 t= B-q*D; B=D; D=t;
549 t=xp-q*yp; xp=yp; yp=t;
550 }
551 if (B) {
552 copy_(T,x);
553 linComb_(x,y,A,B); //x=A*x+B*y
554 linComb_(y,T,D,C); //y=D*y+C*T
555 } else {
556 mod_(x,y);
557 copy_(T,x);
558 copy_(x,y);
559 copy_(y,T);
560 }
561 }
562 if (y[0]==0)
563 return;
564 t=modInt(x,y[0]);
565 copyInt_(x,y[0]);
566 y[0]=t;
567 while (y[0]) {
568 x[0]%=y[0];
569 t=x[0]; x[0]=y[0]; y[0]=t;
570 }
571}
572
573//do x=x**(-1) mod n, for bigInts x and n.
574//If no inverse exists, it sets x to zero and returns 0, else it returns 1.
575//The x array must be at least as large as the n array.
576function inverseMod_(x,n) {
577 var k=1+2*Math.max(x.length,n.length);
578
579 if(!(x[0]&1) && !(n[0]&1)) { //if both inputs are even, then inverse doesn't exist
580 copyInt_(x,0);
581 return 0;
582 }
583
584 if (eg_u.length!=k) {
585 eg_u=new Array(k);
586 eg_v=new Array(k);
587 eg_A=new Array(k);
588 eg_B=new Array(k);
589 eg_C=new Array(k);
590 eg_D=new Array(k);
591 }
592
593 copy_(eg_u,x);
594 copy_(eg_v,n);
595 copyInt_(eg_A,1);
596 copyInt_(eg_B,0);
597 copyInt_(eg_C,0);
598 copyInt_(eg_D,1);
599 for (;;) {
600 while(!(eg_u[0]&1)) { //while eg_u is even
601 halve_(eg_u);
602 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2
603 halve_(eg_A);
604 halve_(eg_B);
605 } else {
606 add_(eg_A,n); halve_(eg_A);
607 sub_(eg_B,x); halve_(eg_B);
608 }
609 }
610
611 while (!(eg_v[0]&1)) { //while eg_v is even
612 halve_(eg_v);
613 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2
614 halve_(eg_C);
615 halve_(eg_D);
616 } else {
617 add_(eg_C,n); halve_(eg_C);
618 sub_(eg_D,x); halve_(eg_D);
619 }
620 }
621
622 if (!greater(eg_v,eg_u)) { //eg_v <= eg_u
623 sub_(eg_u,eg_v);
624 sub_(eg_A,eg_C);
625 sub_(eg_B,eg_D);
626 } else { //eg_v > eg_u
627 sub_(eg_v,eg_u);
628 sub_(eg_C,eg_A);
629 sub_(eg_D,eg_B);
630 }
631
632 if (equalsInt(eg_u,0)) {
633 if (negative(eg_C)) //make sure answer is nonnegative
634 add_(eg_C,n);
635 copy_(x,eg_C);
636
637 if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse
638 copyInt_(x,0);
639 return 0;
640 }
641 return 1;
642 }
643 }
644}
645
646//return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
647function inverseModInt_(x,n) {
648 var a=1,b=0,t;
649 for (;;) {
650 if (x==1) return a;
651 if (x==0) return 0;
652 b-=a*Math.floor(n/x);
653 n%=x;
654
655 if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to +=
656 if (n==0) return 0;
657 a-=b*Math.floor(x/n);
658 x%=n;
659 }
660}
661
662//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:
663// v = GCD_(x,y) = a*x-b*y
664//The bigInts v, a, b, must have exactly as many elements as the larger of x and y.
665function eGCD_(x,y,v,a,b) {
666 var g=0;
667 var k=Math.max(x.length,y.length);
668 if (eg_u.length!=k) {
669 eg_u=new Array(k);
670 eg_A=new Array(k);
671 eg_B=new Array(k);
672 eg_C=new Array(k);
673 eg_D=new Array(k);
674 }
675 while(!(x[0]&1) && !(y[0]&1)) { //while x and y both even
676 halve_(x);
677 halve_(y);
678 g++;
679 }
680 copy_(eg_u,x);
681 copy_(v,y);
682 copyInt_(eg_A,1);
683 copyInt_(eg_B,0);
684 copyInt_(eg_C,0);
685 copyInt_(eg_D,1);
686 for (;;) {
687 while(!(eg_u[0]&1)) { //while u is even
688 halve_(eg_u);
689 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2
690 halve_(eg_A);
691 halve_(eg_B);
692 } else {
693 add_(eg_A,y); halve_(eg_A);
694 sub_(eg_B,x); halve_(eg_B);
695 }
696 }
697
698 while (!(v[0]&1)) { //while v is even
699 halve_(v);
700 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2
701 halve_(eg_C);
702 halve_(eg_D);
703 } else {
704 add_(eg_C,y); halve_(eg_C);
705 sub_(eg_D,x); halve_(eg_D);
706 }
707 }
708
709 if (!greater(v,eg_u)) { //v<=u
710 sub_(eg_u,v);
711 sub_(eg_A,eg_C);
712 sub_(eg_B,eg_D);
713 } else { //v>u
714 sub_(v,eg_u);
715 sub_(eg_C,eg_A);
716 sub_(eg_D,eg_B);
717 }
718 if (equalsInt(eg_u,0)) {
719 if (negative(eg_C)) { //make sure a (C)is nonnegative
720 add_(eg_C,y);
721 sub_(eg_D,x);
722 }
723 multInt_(eg_D,-1); ///make sure b (D) is nonnegative
724 copy_(a,eg_C);
725 copy_(b,eg_D);
726 leftShift_(v,g);
727 return;
728 }
729 }
730}
731
732
733//is bigInt x negative?
734function negative(x) {
735 return ((x[x.length-1]>>(bpe-1))&1);
736}
737
738
739//is (x << (shift*bpe)) > y?
740//x and y are nonnegative bigInts
741//shift is a nonnegative integer
742function greaterShift(x,y,shift) {
743 var kx=x.length, ky=y.length;
744 k=((kx+shift)<ky) ? (kx+shift) : ky;
745 for (i=ky-1-shift; i<kx && i>=0; i++)
746 if (x[i]>0)
747 return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger
748 for (i=kx-1+shift; i<ky; i++)
749 if (y[i]>0)
750 return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger
751 for (i=k-1; i>=shift; i--)
752 if (x[i-shift]>y[i]) return 1;
753 else if (x[i-shift]<y[i]) return 0;
754 return 0;
755}
756
757//is x > y? (x and y both nonnegative)
758function greater(x,y) {
759 var i;
760 var k=(x.length<y.length) ? x.length : y.length;
761
762 for (i=x.length;i<y.length;i++)
763 if (y[i])
764 return 0; //y has more digits
765
766 for (i=y.length;i<x.length;i++)
767 if (x[i])
768 return 1; //x has more digits
769
770 for (i=k-1;i>=0;i--)
771 if (x[i]>y[i])
772 return 1;
773 else if (x[i]<y[i])
774 return 0;
775 return 0;
776}
777
778//divide_ x by y giving quotient q and remainder r. (q=floor(x/y), r=x mod y). All 4 are bigints.
779//x must have at least one leading zero element.
780//y must be nonzero.
781//q and r must be arrays that are exactly the same length as x.
782//the x array must have at least as many elements as y.
783function divide_(x,y,q,r) {
784 var kx, ky;
785 var i,j,y1,y2,c,a,b;
786 copy_(r,x);
787 for (ky=y.length;y[ky-1]==0;ky--); //kx,ky is number of elements in x,y, not including leading zeros
788 for (kx=r.length;r[kx-1]==0 && kx>ky;kx--);
789
790 //normalize: ensure the most significant element of y has its highest bit set
791 b=y[ky-1];
792 for (a=0; b; a++)
793 b>>=1;
794 a=bpe-a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element
795 leftShift_(y,a); //multiply both by 1<<a now, then divide_ both by that at the end
796 leftShift_(r,a);
797
798 copyInt_(q,0); // q=0
799 while (!greaterShift(y,r,kx-ky)) { // while (leftShift_(y,kx-ky) <= r) {
800 subShift_(r,y,kx-ky); // r=r-leftShift_(y,kx-ky)
801 q[kx-ky]++; // q[kx-ky]++;
802 } // }
803
804 for (i=kx-1; i>=ky; i--) {
805 if (r[i]==y[ky-1])
806 q[i-ky]=mask;
807 else
808 q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]);
809
810 //The following for(;;) loop is equivalent to the commented while loop,
811 //except that the uncommented version avoids overflow.
812 //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0
813 // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])
814 // q[i-ky]--;
815 for (;;) {
816 y2=(ky>1 ? y[ky-2] : 0)*q[i-ky];
817 c=y2>>bpe;
818 y2=y2 & mask;
819 y1=c+q[i-ky]*y[ky-1];
820 c=y1>>bpe;
821 y1=y1 & mask;
822
823 if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i])
824 q[i-ky]--;
825 else
826 break;
827 }
828
829 linCombShift_(r,y,-q[i-ky],i-ky); //r=r-q[i-ky]*leftShift_(y,i-ky)
830 if (negative(r)) {
831 addShift_(r,y,i-ky); //r=r+leftShift_(y,i-ky)
832 q[i-ky]--;
833 }
834 }
835
836 rightShift_(y,a); //undo the normalization step
837 rightShift_(r,a); //undo the normalization step
838}
839
840//do carries and borrows so each element of the bigInt x fits in bpe bits.
841function carry_(x) {
842 var i,k,c,b;
843 k=x.length;
844 c=0;
845 for (i=0;i<k;i++) {
846 c+=x[i];
847 b=0;
848 if (c<0) {
849 b=-(c>>bpe);
850 c+=b*radix;
851 }
852 x[i]=c & mask;
853 c=(c>>bpe)-b;
854 }
855}
856
857//return x mod n for bigInt x and integer n.
858function modInt(x,n) {
859 var i,c=0;
860 for (i=x.length-1; i>=0; i--)
861 c=(c*radix+x[i])%n;
862 return c;
863}
864
865//convert the integer t into a bigInt with at least the given number of bits.
866//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)
867//Pad the array with leading zeros so that it has at least minSize elements.
868//There will always be at least one leading 0 element.
869function int2bigInt(t,bits,minSize) {
870 var i,k;
871 k=Math.ceil(bits/bpe)+1;
872 k=minSize>k ? minSize : k;
873 buff=new Array(k);
874 copyInt_(buff,t);
875 return buff;
876}
877
878//return the bigInt given a string representation in a given base.
879//Pad the array with leading zeros so that it has at least minSize elements.
880//If base=-1, then it reads in a space-separated list of array elements in decimal.
881//The array will always have at least one leading zero, unless base=-1.
882function str2bigInt(s,base,minSize) {
883 var d, i, j, x, y, kk;
884 var k=s.length;
885 if (base==-1) { //comma-separated list of array elements in decimal
886 x=new Array(0);
887 for (;;) {
888 y=new Array(x.length+1);
889 for (i=0;i<x.length;i++)
890 y[i+1]=x[i];
891 y[0]=parseInt(s,10);
892 x=y;
893 d=s.indexOf(',',0);
894 if (d<1)
895 break;
896 s=s.substring(d+1);
897 if (s.length==0)
898 break;
899 }
900 if (x.length<minSize) {
901 y=new Array(minSize);
902 copy_(y,x);
903 return y;
904 }
905 return x;
906 }
907
908 x=int2bigInt(0,base*k,0);
909 for (i=0;i<k;i++) {
910 d=digitsStr.indexOf(s.substring(i,i+1),0);
911 if (base<=36 && d>=36) //convert lowercase to uppercase if base<=36
912 d-=26;
913 if (d<base && d>=0) { //ignore illegal characters
914 multInt_(x,base);
915 addInt_(x,d);
916 }
917 }
918
919 for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros
920 k=minSize>k+1 ? minSize : k+1;
921 y=new Array(k);
922 kk=k<x.length ? k : x.length;
923 for (i=0;i<kk;i++)
924 y[i]=x[i];
925 for (;i<k;i++)
926 y[i]=0;
927 return y;
928}
929
930//is bigint x equal to integer y?
931//y must have less than bpe bits
932function equalsInt(x,y) {
933 var i;
934 if (x[0]!=y)
935 return 0;
936 for (i=1;i<x.length;i++)
937 if (x[i])
938 return 0;
939 return 1;
940}
941
942//are bigints x and y equal?
943//this works even if x and y are different lengths and have arbitrarily many leading zeros
944function equals(x,y) {
945 var i;
946 var k=x.length<y.length ? x.length : y.length;
947 for (i=0;i<k;i++)
948 if (x[i]!=y[i])
949 return 0;
950 if (x.length>y.length) {
951 for (;i<x.length;i++)
952 if (x[i])
953 return 0;
954 } else {
955 for (;i<y.length;i++)
956 if (y[i])
957 return 0;
958 }
959 return 1;
960}
961
962//is the bigInt x equal to zero?
963function isZero(x) {
964 var i;
965 for (i=0;i<x.length;i++)
966 if (x[i])
967 return 0;
968 return 1;
969}
970
971//convert a bigInt into a string in a given base, from base 2 up to base 95.
972//Base -1 prints the contents of the array representing the number.
973function bigInt2str(x,base) {
974 var i,t,s="";
975
976 if (s6.length!=x.length)
977 s6=dup(x);
978 else
979 copy_(s6,x);
980
981 if (base==-1) { //return the list of array contents
982 for (i=x.length-1;i>0;i--)
983 s+=x[i]+',';
984 s+=x[0];
985 }
986 else { //return it in the given base
987 while (!isZero(s6)) {
988 t=divInt_(s6,base); //t=s6 % base; s6=floor(s6/base);
989 s=digitsStr.substring(t,t+1)+s;
990 }
991 }
992 if (s.length==0)
993 s="0";
994 return s;
995}
996
997//returns a duplicate of bigInt x
998function dup(x) {
999 var i;
1000 buff=new Array(x.length);
1001 copy_(buff,x);
1002 return buff;
1003}
1004
1005//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
1006function copy_(x,y) {
1007 var i;
1008 var k=x.length<y.length ? x.length : y.length;
1009 for (i=0;i<k;i++)
1010 x[i]=y[i];
1011 for (i=k;i<x.length;i++)
1012 x[i]=0;
1013}
1014
1015//do x=y on bigInt x and integer y.
1016function copyInt_(x,n) {
1017 var i,c;
1018 for (c=n,i=0;i<x.length;i++) {
1019 x[i]=c & mask;
1020 c>>=bpe;
1021 }
1022}
1023
1024//do x=x+n where x is a bigInt and n is an integer.
1025//x must be large enough to hold the result.
1026function addInt_(x,n) {
1027 var i,k,c,b;
1028 x[0]+=n;
1029 k=x.length;
1030 c=0;
1031 for (i=0;i<k;i++) {
1032 c+=x[i];
1033 b=0;
1034 if (c<0) {
1035 b=-(c>>bpe);
1036 c+=b*radix;
1037 }
1038 x[i]=c & mask;
1039 c=(c>>bpe)-b;
1040 if (!c) return; //stop carrying as soon as the carry_ is zero
1041 }
1042}
1043
1044//right shift bigInt x by n bits. 0 <= n < bpe.
1045function rightShift_(x,n) {
1046 var i;
1047 var k=Math.floor(n/bpe);
1048 if (k) {
1049 for (i=0;i<x.length-k;i++) //right shift x by k elements
1050 x[i]=x[i+k];
1051 for (;i<x.length;i++)
1052 x[i]=0;
1053 n%=bpe;
1054 }
1055 for (i=0;i<x.length-1;i++) {
1056 x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n));
1057 }
1058 x[i]>>=n;
1059}
1060
1061//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
1062function halve_(x) {
1063 var i;
1064 for (i=0;i<x.length-1;i++) {
1065 x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1));
1066 }
1067 x[i]=(x[i]>>1) | (x[i] & (radix>>1)); //most significant bit stays the same
1068}
1069
1070//left shift bigInt x by n bits.
1071function leftShift_(x,n) {
1072 var i;
1073 var k=Math.floor(n/bpe);
1074 if (k) {
1075 for (i=x.length; i>=k; i--) //left shift x by k elements
1076 x[i]=x[i-k];
1077 for (;i>=0;i--)
1078 x[i]=0;
1079 n%=bpe;
1080 }
1081 if (!n)
1082 return;
1083 for (i=x.length-1;i>0;i--) {
1084 x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n)));
1085 }
1086 x[i]=mask & (x[i]<<n);
1087}
1088
1089//do x=x*n where x is a bigInt and n is an integer.
1090//x must be large enough to hold the result.
1091function multInt_(x,n) {
1092 var i,k,c,b;
1093 if (!n)
1094 return;
1095 k=x.length;
1096 c=0;
1097 for (i=0;i<k;i++) {
1098 c+=x[i]*n;
1099 b=0;
1100 if (c<0) {
1101 b=-(c>>bpe);
1102 c+=b*radix;
1103 }
1104 x[i]=c & mask;
1105 c=(c>>bpe)-b;
1106 }
1107}
1108
1109//do x=floor(x/n) for bigInt x and integer n, and return the remainder
1110function divInt_(x,n) {
1111 var i,r=0,s;
1112 for (i=x.length-1;i>=0;i--) {
1113 s=r*radix+x[i];
1114 x[i]=Math.floor(s/n);
1115 r=s%n;
1116 }
1117 return r;
1118}
1119
1120//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.
1121//x must be large enough to hold the answer.
1122function linComb_(x,y,a,b) {
1123 var i,c,k,kk;
1124 k=x.length<y.length ? x.length : y.length;
1125 kk=x.length;
1126 for (c=0,i=0;i<k;i++) {
1127 c+=a*x[i]+b*y[i];
1128 x[i]=c & mask;
1129 c>>=bpe;
1130 }
1131 for (i=k;i<kk;i++) {
1132 c+=a*x[i];
1133 x[i]=c & mask;
1134 c>>=bpe;
1135 }
1136}
1137
1138//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.
1139//x must be large enough to hold the answer.
1140function linCombShift_(x,y,b,ys) {
1141 var i,c,k,kk;
1142 k=x.length<ys+y.length ? x.length : ys+y.length;
1143 kk=x.length;
1144 for (c=0,i=ys;i<k;i++) {
1145 c+=x[i]+b*y[i-ys];
1146 x[i]=c & mask;
1147 c>>=bpe;
1148 }
1149 for (i=k;c && i<kk;i++) {
1150 c+=x[i];
1151 x[i]=c & mask;
1152 c>>=bpe;
1153 }
1154}
1155
1156//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1157//x must be large enough to hold the answer.
1158function addShift_(x,y,ys) {
1159 var i,c,k,kk;
1160 k=x.length<ys+y.length ? x.length : ys+y.length;
1161 kk=x.length;
1162 for (c=0,i=ys;i<k;i++) {
1163 c+=x[i]+y[i-ys];
1164 x[i]=c & mask;
1165 c>>=bpe;
1166 }
1167 for (i=k;c && i<kk;i++) {
1168 c+=x[i];
1169 x[i]=c & mask;
1170 c>>=bpe;
1171 }
1172}
1173
1174//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1175//x must be large enough to hold the answer.
1176function subShift_(x,y,ys) {
1177 var i,c,k,kk;
1178 k=x.length<ys+y.length ? x.length : ys+y.length;
1179 kk=x.length;
1180 for (c=0,i=ys;i<k;i++) {
1181 c+=x[i]-y[i-ys];
1182 x[i]=c & mask;
1183 c>>=bpe;
1184 }
1185 for (i=k;c && i<kk;i++) {
1186 c+=x[i];
1187 x[i]=c & mask;
1188 c>>=bpe;
1189 }
1190}
1191
1192//do x=x-y for bigInts x and y.
1193//x must be large enough to hold the answer.
1194//negative answers will be 2s complement
1195function sub_(x,y) {
1196 var i,c,k,kk;
1197 k=x.length<y.length ? x.length : y.length;
1198 for (c=0,i=0;i<k;i++) {
1199 c+=x[i]-y[i];
1200 x[i]=c & mask;
1201 c>>=bpe;
1202 }
1203 for (i=k;c && i<x.length;i++) {
1204 c+=x[i];
1205 x[i]=c & mask;
1206 c>>=bpe;
1207 }
1208}
1209
1210//do x=x+y for bigInts x and y.
1211//x must be large enough to hold the answer.
1212function add_(x,y) {
1213 var i,c,k,kk;
1214 k=x.length<y.length ? x.length : y.length;
1215 for (c=0,i=0;i<k;i++) {
1216 c+=x[i]+y[i];
1217 x[i]=c & mask;
1218 c>>=bpe;
1219 }
1220 for (i=k;c && i<x.length;i++) {
1221 c+=x[i];
1222 x[i]=c & mask;
1223 c>>=bpe;
1224 }
1225}
1226
1227//do x=x*y for bigInts x and y. This is faster when y<x.
1228function mult_(x,y) {
1229 var i;
1230 if (ss.length!=2*x.length)
1231 ss=new Array(2*x.length);
1232 copyInt_(ss,0);
1233 for (i=0;i<y.length;i++)
1234 if (y[i])
1235 linCombShift_(ss,x,y[i],i); //ss=1*ss+y[i]*(x<<(i*bpe))
1236 copy_(x,ss);
1237}
1238
1239//do x=x mod n for bigInts x and n.
1240function mod_(x,n) {
1241 if (s4.length!=x.length)
1242 s4=dup(x);
1243 else
1244 copy_(s4,x);
1245 if (s5.length!=x.length)
1246 s5=dup(x);
1247 divide_(s4,n,s5,x); //x = remainder of s4 / n
1248}
1249
1250//do x=x*y mod n for bigInts x,y,n.
1251//for greater speed, let y<x.
1252function multMod_(x,y,n) {
1253 var i;
1254 if (s0.length!=2*x.length)
1255 s0=new Array(2*x.length);
1256 copyInt_(s0,0);
1257 for (i=0;i<y.length;i++)
1258 if (y[i])
1259 linCombShift_(s0,x,y[i],i); //s0=1*s0+y[i]*(x<<(i*bpe))
1260 mod_(s0,n);
1261 copy_(x,s0);
1262}
1263
1264//do x=x*x mod n for bigInts x,n.
1265function squareMod_(x,n) {
1266 var i,j,d,c,kx,kn,k;
1267 for (kx=x.length; kx>0 && !x[kx-1]; kx--); //ignore leading zeros in x
1268 k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n
1269 if (s0.length!=k)
1270 s0=new Array(k);
1271 copyInt_(s0,0);
1272 for (i=0;i<kx;i++) {
1273 c=s0[2*i]+x[i]*x[i];
1274 s0[2*i]=c & mask;
1275 c>>=bpe;
1276 for (j=i+1;j<kx;j++) {
1277 c=s0[i+j]+2*x[i]*x[j]+c;
1278 s0[i+j]=(c & mask);
1279 c>>=bpe;
1280 }
1281 s0[i+kx]=c;
1282 }
1283 mod_(s0,n);
1284 copy_(x,s0);
1285}
1286
1287//return x with exactly k leading zero elements
1288function trim(x,k) {
1289 var i,y;
1290 for (i=x.length; i>0 && !x[i-1]; i--);
1291 y=new Array(i+k);
1292 copy_(y,x);
1293 return y;
1294}
1295
1296//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation. 0**0=1.
1297//this is faster when n is odd. x usually needs to have as many elements as n.
1298function powMod_(x,y,n) {
1299 var k1,k2,kn,np;
1300 if(s7.length!=n.length)
1301 s7=dup(n);
1302
1303 //for even modulus, use a simple square-and-multiply algorithm,
1304 //rather than using the more complex Montgomery algorithm.
1305 if ((n[0]&1)==0) {
1306 copy_(s7,x);
1307 copyInt_(x,1);
1308 while(!equalsInt(y,0)) {
1309 if (y[0]&1)
1310 multMod_(x,s7,n);
1311 divInt_(y,2);
1312 squareMod_(s7,n);
1313 }
1314 return;
1315 }
1316
1317 //calculate np from n for the Montgomery multiplications
1318 copyInt_(s7,0);
1319 for (kn=n.length;kn>0 && !n[kn-1];kn--);
1320 np=radix-inverseModInt_(modInt(n,radix),radix);
1321 s7[kn]=1;
1322 multMod_(x ,s7,n); // x = x * 2**(kn*bp) mod n
1323
1324 if (s3.length!=x.length)
1325 s3=dup(x);
1326 else
1327 copy_(s3,x);
1328
1329 for (k1=y.length-1;k1>0 & !y[k1]; k1--); //k1=first nonzero element of y
1330 if (y[k1]==0) { //anything to the 0th power is 1
1331 copyInt_(x,1);
1332 return;
1333 }
1334 for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1); //k2=position of first 1 bit in y[k1]
1335 for (;;) {
1336 if (!(k2>>=1)) { //look at next bit of y
1337 k1--;
1338 if (k1<0) {
1339 mont_(x,one,n,np);
1340 return;
1341 }
1342 k2=1<<(bpe-1);
1343 }
1344 mont_(x,x,n,np);
1345
1346 if (k2 & y[k1]) //if next bit is a 1
1347 mont_(x,s3,n,np);
1348 }
1349}
1350
1351//do x=x*y*Ri mod n for bigInts x,y,n,
1352// where Ri = 2**(-kn*bpe) mod n, and kn is the
1353// number of elements in the n array, not
1354// counting leading zeros.
1355//x must be large enough to hold the answer.
1356//It's OK if x and y are the same variable.
1357//must have:
1358// x,y < n
1359// n is odd
1360// np = -(n^(-1)) mod radix
1361function mont_(x,y,n,np) {
1362 var i,j,c,ui,t;
1363 var kn=n.length;
1364 var ky=y.length;
1365
1366 if (sa.length!=kn)
1367 sa=new Array(kn);
1368
1369 for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
1370 //this function sometimes gives wrong answers when the next line is uncommented
1371 //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
1372
1373 copyInt_(sa,0);
1374
1375 //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
1376 for (i=0; i<kn; i++) {
1377 t=sa[0]+x[i]*y[0];
1378 ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
1379 c=(t+ui*n[0]) >> bpe;
1380 t=x[i];
1381
1382 //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
1383 for (j=1;j<ky;j++) {
1384 c+=sa[j]+t*y[j]+ui*n[j];
1385 sa[j-1]=c & mask;
1386 c>>=bpe;
1387 }
1388 for (;j<kn;j++) {
1389 c+=sa[j]+ui*n[j];
1390 sa[j-1]=c & mask;
1391 c>>=bpe;
1392 }
1393 sa[j-1]=c & mask;
1394 }
1395
1396 if (!greater(n,sa))
1397 sub_(sa,n);
1398 copy_(x,sa);
1399}
1400
1401
1402
1403
1404//#############################################################################
1405//#############################################################################
1406//#############################################################################
1407//#############################################################################
1408//#############################################################################
1409//#############################################################################
1410//#############################################################################
1411
1412
1413
1414
1415
1416//#############################################################################
1417
1418Clipperz.Crypto.BigInt = function (aValue, aBase) {
1419 varbase;
1420 varvalue;
1421
1422 if (typeof(aValue) == 'object') {
1423 this._internalValue = aValue;
1424 } else {
1425 if (typeof(aValue) == 'undefined') {
1426 value = "0";
1427 } else {
1428 value = aValue + "";
1429 }
1430
1431 if (typeof(aBase) == 'undefined') {
1432 base = 10;
1433 } else {
1434 base = aBase;
1435 }
1436
1437 this._internalValue = str2bigInt(value, base, 1, 1);
1438 }
1439
1440 return this;
1441}
1442
1443//=============================================================================
1444
1445MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, {
1446
1447 'clone': function() {
1448 return new Clipperz.Crypto.BigInt(this.internalValue());
1449 },
1450
1451 //-------------------------------------------------------------------------
1452
1453 'internalValue': function () {
1454 return this._internalValue;
1455 },
1456
1457 //-------------------------------------------------------------------------
1458
1459 'isBigInt': true,
1460
1461 //-------------------------------------------------------------------------
1462
1463 'toString': function(aBase) {
1464 return this.asString(aBase);
1465 },
1466
1467 //-------------------------------------------------------------------------
1468
1469 'asString': function (aBase, minimumLength) {
1470 varresult;
1471 varbase;
1472
1473 if (typeof(aBase) == 'undefined') {
1474 base = 10;
1475 } else {
1476 base = aBase;
1477 }
1478
1479 result = bigInt2str(this.internalValue(), base).toLowerCase();
1480
1481 if ((typeof(minimumLength) != 'undefined') && (result.length < minimumLength)) {
1482 var i, c;
1483 //MochiKit.Logging.logDebug(">>> FIXING BigInt.asString length issue")
1484 c = (minimumLength - result.length);
1485 for (i=0; i<c; i++) {
1486 result = '0' + result;
1487 }
1488 }
1489
1490 return result;
1491 },
1492
1493 //-------------------------------------------------------------------------
1494
1495 'asByteArray': function() {
1496 return new Clipperz.ByteArray("0x" + this.asString(16), 16);
1497 },
1498
1499 //-------------------------------------------------------------------------
1500
1501 'equals': function (aValue) {
1502 var result;
1503
1504 if (aValue.isBigInt) {
1505 result = equals(this.internalValue(), aValue.internalValue());
1506 } else if (typeof(aValue) == "number") {
1507 result = equalsInt(this.internalValue(), aValue);
1508 } else {
1509 throw Clipperz.Crypt.BigInt.exception.UnknownType;
1510 }
1511
1512 return result;
1513 },
1514
1515 //-------------------------------------------------------------------------
1516
1517 'compare': function(aValue) {
1518/*
1519 var result;
1520 var thisAsString;
1521 var aValueAsString;
1522
1523 thisAsString = this.asString(10);
1524 aValueAsString = aValue.asString(10);
1525
1526 result = MochiKit.Base.compare(thisAsString.length, aValueAsString.length);
1527 if (result == 0) {
1528 result = MochiKit.Base.compare(thisAsString, aValueAsString);
1529 }
1530
1531 return result;
1532*/
1533 var result;
1534
1535 if (equals(this.internalValue(), aValue.internalValue())) {
1536 result = 0;
1537 } else if (greater(this.internalValue(), aValue.internalValue())) {
1538 result = 1;
1539 } else {
1540 result = -1;
1541 }
1542
1543 return result;
1544 },
1545
1546 //-------------------------------------------------------------------------
1547
1548 'add': function (aValue) {
1549 var result;
1550
1551 if (aValue.isBigInt) {
1552 result = add(this.internalValue(), aValue.internalValue());
1553 } else {
1554 result = addInt(this.internalValue(), aValue);
1555 }
1556
1557 return new Clipperz.Crypto.BigInt(result);
1558 },
1559
1560 //-------------------------------------------------------------------------
1561
1562 'subtract': function (aValue) {
1563 var result;
1564 var value;
1565
1566 if (aValue.isBigInt) {
1567 value = aValue;
1568 } else {
1569 value = new Clipperz.Crypto.BigInt(aValue);
1570 }
1571
1572 result = sub(this.internalValue(), value.internalValue());
1573
1574 return new Clipperz.Crypto.BigInt(result);
1575 },
1576
1577 //-------------------------------------------------------------------------
1578
1579 'multiply': function (aValue, aModule) {
1580 var result;
1581 var value;
1582
1583 if (aValue.isBigInt) {
1584 value = aValue;
1585 } else {
1586 value = new Clipperz.Crypto.BigInt(aValue);
1587 }
1588
1589 if (typeof(aModule) == 'undefined') {
1590 result = mult(this.internalValue(), value.internalValue());
1591 } else {
1592 if (greater(this.internalValue(), value.internalValue())) {
1593 result = multMod(this.internalValue(), value.internalValue(), aModule);
1594 } else {
1595 result = multMod(value.internalValue(), this.internalValue(), aModule);
1596 }
1597 }
1598
1599 return new Clipperz.Crypto.BigInt(result);
1600 },
1601
1602 //-------------------------------------------------------------------------
1603
1604 'module': function (aModule) {
1605 varresult;
1606 var module;
1607
1608 if (aModule.isBigInt) {
1609 module = aModule;
1610 } else {
1611 module = new Clipperz.Crypto.BigInt(aModule);
1612 }
1613
1614 result = mod(this.internalValue(), module.internalValue());
1615
1616 return new Clipperz.Crypto.BigInt(result);
1617 },
1618
1619 //-------------------------------------------------------------------------
1620
1621 'powerModule': function(aValue, aModule) {
1622 varresult;
1623 varvalue;
1624 var module;
1625
1626 if (aValue.isBigInt) {
1627 value = aValue;
1628 } else {
1629 value = new Clipperz.Crypto.BigInt(aValue);
1630 }
1631
1632 if (aModule.isBigInt) {
1633 module = aModule;
1634 } else {
1635 module = new Clipperz.Crypto.BigInt(aModule);
1636 }
1637
1638 if (aValue == -1) {
1639 result = inverseMod(this.internalValue(), module.internalValue());
1640 } else {
1641 result = powMod(this.internalValue(), value.internalValue(), module.internalValue());
1642 }
1643
1644 return new Clipperz.Crypto.BigInt(result);
1645 },
1646
1647 //-------------------------------------------------------------------------
1648
1649 'xor': function(aValue) {
1650 var result;
1651 varthisByteArray;
1652 var aValueByteArray;
1653 var xorArray;
1654
1655 thisByteArray = new Clipperz.ByteArray("0x" + this.asString(16), 16);
1656 aValueByteArray = new Clipperz.ByteArray("0x" + aValue.asString(16), 16);
1657 xorArray = thisByteArray.xorMergeWithBlock(aValueByteArray, 'right');
1658 result = new Clipperz.Crypto.BigInt(xorArray.toHexString(), 16);
1659
1660 return result;
1661 },
1662
1663 //-------------------------------------------------------------------------
1664
1665 'shiftLeft': function(aNumberOfBitsToShift) {
1666 var result;
1667 var internalResult;
1668 var wholeByteToShift;
1669 var bitsLeftToShift;
1670
1671 wholeByteToShift = Math.floor(aNumberOfBitsToShift / 8);
1672 bitsLeftToShift = aNumberOfBitsToShift % 8;
1673
1674 if (wholeByteToShift == 0) {
1675 internalResult = this.internalValue();
1676 } else {
1677 var hexValue;
1678 var i,c;
1679
1680 hexValue = this.asString(16);
1681 c = wholeByteToShift;
1682 for (i=0; i<c; i++) {
1683 hexValue += "00";
1684 }
1685 internalResult = str2bigInt(hexValue, 16, 1, 1);
1686 }
1687
1688 if (bitsLeftToShift > 0) {
1689 leftShift_(internalResult, bitsLeftToShift);
1690 }
1691 result = new Clipperz.Crypto.BigInt(internalResult);
1692
1693 return result;
1694 },
1695
1696 //-------------------------------------------------------------------------
1697
1698 'bitSize': function() {
1699 return bitSize(this.internalValue());
1700 },
1701
1702 //-------------------------------------------------------------------------
1703
1704 'isBitSet': function(aBitPosition) {
1705 var result;
1706
1707 if (this.asByteArray().bitAtIndex(aBitPosition) == 0) {
1708 result = false;
1709 } else {
1710 result = true;
1711 };
1712
1713 return result;
1714 },
1715
1716 //-------------------------------------------------------------------------
1717 __syntaxFix__: "syntax fix"
1718
1719});
1720
1721//#############################################################################
1722
1723Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) {
1724 return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize));
1725}
1726
1727//#############################################################################
1728//#############################################################################
1729
1730Clipperz.Crypto.BigInt.ZERO = new Clipperz.Crypto.BigInt(0);
1731
1732//#############################################################################
1733
1734Clipperz.Crypto.BigInt.equals = function(a, b) {
1735 return a.equals(b);
1736}
1737
1738Clipperz.Crypto.BigInt.add = function(a, b) {
1739 return a.add(b);
1740}
1741
1742Clipperz.Crypto.BigInt.subtract = function(a, b) {
1743 return a.subtract(b);
1744}
1745
1746Clipperz.Crypto.BigInt.multiply = function(a, b, module) {
1747 return a.multiply(b, module);
1748}
1749
1750Clipperz.Crypto.BigInt.module = function(a, module) {
1751 return a.module(module);
1752}
1753
1754Clipperz.Crypto.BigInt.powerModule = function(a, b, module) {
1755 return a.powerModule(b, module);
1756}
1757
1758Clipperz.Crypto.BigInt.exception = {
1759 UnknownType: new MochiKit.Base.NamedError("Clipperz.Crypto.BigInt.exception.UnknownType")
1760}
diff --git a/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js b/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js
new file mode 100644
index 0000000..e91e823
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js
@@ -0,0 +1,1649 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
31
32if (typeof(Leemon) == 'undefined') { Leemon = {}; }
33if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; }
34if (typeof(Baird.Crypto.BigInt) == 'undefined') { Baird.Crypto.BigInt = {}; }
35
36
37//#############################################################################
38 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
39//#############################################################################
40
41////////////////////////////////////////////////////////////////////////////////////////
42// Big Integer Library v. 5.0
43// Created 2000, last modified 2006
44// Leemon Baird
45// www.leemon.com
46//
47// This file is public domain. You can use it for any purpose without restriction.
48// I do not guarantee that it is correct, so use it at your own risk. If you use
49// it for something interesting, I'd appreciate hearing about it. If you find
50// any bugs or make any improvements, I'd appreciate hearing about those too.
51// It would also be nice if my name and address were left in the comments.
52// But none of that is required.
53//
54// This code defines a bigInt library for arbitrary-precision integers.
55// A bigInt is an array of integers storing the value in chunks of bpe bits,
56// little endian (buff[0] is the least significant word).
57// Negative bigInts are stored two's complement.
58// Some functions assume their parameters have at least one leading zero element.
59// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
60// so the caller must make sure overflow won't happen.
61// For each function where a parameter is modified, that same
62// variable must not be used as another argument too.
63// So, you cannot square x by doing multMod_(x,x,n).
64// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
65//
66// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
67// For most functions, if it needs a BigInt as a local variable it will actually use
68// a global, and will only allocate to it when it's not the right size. This ensures
69// that when a function is called repeatedly with same-sized parameters, it only allocates
70// memory on the first call.
71//
72// Note that for cryptographic purposes, the calls to Math.random() must
73// be replaced with calls to a better pseudorandom number generator.
74//
75// In the following, "bigInt" means a bigInt with at least one leading zero element,
76// and "integer" means a nonnegative integer less than radix. In some cases, integer
77// can be negative. Negative bigInts are 2s complement.
78//
79// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
80//
81// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
82// function dup(x) //returns a copy of bigInt x
83// function findPrimes(n) //return array of all primes less than integer n
84// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
85// function str2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements
86// function trim(x,k) //return a copy of x with exactly k leading zero elements
87//
88// The following functions do not modify their inputs, so there is never a problem with the result being too big:
89//
90// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
91// function equals(x,y) //is the bigInt x equal to the bigint y?
92// function equalsInt(x,y) //is bigint x equal to integer y?
93// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
94// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
95// function isZero(x) //is the bigInt x equal to zero?
96// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)?
97// function modInt(x,n) //return x mod n for bigInt x and integer n.
98// function negative(x) //is bigInt x negative?
99//
100// The following functions do not modify their inputs, but allocate memory and call functions with underscores
101//
102// function add(x,y) //return (x+y) for bigInts x and y.
103// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
104// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
105// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
106// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
107// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
108// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
109// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
110// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
111// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
112//
113// The following functions write a bigInt result to one of the parameters, but
114// the result is never bigger than the original, so there can't be overflow problems:
115//
116// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
117// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
118// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
119// function mod_(x,n) //do x=x mod n for bigInts x and n.
120// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
121//
122// The following functions write a bigInt result to one of the parameters. The caller is responsible for
123// ensuring it is large enough to hold the result.
124//
125// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
126// function add_(x,y) //do x=x+y for bigInts x and y
127// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))
128// function copy_(x,y) //do x=y on bigInts x and y
129// function copyInt_(x,n) //do x=n on bigInt x and integer n
130// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.
131// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r
132// function eGCD_(x,y,d,a,b) //sets a,b,d to positive big integers such that d = GCD_(x,y) = a*x-b*y
133// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist
134// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
135// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.
136// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b
137// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys
138// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)
139// function mult_(x,y) //do x=x*y for bigInts x and y.
140// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.
141// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.
142// function powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.
143// function randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.
144// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.
145// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n
146// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.
147// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.
148//
149// The following functions are based on algorithms from the _Handbook of Applied Cryptography_
150// powMod_() = algorithm 14.94, Montgomery exponentiation
151// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_
152// GCD_() = algorothm 14.57, Lehmer's algorithm
153// mont_() = algorithm 14.36, Montgomery multiplication
154// divide_() = algorithm 14.20 Multiple-precision division
155// squareMod_() = algorithm 14.16 Multiple-precision squaring
156// randTruePrime_() = algorithm 4.62, Maurer's algorithm
157// millerRabin() = algorithm 4.24, Miller-Rabin algorithm
158//
159// Profiling shows:
160// randTruePrime_() spends:
161// 10% of its time in calls to powMod_()
162// 85% of its time in calls to millerRabin()
163// millerRabin() spends:
164// 99% of its time in calls to powMod_() (always with a base of 2)
165// powMod_() spends:
166// 94% of its time in calls to mont_() (almost always with x==y)
167//
168// This suggests there are several ways to speed up this library slightly:
169// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)
170// -- this should especially focus on being fast when raising 2 to a power mod n
171// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test
172// - tune the parameters in randTruePrime_(), including c, m, and recLimit
173// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking
174// within the loop when all the parameters are the same length.
175//
176// There are several ideas that look like they wouldn't help much at all:
177// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)
178// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)
179// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square
180// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that
181// method would be slower. This is unfortunate because the code currently spends almost all of its time
182// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring
183// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded
184// sentences that seem to imply it's faster to do a non-modular square followed by a single
185// Montgomery reduction, but that's obviously wrong.
186////////////////////////////////////////////////////////////////////////////////////////
187
188//
189 //The whole library has been moved into the Baird.Crypto.BigInt scope by Giulio Cesare Solaroli <giulio.cesare@clipperz.com>
190//
191Baird.Crypto.BigInt.VERSION = "5.0";
192Baird.Crypto.BigInt.NAME = "Baird.Crypto.BigInt";
193
194MochiKit.Base.update(Baird.Crypto.BigInt, {
195 //globals
196 'bpe': 0, //bits stored per array element
197 'mask': 0, //AND this with an array element to chop it down to bpe bits
198 'radix': Baird.Crypto.BigInt.mask + 1,//equals 2^bpe. A single 1 bit to the left of the last bit of mask.
199
200 //the digits for converting to different bases
201 'digitsStr': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-',
202
203//initialize the global variables
204for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
205bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
206mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
207radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask
208one=int2bigInt(1,1,1); //constant used in powMod_()
209
210//the following global variables are scratchpad memory to
211//reduce dynamic memory allocation in the inner loop
212t=new Array(0);
213ss=t; //used in mult_()
214s0=t; //used in multMod_(), squareMod_()
215s1=t; //used in powMod_(), multMod_(), squareMod_()
216s2=t; //used in powMod_(), multMod_()
217s3=t; //used in powMod_()
218s4=t; s5=t; //used in mod_()
219s6=t; //used in bigInt2str()
220s7=t; //used in powMod_()
221T=t; //used in GCD_()
222sa=t; //used in mont_()
223mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin()
224eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_()
225md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()
226
227primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t;
228 s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_()
229
230////////////////////////////////////////////////////////////////////////////////////////
231
232 //return array of all primes less than integer n
233 'findPrimes': function(n) {
234 var i,s,p,ans;
235 s=new Array(n);
236 for (i=0;i<n;i++)
237 s[i]=0;
238 s[0]=2;
239 p=0; //first p elements of s are primes, the rest are a sieve
240 for(;s[p]<n;) { //s[p] is the pth prime
241 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]
242 s[i]=1;
243 p++;
244 s[p]=s[p-1]+1;
245 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)
246 }
247 ans=new Array(p);
248 for(i=0;i<p;i++)
249 ans[i]=s[i];
250 return ans;
251 },
252
253 //does a single round of Miller-Rabin base b consider x to be a possible prime?
254 //x is a bigInt, and b is an integer
255 'millerRabin': function(x,b) {
256 var i,j,k,s;
257
258 if (mr_x1.length!=x.length) {
259 mr_x1=dup(x);
260 mr_r=dup(x);
261 mr_a=dup(x);
262 }
263
264 copyInt_(mr_a,b);
265 copy_(mr_r,x);
266 copy_(mr_x1,x);
267
268 addInt_(mr_r,-1);
269 addInt_(mr_x1,-1);
270
271 //s=the highest power of two that divides mr_r
272 k=0;
273 for (i=0;i<mr_r.length;i++)
274 for (j=1;j<mask;j<<=1)
275 if (x[i] & j) {
276 s=(k<mr_r.length+bpe ? k : 0);
277 i=mr_r.length;
278 j=mask;
279 } else
280 k++;
281
282 if (s)
283 rightShift_(mr_r,s);
284
285 powMod_(mr_a,mr_r,x);
286
287 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {
288 j=1;
289 while (j<=s-1 && !equals(mr_a,mr_x1)) {
290 squareMod_(mr_a,x);
291 if (equalsInt(mr_a,1)) {
292 return 0;
293 }
294 j++;
295 }
296 if (!equals(mr_a,mr_x1)) {
297 return 0;
298 }
299 }
300
301 return 1;
302 },
303
304 //returns how many bits long the bigInt is, not counting leading zeros.
305 'bitSize': function(x) {
306 var j,z,w;
307 for (j=x.length-1; (x[j]==0) && (j>0); j--);
308 for (z=0,w=x[j]; w; (w>>=1),z++);
309 z+=bpe*j;
310 return z;
311 },
312
313 //return a copy of x with at least n elements, adding leading zeros if needed
314 'expand': function(x,n) {
315 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);
316 copy_(ans,x);
317 return ans;
318 },
319
320 //return a k-bit true random prime using Maurer's algorithm.
321 'randTruePrime': function(k) {
322 var ans=int2bigInt(0,k,0);
323 randTruePrime_(ans,k);
324 return trim(ans,1);
325 },
326
327 //return a new bigInt equal to (x mod n) for bigInts x and n.
328 'mod': function(x,n) {
329 var ans=dup(x);
330 mod_(ans,n);
331 return trim(ans,1);
332 },
333
334 //return (x+n) where x is a bigInt and n is an integer.
335 'addInt': function(x,n) {
336 var ans=expand(x,x.length+1);
337 addInt_(ans,n);
338 return trim(ans,1);
339 },
340
341 //return x*y for bigInts x and y. This is faster when y<x.
342 'mult': function(x,y) {
343 var ans=expand(x,x.length+y.length);
344 mult_(ans,y);
345 return trim(ans,1);
346 },
347
348 //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
349 'powMod': function(x,y,n) {
350 var ans=expand(x,n.length);
351 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't
352 return trim(ans,1);
353 },
354
355 //return (x-y) for bigInts x and y. Negative answers will be 2s complement
356 'sub': function(x,y) {
357 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
358 sub_(ans,y);
359 return trim(ans,1);
360 },
361
362 //return (x+y) for bigInts x and y.
363 'add': function(x,y) {
364 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
365 add_(ans,y);
366 return trim(ans,1);
367 },
368
369 //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
370 'inverseMod': function(x,n) {
371 var ans=expand(x,n.length);
372 var s;
373 s=inverseMod_(ans,n);
374 return s ? trim(ans,1) : null;
375 },
376
377 //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
378 'multMod': function(x,y,n) {
379 var ans=expand(x,n.length);
380 multMod_(ans,y,n);
381 return trim(ans,1);
382 },
383
384 //generate a k-bit true random prime using Maurer's algorithm,
385 //and put it into ans. The bigInt ans must be large enough to hold it.
386 'randTruePrime_': function(ans,k) {
387 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;
388
389 if (primes.length==0)
390 primes=findPrimes(30000); //check for divisibility by primes <=30000
391
392 if (pows.length==0) {
393 pows=new Array(512);
394 for (j=0;j<512;j++) {
395 pows[j]=Math.pow(2,j/511.-1.);
396 }
397 }
398
399 //c and m should be tuned for a particular machine and value of k, to maximize speed
400 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC)
401 c=0.1;
402 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
403 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit
404
405 if (s_i2.length!=ans.length) {
406 s_i2=dup(ans);
407 s_R =dup(ans);
408 s_n1=dup(ans);
409 s_r2=dup(ans);
410 s_d =dup(ans);
411 s_x1=dup(ans);
412 s_x2=dup(ans);
413 s_b =dup(ans);
414 s_n =dup(ans);
415 s_i =dup(ans);
416 s_rm=dup(ans);
417 s_q =dup(ans);
418 s_a =dup(ans);
419 s_aa=dup(ans);
420 }
421
422 if (k <= recLimit) { //generate small random primes by trial division up to its square root
423 pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k)
424 copyInt_(ans,0);
425 for (dd=1;dd;) {
426 dd=0;
427 ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k)); //random, k-bit, odd integer, with msb 1
428 for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k)
429 if (0==(ans[0]%primes[j])) {
430 dd=1;
431 break;
432 }
433 }
434 }
435 carry_(ans);
436 return;
437 }
438
439 B=c*k*k; //try small primes up to B (or all the primes[] array if the largest is less than B).
440 if (k>2*m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
441 for (r=1; k-k*r<=m; )
442 r=pows[Math.floor(Math.random()*512)]; //r=Math.pow(2,Math.random()-1);
443 else
444 r=.5;
445
446 //simulation suggests the more complex algorithm using r=.333 is only slightly faster.
447
448 recSize=Math.floor(r*k)+1;
449
450 randTruePrime_(s_q,recSize);
451 copyInt_(s_i2,0);
452 s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe)); //s_i2=2^(k-2)
453 divide_(s_i2,s_q,s_i,s_rm); //s_i=floor((2^(k-1))/(2q))
454
455 z=bitSize(s_i);
456
457 for (;;) {
458 for (;;) { //generate z-bit numbers until one falls in the range [0,s_i-1]
459 randBigInt_(s_R,z,0);
460 if (greater(s_i,s_R))
461 break;
462 } //now s_R is in the range [0,s_i-1]
463 addInt_(s_R,1); //now s_R is in the range [1,s_i]
464 add_(s_R,s_i); //now s_R is in the range [s_i+1,2*s_i]
465
466 copy_(s_n,s_q);
467 mult_(s_n,s_R);
468 multInt_(s_n,2);
469 addInt_(s_n,1); //s_n=2*s_R*s_q+1
470
471 copy_(s_r2,s_R);
472 multInt_(s_r2,2); //s_r2=2*s_R
473
474 //check s_n for divisibility by small primes up to B
475 for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++)
476 if (modInt(s_n,primes[j])==0) {
477 divisible=1;
478 break;
479 }
480
481 if (!divisible) //if it passes small primes check, then try a single Miller-Rabin base 2
482 if (!millerRabin(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_
483 divisible=1;
484
485 if (!divisible) { //if it passes that test, continue checking s_n
486 addInt_(s_n,-3);
487 for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--); //strip leading zeros
488 for (zz=0,w=s_n[j]; w; (w>>=1),zz++);
489 zz+=bpe*j; //zz=number of bits in s_n, ignoring leading zeros
490 for (;;) { //generate z-bit numbers until one falls in the range [0,s_n-1]
491 randBigInt_(s_a,zz,0);
492 if (greater(s_n,s_a))
493 break;
494 } //now s_a is in the range [0,s_n-1]
495 addInt_(s_n,3); //now s_a is in the range [0,s_n-4]
496 addInt_(s_a,2); //now s_a is in the range [2,s_n-2]
497 copy_(s_b,s_a);
498 copy_(s_n1,s_n);
499 addInt_(s_n1,-1);
500 powMod_(s_b,s_n1,s_n); //s_b=s_a^(s_n-1) modulo s_n
501 addInt_(s_b,-1);
502 if (isZero(s_b)) {
503 copy_(s_b,s_a);
504 powMod_(s_b,s_r2,s_n);
505 addInt_(s_b,-1);
506 copy_(s_aa,s_n);
507 copy_(s_d,s_b);
508 GCD_(s_d,s_n); //if s_b and s_n are relatively prime, then s_n is a prime
509 if (equalsInt(s_d,1)) {
510 copy_(ans,s_aa);
511 return; //if we've made it this far, then s_n is absolutely guaranteed to be prime
512 }
513 }
514 }
515 }
516 },
517
518 //set b to an n-bit random BigInt. If s=1, then nth bit (most significant bit) is set to 1.
519 //array b must be big enough to hold the result. Must have n>=1
520 'randBigInt_': function(b,n,s) {
521 var i,a;
522 for (i=0;i<b.length;i++)
523 b[i]=0;
524 a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt
525 for (i=0;i<a;i++) {
526 b[i]=Math.floor(Math.random()*(1<<(bpe-1)));
527 }
528 b[a-1] &= (2<<((n-1)%bpe))-1;
529 if (s)
530 b[a-1] |= (1<<((n-1)%bpe));
531 },
532
533 //set x to the greatest common divisor of x and y.
534 //x,y are bigInts with the same number of elements. y is destroyed.
535 'GCD_': function(x,y) {
536 var i,xp,yp,A,B,C,D,q,sing;
537 if (T.length!=x.length)
538 T=dup(x);
539
540 sing=1;
541 while (sing) { //while y has nonzero elements other than y[0]
542 sing=0;
543 for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0
544 if (y[i]) {
545 sing=1;
546 break;
547 }
548 if (!sing) break; //quit when y all zero elements except possibly y[0]
549
550 for (i=x.length;!x[i] && i>=0;i--); //find most significant element of x
551 xp=x[i];
552 yp=y[i];
553 A=1; B=0; C=0; D=1;
554 while ((yp+C) && (yp+D)) {
555 q =Math.floor((xp+A)/(yp+C));
556 qp=Math.floor((xp+B)/(yp+D));
557 if (q!=qp)
558 break;
559 t= A-q*C; A=C; C=t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)
560 t= B-q*D; B=D; D=t;
561 t=xp-q*yp; xp=yp; yp=t;
562 }
563 if (B) {
564 copy_(T,x);
565 linComb_(x,y,A,B); //x=A*x+B*y
566 linComb_(y,T,D,C); //y=D*y+C*T
567 } else {
568 mod_(x,y);
569 copy_(T,x);
570 copy_(x,y);
571 copy_(y,T);
572 }
573 }
574 if (y[0]==0)
575 return;
576 t=modInt(x,y[0]);
577 copyInt_(x,y[0]);
578 y[0]=t;
579 while (y[0]) {
580 x[0]%=y[0];
581 t=x[0]; x[0]=y[0]; y[0]=t;
582 }
583 },
584
585//do x=x**(-1) mod n, for bigInts x and n.
586//If no inverse exists, it sets x to zero and returns 0, else it returns 1.
587//The x array must be at least as large as the n array.
588function inverseMod_(x,n) {
589 var k=1+2*Math.max(x.length,n.length);
590
591 if(!(x[0]&1) && !(n[0]&1)) { //if both inputs are even, then inverse doesn't exist
592 copyInt_(x,0);
593 return 0;
594 }
595
596 if (eg_u.length!=k) {
597 eg_u=new Array(k);
598 eg_v=new Array(k);
599 eg_A=new Array(k);
600 eg_B=new Array(k);
601 eg_C=new Array(k);
602 eg_D=new Array(k);
603 }
604
605 copy_(eg_u,x);
606 copy_(eg_v,n);
607 copyInt_(eg_A,1);
608 copyInt_(eg_B,0);
609 copyInt_(eg_C,0);
610 copyInt_(eg_D,1);
611 for (;;) {
612 while(!(eg_u[0]&1)) { //while eg_u is even
613 halve_(eg_u);
614 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2
615 halve_(eg_A);
616 halve_(eg_B);
617 } else {
618 add_(eg_A,n); halve_(eg_A);
619 sub_(eg_B,x); halve_(eg_B);
620 }
621 }
622
623 while (!(eg_v[0]&1)) { //while eg_v is even
624 halve_(eg_v);
625 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2
626 halve_(eg_C);
627 halve_(eg_D);
628 } else {
629 add_(eg_C,n); halve_(eg_C);
630 sub_(eg_D,x); halve_(eg_D);
631 }
632 }
633
634 if (!greater(eg_v,eg_u)) { //eg_v <= eg_u
635 sub_(eg_u,eg_v);
636 sub_(eg_A,eg_C);
637 sub_(eg_B,eg_D);
638 } else { //eg_v > eg_u
639 sub_(eg_v,eg_u);
640 sub_(eg_C,eg_A);
641 sub_(eg_D,eg_B);
642 }
643
644 if (equalsInt(eg_u,0)) {
645 if (negative(eg_C)) //make sure answer is nonnegative
646 add_(eg_C,n);
647 copy_(x,eg_C);
648
649 if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse
650 copyInt_(x,0);
651 return 0;
652 }
653 return 1;
654 }
655 }
656}
657
658//return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
659function inverseModInt_(x,n) {
660 var a=1,b=0,t;
661 for (;;) {
662 if (x==1) return a;
663 if (x==0) return 0;
664 b-=a*Math.floor(n/x);
665 n%=x;
666
667 if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to +=
668 if (n==0) return 0;
669 a-=b*Math.floor(x/n);
670 x%=n;
671 }
672}
673
674//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:
675// v = GCD_(x,y) = a*x-b*y
676//The bigInts v, a, b, must have exactly as many elements as the larger of x and y.
677function eGCD_(x,y,v,a,b) {
678 var g=0;
679 var k=Math.max(x.length,y.length);
680 if (eg_u.length!=k) {
681 eg_u=new Array(k);
682 eg_A=new Array(k);
683 eg_B=new Array(k);
684 eg_C=new Array(k);
685 eg_D=new Array(k);
686 }
687 while(!(x[0]&1) && !(y[0]&1)) { //while x and y both even
688 halve_(x);
689 halve_(y);
690 g++;
691 }
692 copy_(eg_u,x);
693 copy_(v,y);
694 copyInt_(eg_A,1);
695 copyInt_(eg_B,0);
696 copyInt_(eg_C,0);
697 copyInt_(eg_D,1);
698 for (;;) {
699 while(!(eg_u[0]&1)) { //while u is even
700 halve_(eg_u);
701 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2
702 halve_(eg_A);
703 halve_(eg_B);
704 } else {
705 add_(eg_A,y); halve_(eg_A);
706 sub_(eg_B,x); halve_(eg_B);
707 }
708 }
709
710 while (!(v[0]&1)) { //while v is even
711 halve_(v);
712 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2
713 halve_(eg_C);
714 halve_(eg_D);
715 } else {
716 add_(eg_C,y); halve_(eg_C);
717 sub_(eg_D,x); halve_(eg_D);
718 }
719 }
720
721 if (!greater(v,eg_u)) { //v<=u
722 sub_(eg_u,v);
723 sub_(eg_A,eg_C);
724 sub_(eg_B,eg_D);
725 } else { //v>u
726 sub_(v,eg_u);
727 sub_(eg_C,eg_A);
728 sub_(eg_D,eg_B);
729 }
730 if (equalsInt(eg_u,0)) {
731 if (negative(eg_C)) { //make sure a (C)is nonnegative
732 add_(eg_C,y);
733 sub_(eg_D,x);
734 }
735 multInt_(eg_D,-1); ///make sure b (D) is nonnegative
736 copy_(a,eg_C);
737 copy_(b,eg_D);
738 leftShift_(v,g);
739 return;
740 }
741 }
742}
743
744
745//is bigInt x negative?
746function negative(x) {
747 return ((x[x.length-1]>>(bpe-1))&1);
748}
749
750
751//is (x << (shift*bpe)) > y?
752//x and y are nonnegative bigInts
753//shift is a nonnegative integer
754function greaterShift(x,y,shift) {
755 var kx=x.length, ky=y.length;
756 k=((kx+shift)<ky) ? (kx+shift) : ky;
757 for (i=ky-1-shift; i<kx && i>=0; i++)
758 if (x[i]>0)
759 return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger
760 for (i=kx-1+shift; i<ky; i++)
761 if (y[i]>0)
762 return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger
763 for (i=k-1; i>=shift; i--)
764 if (x[i-shift]>y[i]) return 1;
765 else if (x[i-shift]<y[i]) return 0;
766 return 0;
767}
768
769//is x > y? (x and y both nonnegative)
770function greater(x,y) {
771 var i;
772 var k=(x.length<y.length) ? x.length : y.length;
773
774 for (i=x.length;i<y.length;i++)
775 if (y[i])
776 return 0; //y has more digits
777
778 for (i=y.length;i<x.length;i++)
779 if (x[i])
780 return 1; //x has more digits
781
782 for (i=k-1;i>=0;i--)
783 if (x[i]>y[i])
784 return 1;
785 else if (x[i]<y[i])
786 return 0;
787 return 0;
788}
789
790//divide_ x by y giving quotient q and remainder r. (q=floor(x/y), r=x mod y). All 4 are bigints.
791//x must have at least one leading zero element.
792//y must be nonzero.
793//q and r must be arrays that are exactly the same length as x.
794//the x array must have at least as many elements as y.
795function divide_(x,y,q,r) {
796 var kx, ky;
797 var i,j,y1,y2,c,a,b;
798 copy_(r,x);
799 for (ky=y.length;y[ky-1]==0;ky--); //kx,ky is number of elements in x,y, not including leading zeros
800 for (kx=r.length;r[kx-1]==0 && kx>ky;kx--);
801
802 //normalize: ensure the most significant element of y has its highest bit set
803 b=y[ky-1];
804 for (a=0; b; a++)
805 b>>=1;
806 a=bpe-a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element
807 leftShift_(y,a); //multiply both by 1<<a now, then divide_ both by that at the end
808 leftShift_(r,a);
809
810 copyInt_(q,0); // q=0
811 while (!greaterShift(y,r,kx-ky)) { // while (leftShift_(y,kx-ky) <= r) {
812 subShift_(r,y,kx-ky); // r=r-leftShift_(y,kx-ky)
813 q[kx-ky]++; // q[kx-ky]++;
814 } // }
815
816 for (i=kx-1; i>=ky; i--) {
817 if (r[i]==y[ky-1])
818 q[i-ky]=mask;
819 else
820 q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]);
821
822 //The following for(;;) loop is equivalent to the commented while loop,
823 //except that the uncommented version avoids overflow.
824 //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0
825 // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])
826 // q[i-ky]--;
827 for (;;) {
828 y2=(ky>1 ? y[ky-2] : 0)*q[i-ky];
829 c=y2>>bpe;
830 y2=y2 & mask;
831 y1=c+q[i-ky]*y[ky-1];
832 c=y1>>bpe;
833 y1=y1 & mask;
834
835 if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i])
836 q[i-ky]--;
837 else
838 break;
839 }
840
841 linCombShift_(r,y,-q[i-ky],i-ky); //r=r-q[i-ky]*leftShift_(y,i-ky)
842 if (negative(r)) {
843 addShift_(r,y,i-ky); //r=r+leftShift_(y,i-ky)
844 q[i-ky]--;
845 }
846 }
847
848 rightShift_(y,a); //undo the normalization step
849 rightShift_(r,a); //undo the normalization step
850}
851
852//do carries and borrows so each element of the bigInt x fits in bpe bits.
853function carry_(x) {
854 var i,k,c,b;
855 k=x.length;
856 c=0;
857 for (i=0;i<k;i++) {
858 c+=x[i];
859 b=0;
860 if (c<0) {
861 b=-(c>>bpe);
862 c+=b*radix;
863 }
864 x[i]=c & mask;
865 c=(c>>bpe)-b;
866 }
867}
868
869//return x mod n for bigInt x and integer n.
870function modInt(x,n) {
871 var i,c=0;
872 for (i=x.length-1; i>=0; i--)
873 c=(c*radix+x[i])%n;
874 return c;
875}
876
877//convert the integer t into a bigInt with at least the given number of bits.
878//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)
879//Pad the array with leading zeros so that it has at least minSize elements.
880//There will always be at least one leading 0 element.
881function int2bigInt(t,bits,minSize) {
882 var i,k;
883 k=Math.ceil(bits/bpe)+1;
884 k=minSize>k ? minSize : k;
885 buff=new Array(k);
886 copyInt_(buff,t);
887 return buff;
888}
889
890//return the bigInt given a string representation in a given base.
891//Pad the array with leading zeros so that it has at least minSize elements.
892//If base=-1, then it reads in a space-separated list of array elements in decimal.
893//The array will always have at least one leading zero, unless base=-1.
894function str2bigInt(s,base,minSize) {
895 var d, i, j, x, y, kk;
896 var k=s.length;
897 if (base==-1) { //comma-separated list of array elements in decimal
898 x=new Array(0);
899 for (;;) {
900 y=new Array(x.length+1);
901 for (i=0;i<x.length;i++)
902 y[i+1]=x[i];
903 y[0]=parseInt(s,10);
904 x=y;
905 d=s.indexOf(',',0);
906 if (d<1)
907 break;
908 s=s.substring(d+1);
909 if (s.length==0)
910 break;
911 }
912 if (x.length<minSize) {
913 y=new Array(minSize);
914 copy_(y,x);
915 return y;
916 }
917 return x;
918 }
919
920 x=int2bigInt(0,base*k,0);
921 for (i=0;i<k;i++) {
922 d=digitsStr.indexOf(s.substring(i,i+1),0);
923 if (base<=36 && d>=36) //convert lowercase to uppercase if base<=36
924 d-=26;
925 if (d<base && d>=0) { //ignore illegal characters
926 multInt_(x,base);
927 addInt_(x,d);
928 }
929 }
930
931 for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros
932 k=minSize>k+1 ? minSize : k+1;
933 y=new Array(k);
934 kk=k<x.length ? k : x.length;
935 for (i=0;i<kk;i++)
936 y[i]=x[i];
937 for (;i<k;i++)
938 y[i]=0;
939 return y;
940}
941
942//is bigint x equal to integer y?
943//y must have less than bpe bits
944function equalsInt(x,y) {
945 var i;
946 if (x[0]!=y)
947 return 0;
948 for (i=1;i<x.length;i++)
949 if (x[i])
950 return 0;
951 return 1;
952}
953
954//are bigints x and y equal?
955//this works even if x and y are different lengths and have arbitrarily many leading zeros
956function equals(x,y) {
957 var i;
958 var k=x.length<y.length ? x.length : y.length;
959 for (i=0;i<k;i++)
960 if (x[i]!=y[i])
961 return 0;
962 if (x.length>y.length) {
963 for (;i<x.length;i++)
964 if (x[i])
965 return 0;
966 } else {
967 for (;i<y.length;i++)
968 if (y[i])
969 return 0;
970 }
971 return 1;
972}
973
974//is the bigInt x equal to zero?
975function isZero(x) {
976 var i;
977 for (i=0;i<x.length;i++)
978 if (x[i])
979 return 0;
980 return 1;
981}
982
983//convert a bigInt into a string in a given base, from base 2 up to base 95.
984//Base -1 prints the contents of the array representing the number.
985function bigInt2str(x,base) {
986 var i,t,s="";
987
988 if (s6.length!=x.length)
989 s6=dup(x);
990 else
991 copy_(s6,x);
992
993 if (base==-1) { //return the list of array contents
994 for (i=x.length-1;i>0;i--)
995 s+=x[i]+',';
996 s+=x[0];
997 }
998 else { //return it in the given base
999 while (!isZero(s6)) {
1000 t=divInt_(s6,base); //t=s6 % base; s6=floor(s6/base);
1001 s=digitsStr.substring(t,t+1)+s;
1002 }
1003 }
1004 if (s.length==0)
1005 s="0";
1006 return s;
1007}
1008
1009//returns a duplicate of bigInt x
1010function dup(x) {
1011 var i;
1012 buff=new Array(x.length);
1013 copy_(buff,x);
1014 return buff;
1015}
1016
1017//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
1018function copy_(x,y) {
1019 var i;
1020 var k=x.length<y.length ? x.length : y.length;
1021 for (i=0;i<k;i++)
1022 x[i]=y[i];
1023 for (i=k;i<x.length;i++)
1024 x[i]=0;
1025}
1026
1027//do x=y on bigInt x and integer y.
1028function copyInt_(x,n) {
1029 var i,c;
1030 for (c=n,i=0;i<x.length;i++) {
1031 x[i]=c & mask;
1032 c>>=bpe;
1033 }
1034}
1035
1036//do x=x+n where x is a bigInt and n is an integer.
1037//x must be large enough to hold the result.
1038function addInt_(x,n) {
1039 var i,k,c,b;
1040 x[0]+=n;
1041 k=x.length;
1042 c=0;
1043 for (i=0;i<k;i++) {
1044 c+=x[i];
1045 b=0;
1046 if (c<0) {
1047 b=-(c>>bpe);
1048 c+=b*radix;
1049 }
1050 x[i]=c & mask;
1051 c=(c>>bpe)-b;
1052 if (!c) return; //stop carrying as soon as the carry_ is zero
1053 }
1054}
1055
1056//right shift bigInt x by n bits. 0 <= n < bpe.
1057function rightShift_(x,n) {
1058 var i;
1059 var k=Math.floor(n/bpe);
1060 if (k) {
1061 for (i=0;i<x.length-k;i++) //right shift x by k elements
1062 x[i]=x[i+k];
1063 for (;i<x.length;i++)
1064 x[i]=0;
1065 n%=bpe;
1066 }
1067 for (i=0;i<x.length-1;i++) {
1068 x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n));
1069 }
1070 x[i]>>=n;
1071}
1072
1073//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
1074function halve_(x) {
1075 var i;
1076 for (i=0;i<x.length-1;i++) {
1077 x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1));
1078 }
1079 x[i]=(x[i]>>1) | (x[i] & (radix>>1)); //most significant bit stays the same
1080}
1081
1082//left shift bigInt x by n bits.
1083function leftShift_(x,n) {
1084 var i;
1085 var k=Math.floor(n/bpe);
1086 if (k) {
1087 for (i=x.length; i>=k; i--) //left shift x by k elements
1088 x[i]=x[i-k];
1089 for (;i>=0;i--)
1090 x[i]=0;
1091 n%=bpe;
1092 }
1093 if (!n)
1094 return;
1095 for (i=x.length-1;i>0;i--) {
1096 x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n)));
1097 }
1098 x[i]=mask & (x[i]<<n);
1099}
1100
1101//do x=x*n where x is a bigInt and n is an integer.
1102//x must be large enough to hold the result.
1103function multInt_(x,n) {
1104 var i,k,c,b;
1105 if (!n)
1106 return;
1107 k=x.length;
1108 c=0;
1109 for (i=0;i<k;i++) {
1110 c+=x[i]*n;
1111 b=0;
1112 if (c<0) {
1113 b=-(c>>bpe);
1114 c+=b*radix;
1115 }
1116 x[i]=c & mask;
1117 c=(c>>bpe)-b;
1118 }
1119}
1120
1121//do x=floor(x/n) for bigInt x and integer n, and return the remainder
1122function divInt_(x,n) {
1123 var i,r=0,s;
1124 for (i=x.length-1;i>=0;i--) {
1125 s=r*radix+x[i];
1126 x[i]=Math.floor(s/n);
1127 r=s%n;
1128 }
1129 return r;
1130}
1131
1132//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.
1133//x must be large enough to hold the answer.
1134function linComb_(x,y,a,b) {
1135 var i,c,k,kk;
1136 k=x.length<y.length ? x.length : y.length;
1137 kk=x.length;
1138 for (c=0,i=0;i<k;i++) {
1139 c+=a*x[i]+b*y[i];
1140 x[i]=c & mask;
1141 c>>=bpe;
1142 }
1143 for (i=k;i<kk;i++) {
1144 c+=a*x[i];
1145 x[i]=c & mask;
1146 c>>=bpe;
1147 }
1148}
1149
1150//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.
1151//x must be large enough to hold the answer.
1152function linCombShift_(x,y,b,ys) {
1153 var i,c,k,kk;
1154 k=x.length<ys+y.length ? x.length : ys+y.length;
1155 kk=x.length;
1156 for (c=0,i=ys;i<k;i++) {
1157 c+=x[i]+b*y[i-ys];
1158 x[i]=c & mask;
1159 c>>=bpe;
1160 }
1161 for (i=k;c && i<kk;i++) {
1162 c+=x[i];
1163 x[i]=c & mask;
1164 c>>=bpe;
1165 }
1166}
1167
1168//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1169//x must be large enough to hold the answer.
1170function addShift_(x,y,ys) {
1171 var i,c,k,kk;
1172 k=x.length<ys+y.length ? x.length : ys+y.length;
1173 kk=x.length;
1174 for (c=0,i=ys;i<k;i++) {
1175 c+=x[i]+y[i-ys];
1176 x[i]=c & mask;
1177 c>>=bpe;
1178 }
1179 for (i=k;c && i<kk;i++) {
1180 c+=x[i];
1181 x[i]=c & mask;
1182 c>>=bpe;
1183 }
1184}
1185
1186//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1187//x must be large enough to hold the answer.
1188function subShift_(x,y,ys) {
1189 var i,c,k,kk;
1190 k=x.length<ys+y.length ? x.length : ys+y.length;
1191 kk=x.length;
1192 for (c=0,i=ys;i<k;i++) {
1193 c+=x[i]-y[i-ys];
1194 x[i]=c & mask;
1195 c>>=bpe;
1196 }
1197 for (i=k;c && i<kk;i++) {
1198 c+=x[i];
1199 x[i]=c & mask;
1200 c>>=bpe;
1201 }
1202}
1203
1204//do x=x-y for bigInts x and y.
1205//x must be large enough to hold the answer.
1206//negative answers will be 2s complement
1207function sub_(x,y) {
1208 var i,c,k,kk;
1209 k=x.length<y.length ? x.length : y.length;
1210 for (c=0,i=0;i<k;i++) {
1211 c+=x[i]-y[i];
1212 x[i]=c & mask;
1213 c>>=bpe;
1214 }
1215 for (i=k;c && i<x.length;i++) {
1216 c+=x[i];
1217 x[i]=c & mask;
1218 c>>=bpe;
1219 }
1220}
1221
1222//do x=x+y for bigInts x and y.
1223//x must be large enough to hold the answer.
1224function add_(x,y) {
1225 var i,c,k,kk;
1226 k=x.length<y.length ? x.length : y.length;
1227 for (c=0,i=0;i<k;i++) {
1228 c+=x[i]+y[i];
1229 x[i]=c & mask;
1230 c>>=bpe;
1231 }
1232 for (i=k;c && i<x.length;i++) {
1233 c+=x[i];
1234 x[i]=c & mask;
1235 c>>=bpe;
1236 }
1237}
1238
1239//do x=x*y for bigInts x and y. This is faster when y<x.
1240function mult_(x,y) {
1241 var i;
1242 if (ss.length!=2*x.length)
1243 ss=new Array(2*x.length);
1244 copyInt_(ss,0);
1245 for (i=0;i<y.length;i++)
1246 if (y[i])
1247 linCombShift_(ss,x,y[i],i); //ss=1*ss+y[i]*(x<<(i*bpe))
1248 copy_(x,ss);
1249}
1250
1251//do x=x mod n for bigInts x and n.
1252function mod_(x,n) {
1253 if (s4.length!=x.length)
1254 s4=dup(x);
1255 else
1256 copy_(s4,x);
1257 if (s5.length!=x.length)
1258 s5=dup(x);
1259 divide_(s4,n,s5,x); //x = remainder of s4 / n
1260}
1261
1262//do x=x*y mod n for bigInts x,y,n.
1263//for greater speed, let y<x.
1264function multMod_(x,y,n) {
1265 var i;
1266 if (s0.length!=2*x.length)
1267 s0=new Array(2*x.length);
1268 copyInt_(s0,0);
1269 for (i=0;i<y.length;i++)
1270 if (y[i])
1271 linCombShift_(s0,x,y[i],i); //s0=1*s0+y[i]*(x<<(i*bpe))
1272 mod_(s0,n);
1273 copy_(x,s0);
1274}
1275
1276//do x=x*x mod n for bigInts x,n.
1277function squareMod_(x,n) {
1278 var i,j,d,c,kx,kn,k;
1279 for (kx=x.length; kx>0 && !x[kx-1]; kx--); //ignore leading zeros in x
1280 k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n
1281 if (s0.length!=k)
1282 s0=new Array(k);
1283 copyInt_(s0,0);
1284 for (i=0;i<kx;i++) {
1285 c=s0[2*i]+x[i]*x[i];
1286 s0[2*i]=c & mask;
1287 c>>=bpe;
1288 for (j=i+1;j<kx;j++) {
1289 c=s0[i+j]+2*x[i]*x[j]+c;
1290 s0[i+j]=(c & mask);
1291 c>>=bpe;
1292 }
1293 s0[i+kx]=c;
1294 }
1295 mod_(s0,n);
1296 copy_(x,s0);
1297}
1298
1299//return x with exactly k leading zero elements
1300function trim(x,k) {
1301 var i,y;
1302 for (i=x.length; i>0 && !x[i-1]; i--);
1303 y=new Array(i+k);
1304 copy_(y,x);
1305 return y;
1306}
1307
1308//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation. 0**0=1.
1309//this is faster when n is odd. x usually needs to have as many elements as n.
1310function powMod_(x,y,n) {
1311 var k1,k2,kn,np;
1312 if(s7.length!=n.length)
1313 s7=dup(n);
1314
1315 //for even modulus, use a simple square-and-multiply algorithm,
1316 //rather than using the more complex Montgomery algorithm.
1317 if ((n[0]&1)==0) {
1318 copy_(s7,x);
1319 copyInt_(x,1);
1320 while(!equalsInt(y,0)) {
1321 if (y[0]&1)
1322 multMod_(x,s7,n);
1323 divInt_(y,2);
1324 squareMod_(s7,n);
1325 }
1326 return;
1327 }
1328
1329 //calculate np from n for the Montgomery multiplications
1330 copyInt_(s7,0);
1331 for (kn=n.length;kn>0 && !n[kn-1];kn--);
1332 np=radix-inverseModInt_(modInt(n,radix),radix);
1333 s7[kn]=1;
1334 multMod_(x ,s7,n); // x = x * 2**(kn*bp) mod n
1335
1336 if (s3.length!=x.length)
1337 s3=dup(x);
1338 else
1339 copy_(s3,x);
1340
1341 for (k1=y.length-1;k1>0 & !y[k1]; k1--); //k1=first nonzero element of y
1342 if (y[k1]==0) { //anything to the 0th power is 1
1343 copyInt_(x,1);
1344 return;
1345 }
1346 for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1); //k2=position of first 1 bit in y[k1]
1347 for (;;) {
1348 if (!(k2>>=1)) { //look at next bit of y
1349 k1--;
1350 if (k1<0) {
1351 mont_(x,one,n,np);
1352 return;
1353 }
1354 k2=1<<(bpe-1);
1355 }
1356 mont_(x,x,n,np);
1357
1358 if (k2 & y[k1]) //if next bit is a 1
1359 mont_(x,s3,n,np);
1360 }
1361}
1362
1363//do x=x*y*Ri mod n for bigInts x,y,n,
1364// where Ri = 2**(-kn*bpe) mod n, and kn is the
1365// number of elements in the n array, not
1366// counting leading zeros.
1367//x must be large enough to hold the answer.
1368//It's OK if x and y are the same variable.
1369//must have:
1370// x,y < n
1371// n is odd
1372// np = -(n^(-1)) mod radix
1373function mont_(x,y,n,np) {
1374 var i,j,c,ui,t;
1375 var kn=n.length;
1376 var ky=y.length;
1377
1378 if (sa.length!=kn)
1379 sa=new Array(kn);
1380
1381 for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
1382 //this function sometimes gives wrong answers when the next line is uncommented
1383 //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
1384
1385 copyInt_(sa,0);
1386
1387 //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
1388 for (i=0; i<kn; i++) {
1389 t=sa[0]+x[i]*y[0];
1390 ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
1391 c=(t+ui*n[0]) >> bpe;
1392 t=x[i];
1393
1394 //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
1395 for (j=1;j<ky;j++) {
1396 c+=sa[j]+t*y[j]+ui*n[j];
1397 sa[j-1]=c & mask;
1398 c>>=bpe;
1399 }
1400 for (;j<kn;j++) {
1401 c+=sa[j]+ui*n[j];
1402 sa[j-1]=c & mask;
1403 c>>=bpe;
1404 }
1405 sa[j-1]=c & mask;
1406 }
1407
1408 if (!greater(n,sa))
1409 sub_(sa,n);
1410 copy_(x,sa);
1411}
1412
1413
1414
1415
1416//#############################################################################
1417//#############################################################################
1418//#############################################################################
1419//#############################################################################
1420//#############################################################################
1421//#############################################################################
1422//#############################################################################
1423
1424
1425
1426
1427
1428//#############################################################################
1429
1430Clipperz.Crypto.BigInt = function (aValue, aBase) {
1431 varbase;
1432 varvalue;
1433
1434 if (typeof(aValue) == 'object') {
1435 this._internalValue = aValue;
1436 } else {
1437 if (typeof(aValue) == 'undefined') {
1438 value = "0";
1439 } else {
1440 value = aValue + "";
1441 }
1442
1443 if (typeof(aBase) == 'undefined') {
1444 base = 10;
1445 } else {
1446 base = aBase;
1447 }
1448
1449 this._internalValue = str2bigInt(value, base, 1, 1);
1450 }
1451
1452 return this;
1453}
1454
1455//=============================================================================
1456
1457MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, {
1458
1459 //-------------------------------------------------------------------------
1460
1461 'internalValue': function () {
1462 return this._internalValue;
1463 },
1464
1465 //-------------------------------------------------------------------------
1466
1467 'isBigInt': true,
1468
1469 //-------------------------------------------------------------------------
1470
1471 'toString': function(aBase) {
1472 return this.asString(aBase);
1473 },
1474
1475 //-------------------------------------------------------------------------
1476
1477 'asString': function (aBase) {
1478 varbase;
1479
1480 if (typeof(aBase) == 'undefined') {
1481 base = 10;
1482 } else {
1483 base = aBase;
1484 }
1485
1486 return bigInt2str(this.internalValue(), base).toLowerCase();
1487 },
1488
1489 //-------------------------------------------------------------------------
1490
1491 'equals': function (aValue) {
1492 var result;
1493
1494 if (aValue.isBigInt) {
1495 result = equals(this.internalValue(), aValue.internalValue());
1496 } else if (typeof(aValue) == "number") {
1497 result = equalsInt(this.internalValue(), aValue);
1498 } else {
1499 throw Clipperz.Crypt.BigInt.exception.UnknownType;
1500 }
1501
1502 return result;
1503 },
1504
1505 //-------------------------------------------------------------------------
1506
1507 'add': function (aValue) {
1508 var result;
1509
1510 if (aValue.isBigInt) {
1511 result = add(this.internalValue(), aValue.internalValue());
1512 } else {
1513 result = addInt(this.internalValue(), aValue);
1514 }
1515
1516 return new Clipperz.Crypto.BigInt(result);
1517 },
1518
1519 //-------------------------------------------------------------------------
1520
1521 'subtract': function (aValue) {
1522 var result;
1523 var value;
1524
1525 if (aValue.isBigInt) {
1526 value = aValue;
1527 } else {
1528 value = new Clipperz.Crypto.BigInt(aValue);
1529 }
1530
1531 result = sub(this.internalValue(), value.internalValue());
1532
1533 return new Clipperz.Crypto.BigInt(result);
1534 },
1535
1536 //-------------------------------------------------------------------------
1537
1538 'multiply': function (aValue, aModule) {
1539 var result;
1540 var value;
1541
1542 if (aValue.isBigInt) {
1543 value = aValue;
1544 } else {
1545 value = new Clipperz.Crypto.BigInt(aValue);
1546 }
1547
1548 if (typeof(aModule) == 'undefined') {
1549 result = mult(this.internalValue(), value.internalValue());
1550 } else {
1551 result = multMod(this.internalValue(), value.internalValue(), aModule);
1552 }
1553
1554 return new Clipperz.Crypto.BigInt(result);
1555 },
1556
1557 //-------------------------------------------------------------------------
1558
1559 'module': function (aModule) {
1560 varresult;
1561 var module;
1562
1563 if (aModule.isBigInt) {
1564 module = aModule;
1565 } else {
1566 module = new Clipperz.Crypto.BigInt(aModule);
1567 }
1568
1569 result = mod(this.internalValue(), module.internalValue());
1570
1571 return new Clipperz.Crypto.BigInt(result);
1572 },
1573
1574 //-------------------------------------------------------------------------
1575
1576 'powerModule': function(aValue, aModule) {
1577 varresult;
1578 varvalue;
1579 var module;
1580
1581 if (aValue.isBigInt) {
1582 value = aValue;
1583 } else {
1584 value = new Clipperz.Crypto.BigInt(aValue);
1585 }
1586
1587 if (aModule.isBigInt) {
1588 module = aModule;
1589 } else {
1590 module = new Clipperz.Crypto.BigInt(aModule);
1591 }
1592
1593 if (aValue == -1) {
1594 result = inverseMod(this.internalValue(), module.internalValue());
1595 } else {
1596 result = powMod(this.internalValue(), value.internalValue(), module.internalValue());
1597 }
1598
1599 return new Clipperz.Crypto.BigInt(result);
1600 },
1601
1602 //-------------------------------------------------------------------------
1603
1604 'bitSize': function() {
1605 return bitSize(this.internalValue());
1606 },
1607
1608 //-------------------------------------------------------------------------
1609 __syntaxFix__: "syntax fix"
1610
1611});
1612
1613//#############################################################################
1614
1615Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) {
1616 return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize));
1617}
1618
1619//#############################################################################
1620//#############################################################################
1621//#############################################################################
1622
1623Clipperz.Crypto.BigInt.equals = function(a, b) {
1624 return a.equals(b);
1625}
1626
1627Clipperz.Crypto.BigInt.add = function(a, b) {
1628 return a.add(b);
1629}
1630
1631Clipperz.Crypto.BigInt.subtract = function(a, b) {
1632 return a.subtract(b);
1633}
1634
1635Clipperz.Crypto.BigInt.multiply = function(a, b, module) {
1636 return a.multiply(b, module);
1637}
1638
1639Clipperz.Crypto.BigInt.module = function(a, module) {
1640 return a.module(module);
1641}
1642
1643Clipperz.Crypto.BigInt.powerModule = function(a, b, module) {
1644 return a.powerModule(b, module);
1645}
1646
1647Clipperz.Crypto.BigInt.exception = {
1648 UnknownType: new MochiKit.Base.NamedError("Clipperz.Crypto.BigInt.exception.UnknownType")
1649}
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
new file mode 100644
index 0000000..2033eb4
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
@@ -0,0 +1,550 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
31//}
32if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
33if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
34
35Clipperz.Crypto.ECC.BinaryField.Curve = function(args) {
36 args = args || {};
37
38 this._modulus = args.modulus;
39
40 this._a = args.a;
41 this._b = args.b;
42 this._G = args.G;
43 this._r = args.r;
44 this._h = args.h;
45
46 this._finiteField = null;
47
48 return this;
49}
50
51Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, {
52
53 'asString': function() {
54 return "Clipperz.Crypto.ECC.BinaryField.Curve";
55 },
56
57 //-----------------------------------------------------------------------------
58
59 'modulus': function() {
60 return this._modulus;
61 },
62
63 'a': function() {
64 return this._a;
65 },
66
67 'b': function() {
68 return this._b;
69 },
70
71 'G': function() {
72 return this._G;
73 },
74
75 'r': function() {
76 return this._r;
77 },
78
79 'h': function() {
80 return this._h;
81 },
82
83 //-----------------------------------------------------------------------------
84
85 'finiteField': function() {
86 if (this._finiteField == null) {
87 this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()})
88 }
89
90 return this._finiteField;
91 },
92
93 //-----------------------------------------------------------------------------
94
95 'negate': function(aPointA) {
96 var result;
97
98 result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())})
99
100 return result;
101 },
102
103 //-----------------------------------------------------------------------------
104
105 'add': function(aPointA, aPointB) {
106 var result;
107
108//console.log(">>> ECC.BinaryField.Curve.add");
109 if (aPointA.isZero()) {
110//console.log("--- pointA == zero");
111 result = aPointB;
112 } else if (aPointB.isZero()) {
113//console.log("--- pointB == zero");
114 result = aPointA;
115 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
116//console.log("compare A.x - B.x: ", aPointA.x().compare(aPointB.x()));
117//console.log("compare A.y - B.y: ", (aPointA.y().compare(aPointB.y()) != 0));
118//console.log("compare B.x.isZero(): ", aPointB.x().isZero());
119
120//console.log("--- result = zero");
121 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
122 } else {
123//console.log("--- result = ELSE");
124 varf2m;
125 var x, y;
126 var lambda;
127 var aX, aY, bX, bY;
128
129 aX = aPointA.x()._value;
130 aY = aPointA.y()._value;
131 bX = aPointB.x()._value;
132 bY = aPointB.y()._value;
133
134 f2m = this.finiteField();
135
136 if (aPointA.x().compare(aPointB.x()) != 0) {
137//console.log(" a.x != b.x");
138 lambda =f2m._fastMultiply(
139 f2m._add(aY, bY),
140 f2m._inverse(f2m._add(aX, bX))
141 );
142 x = f2m._add(this.a()._value, f2m._square(lambda));
143 f2m._overwriteAdd(x, lambda);
144 f2m._overwriteAdd(x, aX);
145 f2m._overwriteAdd(x, bX);
146 } else {
147//console.log(" a.x == b.x");
148 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
149//console.log(" lambda: " + lambda.asString(16));
150 x = f2m._add(this.a()._value, f2m._square(lambda));
151//console.log(" x (step 1): " + x.asString(16));
152 f2m._overwriteAdd(x, lambda);
153//console.log(" x (step 2): " + x.asString(16));
154 }
155
156 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
157//console.log(" y (step 1): " + y.asString(16));
158 f2m._overwriteAdd(y, x);
159//console.log(" y (step 2): " + y.asString(16));
160 f2m._overwriteAdd(y, bY);
161//console.log(" y (step 3): " + y.asString(16));
162
163 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
164 }
165//console.log("<<< ECC.BinaryField.Curve.add");
166
167 return result;
168 },
169
170 //-----------------------------------------------------------------------------
171
172 'addTwice': function(aPointA) {
173 return this.add(aPointA, aPointA);
174 },
175
176 //-----------------------------------------------------------------------------
177
178 'overwriteAdd': function(aPointA, aPointB) {
179 if (aPointA.isZero()) {
180 // result = aPointB;
181 aPointA._x._value = aPointB._x._value;
182 aPointA._y._value = aPointB._y._value;
183 } else if (aPointB.isZero()) {
184 // result = aPointA;
185 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
186 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
187 aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O;
188 aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O;
189 } else {
190 varf2m;
191 var x, y;
192 var lambda;
193 var aX, aY, bX, bY;
194
195 aX = aPointA.x()._value;
196 aY = aPointA.y()._value;
197 bX = aPointB.x()._value;
198 bY = aPointB.y()._value;
199
200 f2m = this.finiteField();
201
202 if (aPointA.x().compare(aPointB.x()) != 0) {
203//console.log(" a.x != b.x");
204 lambda =f2m._fastMultiply(
205 f2m._add(aY, bY),
206 f2m._inverse(f2m._add(aX, bX))
207 );
208 x = f2m._add(this.a()._value, f2m._square(lambda));
209 f2m._overwriteAdd(x, lambda);
210 f2m._overwriteAdd(x, aX);
211 f2m._overwriteAdd(x, bX);
212 } else {
213//console.log(" a.x == b.x");
214 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
215//console.log(" lambda: " + lambda.asString(16));
216 x = f2m._add(this.a()._value, f2m._square(lambda));
217//console.log(" x (step 1): " + x.asString(16));
218 f2m._overwriteAdd(x, lambda);
219//console.log(" x (step 2): " + x.asString(16));
220 }
221
222 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
223//console.log(" y (step 1): " + y.asString(16));
224 f2m._overwriteAdd(y, x);
225//console.log(" y (step 2): " + y.asString(16));
226 f2m._overwriteAdd(y, bY);
227//console.log(" y (step 3): " + y.asString(16));
228
229 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
230 aPointA._x._value = x;
231 aPointA._y._value = y;
232
233 }
234//console.log("<<< ECC.BinaryField.Curve.add");
235
236 return result;
237 },
238
239 //-----------------------------------------------------------------------------
240
241 'multiply': function(aValue, aPoint) {
242 var result;
243
244//console.profile();
245 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
246
247 if (aValue.isZero() == false) {
248 var k, Q;
249 var i;
250 var countIndex; countIndex = 0;
251
252 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
253 k = aValue;
254 Q = aPoint;
255 } else {
256MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
257 k = aValue.negate();
258 Q = this.negate(aPoint);
259 }
260
261//console.log("k: " + k.toString(16));
262//console.log("k.bitSize: " + k.bitSize());
263 for (i=k.bitSize()-1; i>=0; i--) {
264 result = this.add(result, result);
265 // this.overwriteAdd(result, result);
266 if (k.isBitSet(i)) {
267 result = this.add(result, Q);
268 // this.overwriteAdd(result, Q);
269 }
270
271 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
272 }
273 }
274//console.profileEnd();
275
276 return result;
277 },
278
279 //-----------------------------------------------------------------------------
280
281 'deferredMultiply': function(aValue, aPoint) {
282 var deferredResult;
283 var result;
284
285MochiKit.Logging.logDebug(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint);
286//console.profile("ECC.Curve.multiply");
287 deferredResult = new MochiKit.Async.Deferred();
288//deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} );
289//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 1: " + res); return res;});
290
291 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
292//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 2: " + res); return res;});
293
294 if (aValue.isZero() == false) {
295 var k, Q;
296 var i;
297 var countIndex; countIndex = 0;
298
299 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
300 k = aValue;
301 Q = aPoint;
302 } else {
303MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
304 k = aValue.negate();
305 Q = this.negate(aPoint);
306 }
307
308//console.log("k: " + k.toString(16));
309//console.log("k.bitSize: " + k.bitSize());
310
311//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 3: " + res); return res;});
312 for (i=k.bitSize()-1; i>=0; i--) {
313//MochiKit.Logging.logDebug("====> " + i);
314//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 > i = " + i + ": " + res); return res;});
315 deferredResult.addMethod(this, "addTwice");
316 //# result = this.add(result, result);
317 // this.overwriteAdd(result, result);
318 if (k.isBitSet(i)) {
319 deferredResult.addMethod(this, "add", Q);
320 //# result = this.add(result, Q);
321 // this.overwriteAdd(result, Q);
322 }
323 if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);}
324
325 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
326//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 < i = " + i + ": " + res); return res;});
327 }
328//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4: " + res); return res;});
329 }
330//#console.profileEnd();
331//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 5: " + res); return res;});
332//deferredResult.addBoth(function(res) {console.profileEnd(); return res;});
333//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 6: " + res); return res;});
334 deferredResult.callback(result);
335
336 //# return result;
337 return deferredResult;
338 },
339
340 //-----------------------------------------------------------------------------
341 __syntaxFix__: "syntax fix"
342});
343
344
345//#############################################################################
346
347Clipperz.Crypto.ECC.StandardCurves = {};
348
349MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
350/*
351 '_K571': null,
352 'K571': function() {
353 if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) {
354 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
355 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
356 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
357 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
358 G: new Clipperz.Crypto.ECC.BinaryField.Point({
359 x: new Clipperz.Crypto.ECC.BinaryField.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16),
360 y: new Clipperz.Crypto.ECC.BinaryField.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16)
361 }),
362 r: new Clipperz.Crypto.ECC.BinaryField.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16),
363 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
364 });
365 }
366
367 return Clipperz.Crypto.ECC.StandardCurves._K571;
368 },
369
370
371
372 '_K283': null,
373 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
374 if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) {
375 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
376 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
377 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
378 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
379 G: new Clipperz.Crypto.ECC.BinaryField.Point({
380 x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
381 y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
382 }),
383 r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
384 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
385 });
386 }
387
388 return Clipperz.Crypto.ECC.StandardCurves._K283;
389 },
390*/
391 //-----------------------------------------------------------------------------
392
393 '_B571': null,
394 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
395 if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) {
396 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
397 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16),
398 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
399 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16),
400 G: new Clipperz.Crypto.ECC.BinaryField.Point({
401 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
402 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
403 }),
404 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
405 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
406
407 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
408 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
409 });
410
411 //-----------------------------------------------------------------------------
412 //
413 //Guide to Elliptic Curve Cryptography
414 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
415 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
416 //
417 //-----------------------------------------------------------------------------
418 //
419 // http://www.milw0rm.com/papers/136
420 //
421 // -------------------------------------------------------------------------
422 // Polynomial Reduction Algorithm Modulo f571
423 // -------------------------------------------------------------------------
424 //
425 // Input: Polynomial p(x) of degree 1140 or less, stored as
426 // an array of 2T machinewords.
427 // Output: p(x) mod f571(x)
428 //
429 // FOR i = T-1, ..., 0 DO
430 // SET X := P[i+T]
431 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
432 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
433 //
434 // SET X := P[T-1] >> 27
435 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
436 // P[T-1] := P[T-1] & 0x07ffffff
437 //
438 // RETURN P[T-1],...,P[0]
439 //
440 // -------------------------------------------------------------------------
441 //
442 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
443 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
444 varresult;
445
446 if (aValue.bitSize() > 1140) {
447 MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
448 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
449 } else {
450 varC, T;
451 var i;
452
453//console.log(">>> binaryField.finiteField.(improved)module");
454 // C = aValue.value().slice(0);
455 C = aValue._value.slice(0);
456 for (i=35; i>=18; i--) {
457 T = C[i];
458 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
459 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
460 }
461 T = (C[17] >>> 27);
462 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
463 C[17] = (C[17] & 0x07ffffff);
464
465 for(i=18; i<=35; i++) {
466 C[i] = 0;
467 }
468
469 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
470//console.log("<<< binaryField.finiteField.(improved)module");
471 }
472
473 return result;
474 };
475 }
476
477 return Clipperz.Crypto.ECC.StandardCurves._B571;
478 },
479
480 //-----------------------------------------------------------------------------
481
482 '_B283': null,
483 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
484 if (Clipperz.Crypto.ECC.StandardCurves._B283 == null) {
485 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
486 // modulus: new Clipperz.Crypto.ECC.BinaryField.Value('10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
487 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
488 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
489 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
490 G: new Clipperz.Crypto.ECC.BinaryField.Point({
491 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
492 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
493 }),
494 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
495 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
496
497 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
498 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
499 });
500
501 //-----------------------------------------------------------------------------
502 //
503 //Guide to Elliptic Curve Cryptography
504 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
505 //- Pag: 56, Alorithm 2.43
506 //
507 //-----------------------------------------------------------------------------
508 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
509 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
510 varresult;
511
512 if (aValue.bitSize() > 564) {
513 MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
514 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
515 } else {
516 varC, T;
517 var i;
518
519//console.log(">>> binaryField.finiteField.(improved)module");
520 C = aValue._value.slice(0);
521 for (i=17; i>=9; i--) {
522 T = C[i];
523 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
524 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
525 }
526 T = (C[8] >>> 27);
527 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
528 C[8] = (C[8] & 0x07ffffff);
529
530 for(i=9; i<=17; i++) {
531 C[i] = 0;
532 }
533
534 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
535//console.log("<<< binaryField.finiteField.(improved)module");
536 }
537
538 return result;
539 };
540 }
541
542 return Clipperz.Crypto.ECC.StandardCurves._B283;
543 },
544
545 //-----------------------------------------------------------------------------
546 __syntaxFix__: "syntax fix"
547});
548
549//#############################################################################
550
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
new file mode 100644
index 0000000..a649c9f
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
@@ -0,0 +1,526 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
31//}
32if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
33if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
34
35Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) {
36 args = args || {};
37 this._modulus = args.modulus;
38
39 return this;
40}
41
42Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, {
43
44 'asString': function() {
45 return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")";
46 },
47
48 //-----------------------------------------------------------------------------
49
50 'modulus': function() {
51 return this._modulus;
52 },
53
54 //-----------------------------------------------------------------------------
55
56 '_module': function(aValue) {
57 varresult;
58 var modulusComparison;
59//console.log(">>> binaryField.finiteField.(standard)module");
60
61 modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value);
62
63 if (modulusComparison < 0) {
64 result = aValue;
65 } else if (modulusComparison == 0) {
66 result = [0];
67 } else {
68 var modulusBitSize;
69 var resultBitSize;
70
71 result = aValue;
72
73 modulusBitSize = this.modulus().bitSize();
74 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
75 while (resultBitSize >= modulusBitSize) {
76 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize));
77 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
78 }
79 }
80//console.log("<<< binaryField.finiteField.(standard)module");
81
82 return result;
83 },
84
85 'module': function(aValue) {
86 return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0)));
87 },
88
89 //-----------------------------------------------------------------------------
90
91 '_add': function(a, b) {
92 return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b);
93 },
94
95 '_overwriteAdd': function(a, b) {
96 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b);
97 },
98
99 'add': function(a, b) {
100 return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value));
101 },
102
103 //-----------------------------------------------------------------------------
104
105 'negate': function(aValue) {
106 return aValue.clone();
107 },
108
109 //-----------------------------------------------------------------------------
110
111 '_multiply': function(a, b) {
112 var result;
113 var valueToXor;
114 var i,c;
115
116 result = [0];
117 valueToXor = b;
118 c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a);
119 for (i=0; i<c; i++) {
120 if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) {
121 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor);
122 }
123 valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1);
124 }
125 result = this._module(result);
126
127 return result;
128 },
129
130 'multiply': function(a, b) {
131 return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value));
132 },
133
134 //-----------------------------------------------------------------------------
135
136 '_fastMultiply': function(a, b) {
137 var result;
138 var B;
139 var i,c;
140
141 result = [0];
142 B = b.slice(0); //Is this array copy avoidable?
143 c = 32;
144 for (i=0; i<c; i++) {
145 var ii, cc;
146
147 cc = a.length;
148 for (ii=0; ii<cc; ii++) {
149 if (((a[ii] >>> i) & 0x01) == 1) {
150 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii);
151 }
152 }
153
154 if (i < (c-1)) {
155 B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1);
156 }
157 }
158 result = this._module(result);
159
160 return result;
161 },
162
163 'fastMultiply': function(a, b) {
164 return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value));
165 },
166
167 //-----------------------------------------------------------------------------
168 //
169 //Guide to Elliptic Curve Cryptography
170 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
171 //- Pag: 49, Alorithm 2.34
172 //
173 //-----------------------------------------------------------------------------
174
175 '_square': function(aValue) {
176 var result;
177 var value;
178 var c,i;
179 var precomputedValues;
180
181 value = aValue;
182 result = new Array(value.length * 2);
183 precomputedValues = Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes;
184
185 c = value.length;
186 for (i=0; i<c; i++) {
187 result[i*2] = precomputedValues[(value[i] & 0x000000ff)];
188 result[i*2] |= ((precomputedValues[(value[i] & 0x0000ff00) >>> 8]) << 16);
189
190 result[i*2 + 1] = precomputedValues[(value[i] & 0x00ff0000) >>> 16];
191 result[i*2 + 1] |= ((precomputedValues[(value[i] & 0xff000000) >>> 24]) << 16);
192 }
193
194 return this._module(result);
195 },
196
197 'square': function(aValue) {
198 return new Clipperz.Crypto.ECC.BinaryField.Value(this._square(aValue._value));
199 },
200
201 //-----------------------------------------------------------------------------
202
203 '_inverse': function(aValue) {
204 varresult;
205 var b, c;
206 var u, v;
207
208 // b = Clipperz.Crypto.ECC.BinaryField.Value.I._value;
209 b = [1];
210 // c = Clipperz.Crypto.ECC.BinaryField.Value.O._value;
211 c = [0];
212 u = this._module(aValue);
213 v = this.modulus()._value.slice(0);
214
215 while (Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) > 1) {
216 varbitDifferenceSize;
217
218 bitDifferenceSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) - Clipperz.Crypto.ECC.BinaryField.Value._bitSize(v);
219 if (bitDifferenceSize < 0) {
220 var swap;
221
222 swap = u;
223 u = v;
224 v = swap;
225
226 swap = c;
227 c = b;
228 b = swap;
229
230 bitDifferenceSize = -bitDifferenceSize;
231 }
232
233 u = this._add(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
234 b = this._add(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
235 // this._overwriteAdd(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
236 // this._overwriteAdd(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
237 }
238
239 result = this._module(b);
240
241 return result;
242 },
243
244 'inverse': function(aValue) {
245 return new Clipperz.Crypto.ECC.BinaryField.Value(this._inverse(aValue._value));
246 },
247
248 //-----------------------------------------------------------------------------
249 __syntaxFix__: "syntax fix"
250});
251
252
253Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes = [
254 0x0000, // 0 = 0000 0000 -> 0000 0000 0000 0000
255 0x0001, // 1 = 0000 0001 -> 0000 0000 0000 0001
256 0x0004, // 2 = 0000 0010 -> 0000 0000 0000 0100
257 0x0005, // 3 = 0000 0011 -> 0000 0000 0000 0101
258 0x0010, // 4 = 0000 0100 -> 0000 0000 0001 0000
259 0x0011, // 5 = 0000 0101 -> 0000 0000 0001 0001
260 0x0014, // 6 = 0000 0110 -> 0000 0000 0001 0100
261 0x0015, // 7 = 0000 0111 -> 0000 0000 0001 0101
262 0x0040, // 8 = 0000 1000 -> 0000 0000 0100 0000
263 0x0041, // 9 = 0000 1001 -> 0000 0000 0100 0001
264 0x0044, // 10 = 0000 1010 -> 0000 0000 0100 0100
265 0x0045, // 11 = 0000 1011 -> 0000 0000 0100 0101
266 0x0050, // 12 = 0000 1100 -> 0000 0000 0101 0000
267 0x0051, // 13 = 0000 1101 -> 0000 0000 0101 0001
268 0x0054, // 14 = 0000 1110 -> 0000 0000 0101 0100
269 0x0055, // 15 = 0000 1111 -> 0000 0000 0101 0101
270
271 0x0100, // 16 = 0001 0000 -> 0000 0001 0000 0000
272 0x0101, // 17 = 0001 0001 -> 0000 0001 0000 0001
273 0x0104, // 18 = 0001 0010 -> 0000 0001 0000 0100
274 0x0105, // 19 = 0001 0011 -> 0000 0001 0000 0101
275 0x0110, // 20 = 0001 0100 -> 0000 0001 0001 0000
276 0x0111, // 21 = 0001 0101 -> 0000 0001 0001 0001
277 0x0114, // 22 = 0001 0110 -> 0000 0001 0001 0100
278 0x0115, // 23 = 0001 0111 -> 0000 0001 0001 0101
279 0x0140, // 24 = 0001 1000 -> 0000 0001 0100 0000
280 0x0141, // 25 = 0001 1001 -> 0000 0001 0100 0001
281 0x0144, // 26 = 0001 1010 -> 0000 0001 0100 0100
282 0x0145, // 27 = 0001 1011 -> 0000 0001 0100 0101
283 0x0150, // 28 = 0001 1100 -> 0000 0001 0101 0000
284 0x0151, // 28 = 0001 1101 -> 0000 0001 0101 0001
285 0x0154, // 30 = 0001 1110 -> 0000 0001 0101 0100
286 0x0155, // 31 = 0001 1111 -> 0000 0001 0101 0101
287
288 0x0400, // 32 = 0010 0000 -> 0000 0100 0000 0000
289 0x0401, // 33 = 0010 0001 -> 0000 0100 0000 0001
290 0x0404, // 34 = 0010 0010 -> 0000 0100 0000 0100
291 0x0405, // 35 = 0010 0011 -> 0000 0100 0000 0101
292 0x0410, // 36 = 0010 0100 -> 0000 0100 0001 0000
293 0x0411, // 37 = 0010 0101 -> 0000 0100 0001 0001
294 0x0414, // 38 = 0010 0110 -> 0000 0100 0001 0100
295 0x0415, // 39 = 0010 0111 -> 0000 0100 0001 0101
296 0x0440, // 40 = 0010 1000 -> 0000 0100 0100 0000
297 0x0441, // 41 = 0010 1001 -> 0000 0100 0100 0001
298 0x0444, // 42 = 0010 1010 -> 0000 0100 0100 0100
299 0x0445, // 43 = 0010 1011 -> 0000 0100 0100 0101
300 0x0450, // 44 = 0010 1100 -> 0000 0100 0101 0000
301 0x0451, // 45 = 0010 1101 -> 0000 0100 0101 0001
302 0x0454, // 46 = 0010 1110 -> 0000 0100 0101 0100
303 0x0455, // 47 = 0010 1111 -> 0000 0100 0101 0101
304
305 0x0500, // 48 = 0011 0000 -> 0000 0101 0000 0000
306 0x0501, // 49 = 0011 0001 -> 0000 0101 0000 0001
307 0x0504, // 50 = 0011 0010 -> 0000 0101 0000 0100
308 0x0505, // 51 = 0011 0011 -> 0000 0101 0000 0101
309 0x0510, // 52 = 0011 0100 -> 0000 0101 0001 0000
310 0x0511, // 53 = 0011 0101 -> 0000 0101 0001 0001
311 0x0514, // 54 = 0011 0110 -> 0000 0101 0001 0100
312 0x0515, // 55 = 0011 0111 -> 0000 0101 0001 0101
313 0x0540, // 56 = 0011 1000 -> 0000 0101 0100 0000
314 0x0541, // 57 = 0011 1001 -> 0000 0101 0100 0001
315 0x0544, // 58 = 0011 1010 -> 0000 0101 0100 0100
316 0x0545, // 59 = 0011 1011 -> 0000 0101 0100 0101
317 0x0550, // 60 = 0011 1100 -> 0000 0101 0101 0000
318 0x0551, // 61 = 0011 1101 -> 0000 0101 0101 0001
319 0x0554, // 62 = 0011 1110 -> 0000 0101 0101 0100
320 0x0555, // 63 = 0011 1111 -> 0000 0101 0101 0101
321
322 0x1000, // 64 = 0100 0000 -> 0001 0000 0000 0000
323 0x1001, // 65 = 0100 0001 -> 0001 0000 0000 0001
324 0x1004, // 66 = 0100 0010 -> 0001 0000 0000 0100
325 0x1005, // 67 = 0100 0011 -> 0001 0000 0000 0101
326 0x1010, // 68 = 0100 0100 -> 0001 0000 0001 0000
327 0x1011, // 69 = 0100 0101 -> 0001 0000 0001 0001
328 0x1014, // 70 = 0100 0110 -> 0001 0000 0001 0100
329 0x1015, // 71 = 0100 0111 -> 0001 0000 0001 0101
330 0x1040, // 72 = 0100 1000 -> 0001 0000 0100 0000
331 0x1041, // 73 = 0100 1001 -> 0001 0000 0100 0001
332 0x1044, // 74 = 0100 1010 -> 0001 0000 0100 0100
333 0x1045, // 75 = 0100 1011 -> 0001 0000 0100 0101
334 0x1050, // 76 = 0100 1100 -> 0001 0000 0101 0000
335 0x1051, // 77 = 0100 1101 -> 0001 0000 0101 0001
336 0x1054, // 78 = 0100 1110 -> 0001 0000 0101 0100
337 0x1055, // 79 = 0100 1111 -> 0001 0000 0101 0101
338
339 0x1100, // 80 = 0101 0000 -> 0001 0001 0000 0000
340 0x1101, // 81 = 0101 0001 -> 0001 0001 0000 0001
341 0x1104, // 82 = 0101 0010 -> 0001 0001 0000 0100
342 0x1105, // 83 = 0101 0011 -> 0001 0001 0000 0101
343 0x1110, // 84 = 0101 0100 -> 0001 0001 0001 0000
344 0x1111, // 85 = 0101 0101 -> 0001 0001 0001 0001
345 0x1114, // 86 = 0101 0110 -> 0001 0001 0001 0100
346 0x1115, // 87 = 0101 0111 -> 0001 0001 0001 0101
347 0x1140, // 88 = 0101 1000 -> 0001 0001 0100 0000
348 0x1141, // 89 = 0101 1001 -> 0001 0001 0100 0001
349 0x1144, // 90 = 0101 1010 -> 0001 0001 0100 0100
350 0x1145, // 91 = 0101 1011 -> 0001 0001 0100 0101
351 0x1150, // 92 = 0101 1100 -> 0001 0001 0101 0000
352 0x1151, // 93 = 0101 1101 -> 0001 0001 0101 0001
353 0x1154, // 94 = 0101 1110 -> 0001 0001 0101 0100
354 0x1155, // 95 = 0101 1111 -> 0001 0001 0101 0101
355
356 0x1400, // 96 = 0110 0000 -> 0001 0100 0000 0000
357 0x1401, // 97 = 0110 0001 -> 0001 0100 0000 0001
358 0x1404, // 98 = 0110 0010 -> 0001 0100 0000 0100
359 0x1405, // 99 = 0110 0011 -> 0001 0100 0000 0101
360 0x1410, //100 = 0110 0100 -> 0001 0100 0001 0000
361 0x1411, //101 = 0110 0101 -> 0001 0100 0001 0001
362 0x1414, //102 = 0110 0110 -> 0001 0100 0001 0100
363 0x1415, //103 = 0110 0111 -> 0001 0100 0001 0101
364 0x1440, //104 = 0110 1000 -> 0001 0100 0100 0000
365 0x1441, //105 = 0110 1001 -> 0001 0100 0100 0001
366 0x1444, //106 = 0110 1010 -> 0001 0100 0100 0100
367 0x1445, //107 = 0110 1011 -> 0001 0100 0100 0101
368 0x1450, //108 = 0110 1100 -> 0001 0100 0101 0000
369 0x1451, //109 = 0110 1101 -> 0001 0100 0101 0001
370 0x1454, //110 = 0110 1110 -> 0001 0100 0101 0100
371 0x1455, //111 = 0110 1111 -> 0001 0100 0101 0101
372
373 0x1500, //112 = 0111 0000 -> 0001 0101 0000 0000
374 0x1501, //113 = 0111 0001 -> 0001 0101 0000 0001
375 0x1504, //114 = 0111 0010 -> 0001 0101 0000 0100
376 0x1505, //115 = 0111 0011 -> 0001 0101 0000 0101
377 0x1510, //116 = 0111 0100 -> 0001 0101 0001 0000
378 0x1511, //117 = 0111 0101 -> 0001 0101 0001 0001
379 0x1514, //118 = 0111 0110 -> 0001 0101 0001 0100
380 0x1515, //119 = 0111 0111 -> 0001 0101 0001 0101
381 0x1540, //120 = 0111 1000 -> 0001 0101 0100 0000
382 0x1541, //121 = 0111 1001 -> 0001 0101 0100 0001
383 0x1544, //122 = 0111 1010 -> 0001 0101 0100 0100
384 0x1545, //123 = 0111 1011 -> 0001 0101 0100 0101
385 0x1550, //124 = 0111 1100 -> 0001 0101 0101 0000
386 0x1551, //125 = 0111 1101 -> 0001 0101 0101 0001
387 0x1554, //126 = 0111 1110 -> 0001 0101 0101 0100
388 0x1555, //127 = 0111 1111 -> 0001 0101 0101 0101
389
390 0x4000, //128 = 1000 0000 -> 0100 0000 0000 0000
391 0x4001, //129 = 1000 0001 -> 0100 0000 0000 0001
392 0x4004, //130 = 1000 0010 -> 0100 0000 0000 0100
393 0x4005, //131 = 1000 0011 -> 0100 0000 0000 0101
394 0x4010, //132 = 1000 0100 -> 0100 0000 0001 0000
395 0x4011, //133 = 1000 0101 -> 0100 0000 0001 0001
396 0x4014, //134 = 1000 0110 -> 0100 0000 0001 0100
397 0x4015, //135 = 1000 0111 -> 0100 0000 0001 0101
398 0x4040, //136 = 1000 1000 -> 0100 0000 0100 0000
399 0x4041, //137 = 1000 1001 -> 0100 0000 0100 0001
400 0x4044, //138 = 1000 1010 -> 0100 0000 0100 0100
401 0x4045, //139 = 1000 1011 -> 0100 0000 0100 0101
402 0x4050, //140 = 1000 1100 -> 0100 0000 0101 0000
403 0x4051, //141 = 1000 1101 -> 0100 0000 0101 0001
404 0x4054, //142 = 1000 1110 -> 0100 0000 0101 0100
405 0x4055, //143 = 1000 1111 -> 0100 0000 0101 0101
406
407 0x4100, //144 = 1001 0000 -> 0100 0001 0000 0000
408 0x4101, //145 = 1001 0001 -> 0100 0001 0000 0001
409 0x4104, //146 = 1001 0010 -> 0100 0001 0000 0100
410 0x4105, //147 = 1001 0011 -> 0100 0001 0000 0101
411 0x4110, //148 = 1001 0100 -> 0100 0001 0001 0000
412 0x4111, //149 = 1001 0101 -> 0100 0001 0001 0001
413 0x4114, //150 = 1001 0110 -> 0100 0001 0001 0100
414 0x4115, //151 = 1001 0111 -> 0100 0001 0001 0101
415 0x4140, //152 = 1001 1000 -> 0100 0001 0100 0000
416 0x4141, //153 = 1001 1001 -> 0100 0001 0100 0001
417 0x4144, //154 = 1001 1010 -> 0100 0001 0100 0100
418 0x4145, //155 = 1001 1011 -> 0100 0001 0100 0101
419 0x4150, //156 = 1001 1100 -> 0100 0001 0101 0000
420 0x4151, //157 = 1001 1101 -> 0100 0001 0101 0001
421 0x4154, //158 = 1001 1110 -> 0100 0001 0101 0100
422 0x4155, //159 = 1001 1111 -> 0100 0001 0101 0101
423
424 0x4400, //160 = 1010 0000 -> 0100 0100 0000 0000
425 0x4401, //161 = 1010 0001 -> 0100 0100 0000 0001
426 0x4404, //162 = 1010 0010 -> 0100 0100 0000 0100
427 0x4405, //163 = 1010 0011 -> 0100 0100 0000 0101
428 0x4410, //164 = 1010 0100 -> 0100 0100 0001 0000
429 0x4411, //165 = 1010 0101 -> 0100 0100 0001 0001
430 0x4414, //166 = 1010 0110 -> 0100 0100 0001 0100
431 0x4415, //167 = 1010 0111 -> 0100 0100 0001 0101
432 0x4440, //168 = 1010 1000 -> 0100 0100 0100 0000
433 0x4441, //169 = 1010 1001 -> 0100 0100 0100 0001
434 0x4444, //170 = 1010 1010 -> 0100 0100 0100 0100
435 0x4445, //171 = 1010 1011 -> 0100 0100 0100 0101
436 0x4450, //172 = 1010 1100 -> 0100 0100 0101 0000
437 0x4451, //173 = 1010 1101 -> 0100 0100 0101 0001
438 0x4454, //174 = 1010 1110 -> 0100 0100 0101 0100
439 0x4455, //175 = 1010 1111 -> 0100 0100 0101 0101
440
441 0x4500, //176 = 1011 0000 -> 0100 0101 0000 0000
442 0x4501, //177 = 1011 0001 -> 0100 0101 0000 0001
443 0x4504, //178 = 1011 0010 -> 0100 0101 0000 0100
444 0x4505, //179 = 1011 0011 -> 0100 0101 0000 0101
445 0x4510, //180 = 1011 0100 -> 0100 0101 0001 0000
446 0x4511, //181 = 1011 0101 -> 0100 0101 0001 0001
447 0x4514, //182 = 1011 0110 -> 0100 0101 0001 0100
448 0x4515, //183 = 1011 0111 -> 0100 0101 0001 0101
449 0x4540, //184 = 1011 1000 -> 0100 0101 0100 0000
450 0x4541, //185 = 1011 1001 -> 0100 0101 0100 0001
451 0x4544, //186 = 1011 1010 -> 0100 0101 0100 0100
452 0x4545, //187 = 1011 1011 -> 0100 0101 0100 0101
453 0x4550, //188 = 1011 1100 -> 0100 0101 0101 0000
454 0x4551, //189 = 1011 1101 -> 0100 0101 0101 0001
455 0x4554, //190 = 1011 1110 -> 0100 0101 0101 0100
456 0x4555, //191 = 1011 1111 -> 0100 0101 0101 0101
457
458 0x5000, //192 = 1100 0000 -> 0101 0000 0000 0000
459 0x5001, //193 = 1100 0001 -> 0101 0000 0000 0001
460 0x5004, //194 = 1100 0010 -> 0101 0000 0000 0100
461 0x5005, //195 = 1100 0011 -> 0101 0000 0000 0101
462 0x5010, //196 = 1100 0100 -> 0101 0000 0001 0000
463 0x5011, //197 = 1100 0101 -> 0101 0000 0001 0001
464 0x5014, //198 = 1100 0110 -> 0101 0000 0001 0100
465 0x5015, //199 = 1100 0111 -> 0101 0000 0001 0101
466 0x5040, //200 = 1100 1000 -> 0101 0000 0100 0000
467 0x5041, //201 = 1100 1001 -> 0101 0000 0100 0001
468 0x5044, //202 = 1100 1010 -> 0101 0000 0100 0100
469 0x5045, //203 = 1100 1011 -> 0101 0000 0100 0101
470 0x5050, //204 = 1100 1100 -> 0101 0000 0101 0000
471 0x5051, //205 = 1100 1101 -> 0101 0000 0101 0001
472 0x5054, //206 = 1100 1110 -> 0101 0000 0101 0100
473 0x5055, //207 = 1100 1111 -> 0101 0000 0101 0101
474
475 0x5100, //208 = 1101 0000 -> 0101 0001 0000 0000
476 0x5101, //209 = 1101 0001 -> 0101 0001 0000 0001
477 0x5104, //210 = 1101 0010 -> 0101 0001 0000 0100
478 0x5105, //211 = 1101 0011 -> 0101 0001 0000 0101
479 0x5110, //212 = 1101 0100 -> 0101 0001 0001 0000
480 0x5111, //213 = 1101 0101 -> 0101 0001 0001 0001
481 0x5114, //214 = 1101 0110 -> 0101 0001 0001 0100
482 0x5115, //215 = 1101 0111 -> 0101 0001 0001 0101
483 0x5140, //216 = 1101 1000 -> 0101 0001 0100 0000
484 0x5141, //217 = 1101 1001 -> 0101 0001 0100 0001
485 0x5144, //218 = 1101 1010 -> 0101 0001 0100 0100
486 0x5145, //219 = 1101 1011 -> 0101 0001 0100 0101
487 0x5150, //220 = 1101 1100 -> 0101 0001 0101 0000
488 0x5151, //221 = 1101 1101 -> 0101 0001 0101 0001
489 0x5154, //222 = 1101 1110 -> 0101 0001 0101 0100
490 0x5155, //223 = 1101 1111 -> 0101 0001 0101 0101
491
492 0x5400, //224 = 1110 0000 -> 0101 0100 0000 0000
493 0x5401, //225 = 1110 0001 -> 0101 0100 0000 0001
494 0x5404, //226 = 1110 0010 -> 0101 0100 0000 0100
495 0x5405, //227 = 1110 0011 -> 0101 0100 0000 0101
496 0x5410, //228 = 1110 0100 -> 0101 0100 0001 0000
497 0x5411, //229 = 1110 0101 -> 0101 0100 0001 0001
498 0x5414, //230 = 1110 0110 -> 0101 0100 0001 0100
499 0x5415, //231 = 1110 0111 -> 0101 0100 0001 0101
500 0x5440, //232 = 1110 1000 -> 0101 0100 0100 0000
501 0x5441, //233 = 1110 1001 -> 0101 0100 0100 0001
502 0x5444, //234 = 1110 1010 -> 0101 0100 0100 0100
503 0x5445, //235 = 1110 1011 -> 0101 0100 0100 0101
504 0x5450, //236 = 1110 1100 -> 0101 0100 0101 0000
505 0x5451, //237 = 1110 1101 -> 0101 0100 0101 0001
506 0x5454, //238 = 1110 1110 -> 0101 0100 0101 0100
507 0x5455, //239 = 1110 1111 -> 0101 0100 0101 0101
508
509 0x5500, //240 = 1111 0000 -> 0101 0101 0000 0000
510 0x5501, //241 = 1111 0001 -> 0101 0101 0000 0001
511 0x5504, //242 = 1111 0010 -> 0101 0101 0000 0100
512 0x5505, //243 = 1111 0011 -> 0101 0101 0000 0101
513 0x5510, //244 = 1111 0100 -> 0101 0101 0001 0000
514 0x5511, //245 = 1111 0101 -> 0101 0101 0001 0001
515 0x5514, //246 = 1111 0110 -> 0101 0101 0001 0100
516 0x5515, //247 = 1111 0111 -> 0101 0101 0001 0101
517 0x5540, //248 = 1111 1000 -> 0101 0101 0100 0000
518 0x5541, //249 = 1111 1001 -> 0101 0101 0100 0001
519 0x5544, //250 = 1111 1010 -> 0101 0101 0100 0100
520 0x5545, //251 = 1111 1011 -> 0101 0101 0100 0101
521 0x5550, //252 = 1111 1100 -> 0101 0101 0101 0000
522 0x5551, //253 = 1111 1101 -> 0101 0101 0101 0001
523 0x5554, //254 = 1111 1110 -> 0101 0101 0101 0100
524 0x5555 //255 = 1111 1111 -> 0101 0101 0101 0101
525
526]
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js
new file mode 100644
index 0000000..b7a5537
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js
@@ -0,0 +1,67 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
31//}
32if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
33if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
34
35Clipperz.Crypto.ECC.BinaryField.Point = function(args) {
36 args = args || {};
37 this._x = args.x;
38 this._y = args.y;
39
40 return this;
41}
42
43Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, {
44
45 'asString': function() {
46 return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")";
47 },
48
49 //-----------------------------------------------------------------------------
50
51 'x': function() {
52 return this._x;
53 },
54
55 'y': function() {
56 return this._y;
57 },
58
59 //-----------------------------------------------------------------------------
60
61 'isZero': function() {
62 return (this.x().isZero() && this.y().isZero())
63 },
64
65 //-----------------------------------------------------------------------------
66 __syntaxFix__: "syntax fix"
67});
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js
new file mode 100644
index 0000000..5a430d1
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js
@@ -0,0 +1,386 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
31//}
32if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
33if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
34if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
35if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
36
37Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) {
38 if (aValue.constructor == String) {
39 varvalue;
40 varstringLength;
41 var numberOfWords;
42 vari,c;
43
44 if (aBase != 16) {
45 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
46 }
47
48 value = aValue.replace(/ /g, '');
49 stringLength = value.length;
50 numberOfWords = Math.ceil(stringLength / 8);
51 this._value = new Array(numberOfWords);
52
53 c = numberOfWords;
54 for (i=0; i<c; i++) {
55 varword;
56
57 if (i < (c-1)) {
58 word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16);
59 } else {
60 word = parseInt(value.substr(0, stringLength-(i*8)), 16);
61 }
62
63 this._value[i] = word;
64 }
65 } else if (aValue.constructor == Array) {
66 var itemsToCopy;
67
68 itemsToCopy = aValue.length;
69 while (aValue[itemsToCopy - 1] == 0) {
70 itemsToCopy --;
71 }
72
73 this._value = aValue.slice(0, itemsToCopy);
74 } else if (aValue.constructor == Number) {
75 this._value = [aValue];
76 } else {
77 // throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType;
78 }
79
80 this._bitSize == aBitSize || null;
81
82 return this;
83}
84
85Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, {
86
87 'value': function() {
88 return this._value;
89 },
90
91 //-----------------------------------------------------------------------------
92
93 'wordSize': function() {
94 return this._value.length
95 },
96
97 //-----------------------------------------------------------------------------
98
99 'clone': function() {
100 return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize);
101 },
102
103 //-----------------------------------------------------------------------------
104
105 'isZero': function() {
106 return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0);
107 },
108
109 //-----------------------------------------------------------------------------
110
111 'asString': function(aBase) {
112 varresult;
113 var i,c;
114
115 if (aBase != 16) {
116 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
117 }
118
119 result = "";
120 c = this.wordSize();
121 for (i=0; i<c; i++) {
122 varwordAsString;
123
124 // wordAsString = ("00000000" + this.value()[i].toString(16));
125 wordAsString = ("00000000" + this._value[i].toString(16));
126 wordAsString = wordAsString.substring(wordAsString.length - 8);
127 result = wordAsString + result;
128 }
129
130 result = result.replace(/^(00)*/, "");
131
132 if (result == "") {
133 result = "0";
134 }
135
136 return result;
137 },
138
139 //-----------------------------------------------------------------------------
140
141 'shiftLeft': function(aNumberOfBitsToShift) {
142 //this method seems like it is never called. :-(
143 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this._value, aNumberOfBitsToShift));
144 },
145
146 //-----------------------------------------------------------------------------
147
148 'bitSize': function() {
149 if (this._bitSize == null) {
150 this._bitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(this._value);
151 }
152
153 return this._bitSize;
154 },
155
156 //-----------------------------------------------------------------------------
157
158 'isBitSet': function(aBitPosition) {
159 return Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(this._value, aBitPosition);
160 },
161
162 //-----------------------------------------------------------------------------
163
164 'xor': function(aValue) {
165 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(this._value, aValue._value));
166 },
167
168 //-----------------------------------------------------------------------------
169
170 'compare': function(aValue) {
171 return Clipperz.Crypto.ECC.BinaryField.Value._compare(this._value, aValue._value);
172 },
173
174 //-----------------------------------------------------------------------------
175 __syntaxFix__: "syntax fix"
176});
177
178Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
179Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16);
180
181Clipperz.Crypto.ECC.BinaryField.Value._xor = function(a, b, aFirstItemOffset) {
182 var result;
183 var resultSize;
184 var i,c;
185 var firstItemOffset;
186
187 firstItemOffset = aFirstItemOffset || 0;
188 resultSize = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
189
190 result = new Array(resultSize);
191
192 c = firstItemOffset;
193 for (i=0; i<c; i++) {
194 result[i] = a[i];
195 }
196
197 c = resultSize;
198 for (i=firstItemOffset; i<c; i++) {
199 result[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
200 }
201
202 return result;
203};
204
205Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor = function(a, b, aFirstItemOffset) {
206 var i,c;
207 var firstItemOffset;
208
209 firstItemOffset = aFirstItemOffset || 0;
210
211 c = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
212 for (i=firstItemOffset; i<c; i++) {
213 a[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
214 }
215};
216
217Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft = function(aWordArray, aNumberOfBitsToShift) {
218 var numberOfWordsToShift;
219 varnumberOfBitsToShift;
220 var result;
221 varoverflowValue;
222 var nextOverflowValue;
223 vari,c;
224
225 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
226 numberOfBitsToShift = aNumberOfBitsToShift % 32;
227
228 result = new Array(aWordArray.length + numberOfWordsToShift);
229
230 c = numberOfWordsToShift;
231 for (i=0; i<c; i++) {
232 result[i] = 0;
233 }
234
235 overflowValue = 0;
236 nextOverflowValue = 0;
237
238 c = aWordArray.length;
239 for (i=0; i<c; i++) {
240 varvalue;
241 varresultWord;
242
243 // value = this.value()[i];
244 value = aWordArray[i];
245
246 if (numberOfBitsToShift > 0) {
247 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
248 value = value & (0xffffffff >>> numberOfBitsToShift);
249 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
250 } else {
251 resultWord = value;
252 }
253
254 result[i+numberOfWordsToShift] = resultWord;
255 overflowValue = nextOverflowValue;
256 }
257
258 if (overflowValue != 0) {
259 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
260 }
261
262 return result;
263};
264
265Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray, aNumberOfBitsToShift) {
266 var numberOfWordsToShift;
267 varnumberOfBitsToShift;
268 var result;
269 varoverflowValue;
270 vari,c;
271
272 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
273 numberOfBitsToShift = aNumberOfBitsToShift % 32;
274
275 result = new Array(aWordArray.length + numberOfWordsToShift);
276
277 c = numberOfWordsToShift;
278 for (i=0; i<c; i++) {
279 result[i] = 0;
280 }
281
282 overflowValue = 0;
283 nextOverflowValue = 0;
284
285 c = aWordArray.length;
286 for (i=0; i<c; i++) {
287 varvalue;
288 varresultWord;
289
290 // value = this.value()[i];
291 value = aWordArray[i];
292
293 if (numberOfBitsToShift > 0) {
294 var nextOverflowValue;
295
296 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
297 value = value & (0xffffffff >>> numberOfBitsToShift);
298 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
299 } else {
300 resultWord = value;
301 }
302
303 result[i+numberOfWordsToShift] = resultWord;
304 overflowValue = nextOverflowValue;
305 }
306
307 if (overflowValue != 0) {
308 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
309 }
310
311 return result;
312};
313
314Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) {
315 varresult;
316 varnotNullElements;
317 var mostValuableWord;
318 var matchingBitsInMostImportantWord;
319 var mask;
320 var i,c;
321
322 notNullElements = aWordArray.length;
323
324 if ((aWordArray.length == 1) && (aWordArray[0] == 0)) {
325 result = 0;
326 } else {
327 notNullElements --;
328 while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) {
329 notNullElements --;
330 }
331
332 result = notNullElements * 32;
333 mostValuableWord = aWordArray[notNullElements];
334
335 matchingBits = 32;
336 mask = 0x80000000;
337
338 while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) {
339 matchingBits --;
340 mask >>>= 1;
341 }
342
343 result += matchingBits;
344 }
345
346 return result;
347};
348
349Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) {
350 var result;
351 varbyteIndex;
352 var bitIndexInSelectedByte;
353
354 byteIndex = Math.floor(aBitPosition / 32);
355 bitIndexInSelectedByte = aBitPosition % 32;
356
357 if (byteIndex <= aWordArray.length) {
358 result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0);
359 } else {
360 result = false;
361 }
362
363 return result;
364};
365
366Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) {
367 varresult;
368 var i,c;
369
370 result = MochiKit.Base.compare(a.length, b.length);
371
372 c = a.length;
373 for (i=0; (i<c) && (result==0); i++) {
374//console.log("compare[" + c + " - " + i + " - 1] " + this.value()[c-i-1] + ", " + aValue.value()[c-i-1]);
375 // result = MochiKit.Base.compare(this.value()[c-i-1], aValue.value()[c-i-1]);
376 result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]);
377 }
378
379 return result;
380};
381
382
383Clipperz.Crypto.ECC.BinaryField.Value['exception']= {
384 'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"),
385 'UnsupportedConstructorValueType':new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType")
386};
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js b/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js
new file mode 100644
index 0000000..ae2b8fb
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js
@@ -0,0 +1,239 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!";
31//}
32//try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) {
33 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!";
34//}
35
36Clipperz.Crypto.ECC.StandardCurves = {};
37
38MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
39
40 //==============================================================================
41
42 '_K571': null,
43 'K571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
44 if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
45 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({
46 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
47 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
48 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
49 G: new Clipperz.Crypto.ECC.Koblitz.Point({
50 x: new Clipperz.Crypto.ECC.Koblitz.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16),
51 y: new Clipperz.Crypto.ECC.Koblitz.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16)
52 }),
53 r: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16),
54 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
55 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16)
56 });
57 }
58
59 return Clipperz.Crypto.ECC.StandardCurves._K571;
60 },
61
62 //-----------------------------------------------------------------------------
63
64 '_K283': null,
65 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
66 if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
67 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({
68 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
69 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
70 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
71 G: new Clipperz.Crypto.ECC.Koblitz.Point({
72 x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
73 y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
74 }),
75 r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
76 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
77 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16)
78 });
79 }
80
81 return Clipperz.Crypto.ECC.StandardCurves._K283;
82 },
83
84 //==============================================================================
85
86 '_B571': null,
87 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
88 if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
89 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
90 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
91 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
92 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e 2221f295 de297117 b7f3d62f 5c6a97ff cb8ceff1 cd6ba8ce 4a9a18ad 84ffabbd 8efa5933 2be7ad67 56a66e29 4afd185a 78ff12aa 520e4de7 39baca0c 7ffeff7f 2955727a', 16),
93 G: new Clipperz.Crypto.ECC.BinaryField.Point({
94 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
95 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
96 }),
97 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
98 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
99
100 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
101 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
102 });
103
104 //-----------------------------------------------------------------------------
105 //
106 //Guide to Elliptic Curve Cryptography
107 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
108 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
109 //
110 //-----------------------------------------------------------------------------
111 //
112 // http://www.milw0rm.com/papers/136
113 //
114 // -------------------------------------------------------------------------
115 // Polynomial Reduction Algorithm Modulo f571
116 // -------------------------------------------------------------------------
117 //
118 // Input: Polynomial p(x) of degree 1140 or less, stored as
119 // an array of 2T machinewords.
120 // Output: p(x) mod f571(x)
121 //
122 // FOR i = T-1, ..., 0 DO
123 // SET X := P[i+T]
124 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
125 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
126 //
127 // SET X := P[T-1] >> 27
128 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
129 // P[T-1] := P[T-1] & 0x07ffffff
130 //
131 // RETURN P[T-1],...,P[0]
132 //
133 // -------------------------------------------------------------------------
134 //
135 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
136 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
137 varresult;
138
139 if (aValue.bitSize() > 1140) {
140 MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
141 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
142 } else {
143 varC, T;
144 var i;
145
146//console.log(">>> binaryField.finiteField.(improved)module");
147 // C = aValue.value().slice(0);
148 C = aValue._value.slice(0);
149 for (i=35; i>=18; i--) {
150 T = C[i];
151 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
152 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
153 }
154 T = (C[17] >>> 27);
155 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
156 C[17] = (C[17] & 0x07ffffff);
157
158 for(i=18; i<=35; i++) {
159 C[i] = 0;
160 }
161
162 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
163//console.log("<<< binaryField.finiteField.(improved)module");
164 }
165
166 return result;
167 };
168 }
169
170 return Clipperz.Crypto.ECC.StandardCurves._B571;
171 },
172
173 //-----------------------------------------------------------------------------
174
175 '_B283': null,
176 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
177 if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
178 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
179 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
180 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
181 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
182 G: new Clipperz.Crypto.ECC.BinaryField.Point({
183 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
184 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
185 }),
186 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
187 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
188 });
189
190 //-----------------------------------------------------------------------------
191 //
192 //Guide to Elliptic Curve Cryptography
193 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
194 //- Pag: 56, Alorithm 2.43
195 //
196 //-----------------------------------------------------------------------------
197 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
198 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
199 varresult;
200
201 if (aValue.bitSize() > 564) {
202 MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
203 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
204 } else {
205 varC, T;
206 var i;
207
208//console.log(">>> binaryField.finiteField.(improved)module");
209 C = aValue._value.slice(0);
210 for (i=17; i>=9; i--) {
211 T = C[i];
212 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
213 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
214 }
215 T = (C[8] >>> 27);
216 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
217 C[8] = (C[8] & 0x07ffffff);
218
219 for(i=9; i<=17; i++) {
220 C[i] = 0;
221 }
222
223 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
224//console.log("<<< binaryField.finiteField.(improved)module");
225 }
226
227 return result;
228 };
229 }
230
231 return Clipperz.Crypto.ECC.StandardCurves._B283;
232 },
233
234 //==============================================================================
235 __syntaxFix__: "syntax fix"
236});
237
238
239
diff --git a/frontend/gamma/js/Clipperz/Crypto/PRNG.js b/frontend/gamma/js/Clipperz/Crypto/PRNG.js
new file mode 100644
index 0000000..266b909
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/PRNG.js
@@ -0,0 +1,855 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
31}
32
33try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) {
34 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!";
35}
36
37try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) {
38 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!";
39}
40
41if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; }
42
43//#############################################################################
44
45Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) {
46 args = args || {};
47 //MochiKit.Base.bindMethods(this);
48
49 this._stack = new Clipperz.ByteArray();
50 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256;
51 return this;
52}
53
54Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, {
55
56 'toString': function() {
57 return "Clipperz.Crypto.PRNG.EntropyAccumulator";
58 },
59
60 //-------------------------------------------------------------------------
61
62 'stack': function() {
63 return this._stack;
64 },
65
66 'setStack': function(aValue) {
67 this._stack = aValue;
68 },
69
70 'resetStack': function() {
71 this.stack().reset();
72 },
73
74 'maxStackLengthBeforeHashing': function() {
75 return this._maxStackLengthBeforeHashing;
76 },
77
78 //-------------------------------------------------------------------------
79
80 'addRandomByte': function(aValue) {
81 this.stack().appendByte(aValue);
82
83 if (this.stack().length() > this.maxStackLengthBeforeHashing()) {
84 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack()));
85 }
86 },
87
88 //-------------------------------------------------------------------------
89 __syntaxFix__: "syntax fix"
90});
91
92//#############################################################################
93
94Clipperz.Crypto.PRNG.RandomnessSource = function(args) {
95 args = args || {};
96 MochiKit.Base.bindMethods(this);
97
98 this._generator = args.generator || null;
99 this._sourceId = args.sourceId || null;
100 this._boostMode = args.boostMode || false;
101
102 this._nextPoolIndex = 0;
103
104 return this;
105}
106
107Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
108
109 'generator': function() {
110 return this._generator;
111 },
112
113 'setGenerator': function(aValue) {
114 this._generator = aValue;
115 },
116
117 //-------------------------------------------------------------------------
118
119 'boostMode': function() {
120 return this._boostMode;
121 },
122
123 'setBoostMode': function(aValue) {
124 this._boostMode = aValue;
125 },
126
127 //-------------------------------------------------------------------------
128
129 'sourceId': function() {
130 return this._sourceId;
131 },
132
133 'setSourceId': function(aValue) {
134 this._sourceId = aValue;
135 },
136
137 //-------------------------------------------------------------------------
138
139 'nextPoolIndex': function() {
140 return this._nextPoolIndex;
141 },
142
143 'incrementNextPoolIndex': function() {
144 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators());
145 },
146
147 //-------------------------------------------------------------------------
148
149 'updateGeneratorWithValue': function(aRandomValue) {
150 if (this.generator() != null) {
151 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue);
152 this.incrementNextPoolIndex();
153 }
154 },
155
156 //-------------------------------------------------------------------------
157 __syntaxFix__: "syntax fix"
158});
159
160//#############################################################################
161
162Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) {
163 args = args || {};
164 //MochiKit.Base.bindMethods(this);
165
166 this._intervalTime = args.intervalTime || 1000;
167
168 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
169
170 this.collectEntropy();
171 return this;
172}
173
174Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
175
176 'intervalTime': function() {
177 return this._intervalTime;
178 },
179
180 //-------------------------------------------------------------------------
181
182 'collectEntropy': function() {
183 varnow;
184 varentropyByte;
185 var intervalTime;
186 now = new Date();
187 entropyByte = (now.getTime() & 0xff);
188
189 intervalTime = this.intervalTime();
190 if (this.boostMode() == true) {
191 intervalTime = intervalTime / 9;
192 }
193
194 this.updateGeneratorWithValue(entropyByte);
195 setTimeout(this.collectEntropy, intervalTime);
196 },
197
198 //-------------------------------------------------------------------------
199
200 'numberOfRandomBits': function() {
201 return 5;
202 },
203
204 //-------------------------------------------------------------------------
205
206 'pollingFrequency': function() {
207 return 10;
208 },
209
210 //-------------------------------------------------------------------------
211 __syntaxFix__: "syntax fix"
212});
213
214//*****************************************************************************
215
216Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) {
217 args = args || {};
218
219 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
220
221 this._numberOfBitsToCollectAtEachEvent = 4;
222 this._randomBitsCollector = 0;
223 this._numberOfRandomBitsCollected = 0;
224
225 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy');
226
227 return this;
228}
229
230Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
231
232 //-------------------------------------------------------------------------
233
234 'numberOfBitsToCollectAtEachEvent': function() {
235 return this._numberOfBitsToCollectAtEachEvent;
236 },
237
238 //-------------------------------------------------------------------------
239
240 'randomBitsCollector': function() {
241 return this._randomBitsCollector;
242 },
243
244 'setRandomBitsCollector': function(aValue) {
245 this._randomBitsCollector = aValue;
246 },
247
248 'appendRandomBitsToRandomBitsCollector': function(aValue) {
249 var collectedBits;
250 var numberOfRandomBitsCollected;
251
252 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
253 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
254 this.setRandomBitsCollector(collectetBits);
255 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent();
256
257 if (numberOfRandomBitsCollected == 8) {
258 this.updateGeneratorWithValue(collectetBits);
259 numberOfRandomBitsCollected = 0;
260 this.setRandomBitsCollector(0);
261 }
262
263 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
264 },
265
266 //-------------------------------------------------------------------------
267
268 'numberOfRandomBitsCollected': function() {
269 return this._numberOfRandomBitsCollected;
270 },
271
272 'setNumberOfRandomBitsCollected': function(aValue) {
273 this._numberOfRandomBitsCollected = aValue;
274 },
275
276 //-------------------------------------------------------------------------
277
278 'collectEntropy': function(anEvent) {
279 var mouseLocation;
280 var randomBit;
281 var mask;
282
283 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent());
284
285 mouseLocation = anEvent.mouse().client;
286 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask);
287 this.appendRandomBitsToRandomBitsCollector(randomBit)
288 },
289
290 //-------------------------------------------------------------------------
291
292 'numberOfRandomBits': function() {
293 return 1;
294 },
295
296 //-------------------------------------------------------------------------
297
298 'pollingFrequency': function() {
299 return 10;
300 },
301
302 //-------------------------------------------------------------------------
303 __syntaxFix__: "syntax fix"
304});
305
306//*****************************************************************************
307
308Clipperz.Crypto.PRNG.KeyboardRandomnessSource = function(args) {
309 args = args || {};
310 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
311
312 this._randomBitsCollector = 0;
313 this._numberOfRandomBitsCollected = 0;
314
315 MochiKit.Signal.connect(document, 'onkeypress', this, 'collectEntropy');
316
317 return this;
318}
319
320Clipperz.Crypto.PRNG.KeyboardRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
321
322 //-------------------------------------------------------------------------
323
324 'randomBitsCollector': function() {
325 return this._randomBitsCollector;
326 },
327
328 'setRandomBitsCollector': function(aValue) {
329 this._randomBitsCollector = aValue;
330 },
331
332 'appendRandomBitToRandomBitsCollector': function(aValue) {
333 var collectedBits;
334 var numberOfRandomBitsCollected;
335
336 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
337 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
338 this.setRandomBitsCollector(collectetBits);
339 numberOfRandomBitsCollected ++;
340
341 if (numberOfRandomBitsCollected == 8) {
342 this.updateGeneratorWithValue(collectetBits);
343 numberOfRandomBitsCollected = 0;
344 this.setRandomBitsCollector(0);
345 }
346
347 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
348 },
349
350 //-------------------------------------------------------------------------
351
352 'numberOfRandomBitsCollected': function() {
353 return this._numberOfRandomBitsCollected;
354 },
355
356 'setNumberOfRandomBitsCollected': function(aValue) {
357 this._numberOfRandomBitsCollected = aValue;
358 },
359
360 //-------------------------------------------------------------------------
361
362 'collectEntropy': function(anEvent) {
363/*
364 var mouseLocation;
365 var randomBit;
366
367 mouseLocation = anEvent.mouse().client;
368
369 randomBit = ((mouseLocation.x ^ mouseLocation.y) & 0x1);
370 this.appendRandomBitToRandomBitsCollector(randomBit);
371*/
372 },
373
374 //-------------------------------------------------------------------------
375
376 'numberOfRandomBits': function() {
377 return 1;
378 },
379
380 //-------------------------------------------------------------------------
381
382 'pollingFrequency': function() {
383 return 10;
384 },
385
386 //-------------------------------------------------------------------------
387 __syntaxFix__: "syntax fix"
388});
389
390//#############################################################################
391
392Clipperz.Crypto.PRNG.Fortuna = function(args) {
393 vari,c;
394
395 args = args || {};
396
397 this._key = args.seed || null;
398 if (this._key == null) {
399 this._counter = 0;
400 this._key = new Clipperz.ByteArray();
401 } else {
402 this._counter = 1;
403 }
404
405 this._aesKey = null;
406
407 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
408 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
409
410 this._accumulators = [];
411 c = this.numberOfEntropyAccumulators();
412 for (i=0; i<c; i++) {
413 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator());
414 }
415
416 this._randomnessSources = [];
417 this._reseedCounter = 0;
418
419 return this;
420}
421
422Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, {
423
424 'toString': function() {
425 return "Clipperz.Crypto.PRNG.Fortuna";
426 },
427
428 //-------------------------------------------------------------------------
429
430 'key': function() {
431 return this._key;
432 },
433
434 'setKey': function(aValue) {
435 this._key = aValue;
436 this._aesKey = null;
437 },
438
439 'aesKey': function() {
440 if (this._aesKey == null) {
441 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()});
442 }
443
444 return this._aesKey;
445 },
446
447 'accumulators': function() {
448 return this._accumulators;
449 },
450
451 'firstPoolReseedLevel': function() {
452 return this._firstPoolReseedLevel;
453 },
454
455 //-------------------------------------------------------------------------
456
457 'reseedCounter': function() {
458 return this._reseedCounter;
459 },
460
461 'incrementReseedCounter': function() {
462 this._reseedCounter = this._reseedCounter +1;
463 },
464
465 //-------------------------------------------------------------------------
466
467 'reseed': function() {
468 varnewKeySeed;
469 var reseedCounter;
470 varreseedCounterMask;
471 var i, c;
472
473 newKeySeed = this.key();
474 this.incrementReseedCounter();
475 reseedCounter = this.reseedCounter();
476
477 c = this.numberOfEntropyAccumulators();
478 reseedCounterMask = 0xffffffff >>> (32 - c);
479 for (i=0; i<c; i++) {
480 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) {
481 newKeySeed.appendBlock(this.accumulators()[i].stack());
482 this.accumulators()[i].resetStack();
483 }
484 }
485
486 if (reseedCounter == 1) {
487 c = this.randomnessSources().length;
488 for (i=0; i<c; i++) {
489 this.randomnessSources()[i].setBoostMode(false);
490 }
491 }
492
493 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed));
494 if (reseedCounter == 1) {
495//MochiKit.Logging.logDebug("### PRNG.readyToGenerateRandomBytes");
496Clipperz.log("### PRNG.readyToGenerateRandomBytes");
497 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes');
498 }
499 MochiKit.Signal.signal(this, 'reseeded');
500 },
501
502 //-------------------------------------------------------------------------
503
504 'isReadyToGenerateRandomValues': function() {
505 return this.reseedCounter() != 0;
506 },
507
508 //-------------------------------------------------------------------------
509
510 'entropyLevel': function() {
511 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel());
512 },
513
514 //-------------------------------------------------------------------------
515
516 'counter': function() {
517 return this._counter;
518 },
519
520 'incrementCounter': function() {
521 this._counter += 1;
522 },
523
524 'counterBlock': function() {
525 var result;
526
527 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0);
528
529 return result;
530 },
531
532 //-------------------------------------------------------------------------
533
534 'getRandomBlock': function() {
535 var result;
536
537 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues()));
538 this.incrementCounter();
539
540 return result;
541 },
542
543 //-------------------------------------------------------------------------
544
545 'getRandomBytes': function(aSize) {
546 var result;
547
548 if (this.isReadyToGenerateRandomValues()) {
549 var i,c;
550 var newKey;
551
552 result = new Clipperz.ByteArray();
553
554 c = Math.ceil(aSize / (128 / 8));
555 for (i=0; i<c; i++) {
556 result.appendBlock(this.getRandomBlock());
557 }
558
559 if (result.length() != aSize) {
560 result = result.split(0, aSize);
561 }
562
563 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock());
564 this.setKey(newKey);
565 } else {
566MochiKit.Logging.logWarning("Fortuna generator has not enough entropy, yet!");
567 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy;
568 }
569
570 return result;
571 },
572
573 //-------------------------------------------------------------------------
574
575 'addRandomByte': function(aSourceId, aPoolId, aRandomValue) {
576 varselectedAccumulator;
577
578 selectedAccumulator = this.accumulators()[aPoolId];
579 selectedAccumulator.addRandomByte(aRandomValue);
580
581 if (aPoolId == 0) {
582 MochiKit.Signal.signal(this, 'addedRandomByte')
583 if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) {
584 this.reseed();
585 }
586 }
587 },
588
589 //-------------------------------------------------------------------------
590
591 'numberOfEntropyAccumulators': function() {
592 return this._numberOfEntropyAccumulators;
593 },
594
595 //-------------------------------------------------------------------------
596
597 'randomnessSources': function() {
598 return this._randomnessSources;
599 },
600
601 'addRandomnessSource': function(aRandomnessSource) {
602 aRandomnessSource.setGenerator(this);
603 aRandomnessSource.setSourceId(this.randomnessSources().length);
604 this.randomnessSources().push(aRandomnessSource);
605
606 if (this.isReadyToGenerateRandomValues() == false) {
607 aRandomnessSource.setBoostMode(true);
608 }
609 },
610
611 //-------------------------------------------------------------------------
612
613 'deferredEntropyCollection': function(aValue) {
614 var result;
615
616//MochiKit.Logging.logDebug(">>> PRNG.deferredEntropyCollection");
617
618 if (this.isReadyToGenerateRandomValues()) {
619//MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 1");
620 result = aValue;
621 } else {
622//MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 2");
623 var deferredResult;
624
625 // Clipperz.NotificationCenter.notify(this, 'updatedProgressState', 'collectingEntropy', true);
626
627 deferredResult = new Clipperz.Async.Deferred("PRNG.deferredEntropyCollection");
628 // deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.1 - PRNG.deferredEntropyCollection - 1: " + res); return res;});
629 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue));
630 // deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.2 - PRNG.deferredEntropyCollection - 2: " + res); return res;});
631 MochiKit.Signal.connect(this,
632 'readyToGenerateRandomBytes',
633 deferredResult,
634 'callback');
635
636 result = deferredResult;
637 }
638//MochiKit.Logging.logDebug("<<< PRNG.deferredEntropyCollection - result: " + result);
639
640 return result;
641 },
642
643 //-------------------------------------------------------------------------
644
645 'fastEntropyAccumulationForTestingPurpose': function() {
646 while (! this.isReadyToGenerateRandomValues()) {
647 this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256));
648 }
649 },
650
651 //-------------------------------------------------------------------------
652
653 'dump': function(appendToDoc) {
654 var tbl;
655 var i,c;
656
657 tbl = document.createElement("table");
658 tbl.border = 0;
659 with (tbl.style) {
660 border = "1px solid lightgrey";
661 fontFamily = 'Helvetica, Arial, sans-serif';
662 fontSize = '8pt';
663 //borderCollapse = "collapse";
664 }
665 var hdr = tbl.createTHead();
666 var hdrtr = hdr.insertRow(0);
667 // document.createElement("tr");
668 {
669 var ntd;
670
671 ntd = hdrtr.insertCell(0);
672 ntd.style.borderBottom = "1px solid lightgrey";
673 ntd.style.borderRight = "1px solid lightgrey";
674 ntd.appendChild(document.createTextNode("#"));
675
676 ntd = hdrtr.insertCell(1);
677 ntd.style.borderBottom = "1px solid lightgrey";
678 ntd.style.borderRight = "1px solid lightgrey";
679 ntd.appendChild(document.createTextNode("s"));
680
681 ntd = hdrtr.insertCell(2);
682 ntd.colSpan = this.firstPoolReseedLevel();
683 ntd.style.borderBottom = "1px solid lightgrey";
684 ntd.style.borderRight = "1px solid lightgrey";
685 ntd.appendChild(document.createTextNode("base values"));
686
687 ntd = hdrtr.insertCell(3);
688 ntd.colSpan = 20;
689 ntd.style.borderBottom = "1px solid lightgrey";
690 ntd.appendChild(document.createTextNode("extra values"));
691
692 }
693
694 c = this.accumulators().length;
695 for (i=0; i<c ; i++) {
696 varcurrentAccumulator;
697 var bdytr;
698 var bdytd;
699 var ii, cc;
700
701 currentAccumulator = this.accumulators()[i]
702
703 bdytr = tbl.insertRow(true);
704
705 bdytd = bdytr.insertCell(0);
706 bdytd.style.borderRight = "1px solid lightgrey";
707 bdytd.style.color = "lightgrey";
708 bdytd.appendChild(document.createTextNode("" + i));
709
710 bdytd = bdytr.insertCell(1);
711 bdytd.style.borderRight = "1px solid lightgrey";
712 bdytd.style.color = "gray";
713 bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length()));
714
715
716 cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel());
717 for (ii=0; ii<cc; ii++) {
718 var cellText;
719
720 bdytd = bdytr.insertCell(ii + 2);
721
722 if (ii < currentAccumulator.stack().length()) {
723 cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii));
724 } else {
725 cellText = "_";
726 }
727
728 if (ii == (this.firstPoolReseedLevel() - 1)) {
729 bdytd.style.borderRight = "1px solid lightgrey";
730 }
731
732 bdytd.appendChild(document.createTextNode(cellText));
733 }
734
735 }
736
737
738 if (appendToDoc) {
739 var ne = document.createElement("div");
740 ne.id = "entropyGeneratorStatus";
741 with (ne.style) {
742 fontFamily = "Courier New, monospace";
743 fontSize = "12px";
744 lineHeight = "16px";
745 borderTop = "1px solid black";
746 padding = "10px";
747 }
748 if (document.getElementById(ne.id)) {
749 MochiKit.DOM.swapDOM(ne.id, ne);
750 } else {
751 document.body.appendChild(ne);
752 }
753 ne.appendChild(tbl);
754 }
755
756 return tbl;
757 },
758
759 //-----------------------------------------------------------------------------
760 __syntaxFix__: "syntax fix"
761});
762
763//#############################################################################
764
765Clipperz.Crypto.PRNG.Random = function(args) {
766 args = args || {};
767 //MochiKit.Base.bindMethods(this);
768
769 return this;
770}
771
772Clipperz.Crypto.PRNG.Random.prototype = MochiKit.Base.update(null, {
773
774 'toString': function() {
775 return "Clipperz.Crypto.PRNG.Random";
776 },
777
778 //-------------------------------------------------------------------------
779
780 'getRandomBytes': function(aSize) {
781//Clipperz.Profile.start("Clipperz.Crypto.PRNG.Random.getRandomBytes");
782 varresult;
783 var i,c;
784
785 result = new Clipperz.ByteArray()
786 c = aSize || 1;
787 for (i=0; i<c; i++) {
788 result.appendByte((Math.random()*255) & 0xff);
789 }
790
791//Clipperz.Profile.stop("Clipperz.Crypto.PRNG.Random.getRandomBytes");
792 return result;
793 },
794
795 //-------------------------------------------------------------------------
796 __syntaxFix__: "syntax fix"
797});
798
799//#############################################################################
800
801_clipperz_crypt_prng_defaultPRNG = null;
802
803Clipperz.Crypto.PRNG.defaultRandomGenerator = function() {
804 if (_clipperz_crypt_prng_defaultPRNG == null) {
805 _clipperz_crypt_prng_defaultPRNG = new Clipperz.Crypto.PRNG.Fortuna();
806
807 //.............................................................
808 //
809 // TimeRandomnessSource
810 //
811 //.............................................................
812 {
813 var newRandomnessSource;
814
815 newRandomnessSource = new Clipperz.Crypto.PRNG.TimeRandomnessSource({intervalTime:111});
816 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
817 }
818
819 //.............................................................
820 //
821 // MouseRandomnessSource
822 //
823 //.............................................................
824 {
825 varnewRandomnessSource;
826
827 newRandomnessSource = new Clipperz.Crypto.PRNG.MouseRandomnessSource();
828 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
829 }
830
831 //.............................................................
832 //
833 // KeyboardRandomnessSource
834 //
835 //.............................................................
836 {
837 varnewRandomnessSource;
838
839 newRandomnessSource = new Clipperz.Crypto.PRNG.KeyboardRandomnessSource();
840 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
841 }
842
843 }
844
845 return _clipperz_crypt_prng_defaultPRNG;
846};
847
848//#############################################################################
849
850Clipperz.Crypto.PRNG.exception = {
851 NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy")
852};
853
854
855MochiKit.DOM.addLoadEvent(Clipperz.Crypto.PRNG.defaultRandomGenerator);
diff --git a/frontend/gamma/js/Clipperz/Crypto/RSA.js b/frontend/gamma/js/Clipperz/Crypto/RSA.js
new file mode 100644
index 0000000..4dad8f7
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/RSA.js
@@ -0,0 +1,151 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!";
31}
32
33if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; }
34
35Clipperz.Crypto.RSA.VERSION = "0.1";
36Clipperz.Crypto.RSA.NAME = "Clipperz.RSA";
37
38//#############################################################################
39
40MochiKit.Base.update(Clipperz.Crypto.RSA, {
41
42 //-------------------------------------------------------------------------
43
44 'publicKeyWithValues': function (e, d, n) {
45 varresult;
46
47 result = {};
48
49 if (e.isBigInt) {
50 result.e = e;
51 } else {
52 result.e = new Clipperz.Crypto.BigInt(e, 16);
53 }
54
55 if (d.isBigInt) {
56 result.d = d;
57 } else {
58 result.d = new Clipperz.Crypto.BigInt(d, 16);
59 }
60
61 if (n.isBigInt) {
62 result.n = n;
63 } else {
64 result.n = new Clipperz.Crypto.BigInt(n, 16);
65 }
66
67 return result;
68 },
69
70 'privateKeyWithValues': function(e, d, n) {
71 return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
72 },
73
74 //-----------------------------------------------------------------------------
75
76 'encryptUsingPublicKey': function (aKey, aMessage) {
77 varmessageValue;
78 varresult;
79
80 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
81 result = messageValue.powerModule(aKey.e, aKey.n);
82
83 return result.asString(16);
84 },
85
86 //.............................................................................
87
88 'decryptUsingPublicKey': function (aKey, aMessage) {
89 return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage);
90 },
91
92 //-----------------------------------------------------------------------------
93
94 'encryptUsingPrivateKey': function (aKey, aMessage) {
95 varmessageValue;
96 varresult;
97
98 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
99 result = messageValue.powerModule(aKey.d, aKey.n);
100
101 return result.asString(16);
102 },
103
104 //.............................................................................
105
106 'decryptUsingPrivateKey': function (aKey, aMessage) {
107 return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage);
108 },
109
110 //-----------------------------------------------------------------------------
111
112 'generatePublicKey': function(aNumberOfBits) {
113 varresult;
114 vare;
115 vard;
116 varn;
117
118 e = new Clipperz.Crypto.BigInt("10001", 16);
119
120 {
121 var p, q;
122 varphi;
123
124 do {
125 p = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
126 } while (p.module(e).equals(1));
127
128 do {
129 q = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
130 } while ((q.equals(p)) || (q.module(e).equals(1)));
131
132 n = p.multiply(q);
133 phi = (p.subtract(1).multiply(q.subtract(1)));
134 d = e.powerModule(-1, phi);
135 }
136
137 result = Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
138
139 return result;
140 },
141
142 //-------------------------------------------------------------------------
143
144 __syntaxFix__: "syntax fix"
145
146 //-------------------------------------------------------------------------
147
148});
149
150//#############################################################################
151
diff --git a/frontend/gamma/js/Clipperz/Crypto/SHA.js b/frontend/gamma/js/Clipperz/Crypto/SHA.js
new file mode 100644
index 0000000..3cf8559
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/SHA.js
@@ -0,0 +1,301 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
31}
32
33if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
34if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; }
35
36Clipperz.Crypto.SHA.VERSION = "0.3";
37Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA";
38
39MochiKit.Base.update(Clipperz.Crypto.SHA, {
40
41 '__repr__': function () {
42 return "[" + this.NAME + " " + this.VERSION + "]";
43 },
44
45 'toString': function () {
46 return this.__repr__();
47 },
48
49 //-----------------------------------------------------------------------------
50
51 'rotateRight': function(aValue, aNumberOfBits) {
52//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight");
53 var result;
54
55 result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits));
56
57//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight");
58 return result;
59 },
60
61 'shiftRight': function(aValue, aNumberOfBits) {
62//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight");
63 var result;
64
65 result = aValue >>> aNumberOfBits;
66
67//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight");
68 return result;
69 },
70
71 //-----------------------------------------------------------------------------
72
73 'safeAdd': function() {
74//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd");
75 varresult;
76 vari, c;
77
78 result = arguments[0];
79 c = arguments.length;
80 for (i=1; i<c; i++) {
81 varlowerBytesSum;
82
83 lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff);
84 result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff);
85 }
86
87//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd");
88 return result;
89 },
90
91 //-----------------------------------------------------------------------------
92
93 'sha256_array': function(aValue) {
94//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array");
95 varresult;
96 varmessage;
97 var h0, h1, h2, h3, h4, h5, h6, h7;
98 vark;
99 varmessageLength;
100 varmessageLengthInBits;
101 var_i, _c;
102 var charBits;
103 var rotateRight;
104 var shiftRight;
105 var safeAdd;
106 varbytesPerBlock;
107 var currentMessageIndex;
108
109 bytesPerBlock = 512/8;
110 rotateRight = Clipperz.Crypto.SHA.rotateRight;
111 shiftRight = Clipperz.Crypto.SHA.shiftRight;
112 safeAdd = Clipperz.Crypto.SHA.safeAdd;
113
114 charBits = 8;
115
116 h0 = 0x6a09e667;
117 h1 = 0xbb67ae85;
118 h2 = 0x3c6ef372;
119 h3 = 0xa54ff53a;
120 h4 = 0x510e527f;
121 h5 = 0x9b05688c;
122 h6 = 0x1f83d9ab;
123 h7 = 0x5be0cd19;
124
125 k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
126 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
127 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
128 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
129 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
130 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
131 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
132 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
133
134 message = aValue;
135 messageLength = message.length;
136
137 //Pre-processing:
138 message.push(0x80); //append a single "1" bit to message
139
140 _c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits;
141 if (_c < 0) {
142 _c = _c + (512 / charBits);
143 }
144
145 for (_i=0; _i<_c; _i++) {
146 message.push(0x00); //append "0" bits until message length ≡ 448 ≡ -64 (mod 512)
147 }
148
149 messageLengthInBits = messageLength * charBits;
150 message.push(0x00); //the 4 most high byte are alway 0 as message length is represented with a 32bit value;
151 message.push(0x00);
152 message.push(0x00);
153 message.push(0x00);
154 message.push((messageLengthInBits >> 24)& 0xff);
155 message.push((messageLengthInBits >> 16)& 0xff);
156 message.push((messageLengthInBits >> 8) & 0xff);
157 message.push( messageLengthInBits & 0xff);
158
159 currentMessageIndex = 0;
160 while(currentMessageIndex < message.length) {
161 varw;
162 vara, b, c, d, e, f, g, h;
163
164 w = Array(64);
165
166 _c = 16;
167 for (_i=0; _i<_c; _i++) {
168 var _j;
169
170 _j = currentMessageIndex + _i*4;
171 w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0);
172 }
173
174 _c = 64;
175 for (_i=16; _i<_c; _i++) {
176 vars0, s1;
177
178 s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3));
179 s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10));
180 w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1);
181 }
182
183 a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7;
184
185 _c = 64;
186 for (_i=0; _i<_c; _i++) {
187 var s0, s1, ch, maj, t1, t2;
188
189 s0 = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22));
190 maj = (a & b) ^ (a & c) ^ (b & c);
191 t2 = safeAdd(s0, maj);
192 s1 = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25));
193 ch = (e & f) ^ ((~e) & g);
194 t1 = safeAdd(h, s1, ch, k[_i], w[_i]);
195
196 h = g;
197 g = f;
198 f = e;
199 e = safeAdd(d, t1);
200 d = c;
201 c = b;
202 b = a;
203 a = safeAdd(t1, t2);
204 }
205
206 h0 = safeAdd(h0, a);
207 h1 = safeAdd(h1, b);
208 h2 = safeAdd(h2, c);
209 h3 = safeAdd(h3, d);
210 h4 = safeAdd(h4, e);
211 h5 = safeAdd(h5, f);
212 h6 = safeAdd(h6, g);
213 h7 = safeAdd(h7, h);
214
215 currentMessageIndex += bytesPerBlock;
216 }
217
218 result = new Array(256/8);
219 result[0] = (h0 >> 24)& 0xff;
220 result[1] = (h0 >> 16)& 0xff;
221 result[2] = (h0 >> 8)& 0xff;
222 result[3] = h0 & 0xff;
223
224 result[4] = (h1 >> 24)& 0xff;
225 result[5] = (h1 >> 16)& 0xff;
226 result[6] = (h1 >> 8)& 0xff;
227 result[7] = h1 & 0xff;
228
229 result[8] = (h2 >> 24)& 0xff;
230 result[9] = (h2 >> 16)& 0xff;
231 result[10] = (h2 >> 8)& 0xff;
232 result[11] = h2 & 0xff;
233
234 result[12] = (h3 >> 24)& 0xff;
235 result[13] = (h3 >> 16)& 0xff;
236 result[14] = (h3 >> 8)& 0xff;
237 result[15] = h3 & 0xff;
238
239 result[16] = (h4 >> 24)& 0xff;
240 result[17] = (h4 >> 16)& 0xff;
241 result[18] = (h4 >> 8)& 0xff;
242 result[19] = h4 & 0xff;
243
244 result[20] = (h5 >> 24)& 0xff;
245 result[21] = (h5 >> 16)& 0xff;
246 result[22] = (h5 >> 8)& 0xff;
247 result[23] = h5 & 0xff;
248
249 result[24] = (h6 >> 24)& 0xff;
250 result[25] = (h6 >> 16)& 0xff;
251 result[26] = (h6 >> 8)& 0xff;
252 result[27] = h6 & 0xff;
253
254 result[28] = (h7 >> 24)& 0xff;
255 result[29] = (h7 >> 16)& 0xff;
256 result[30] = (h7 >> 8)& 0xff;
257 result[31] = h7 & 0xff;
258
259//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array");
260 return result;
261 },
262
263 //-----------------------------------------------------------------------------
264
265 'sha256': function(aValue) {
266//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256");
267 var result;
268 var resultArray;
269 varvalueArray;
270
271 valueArray = aValue.arrayValues();
272 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
273
274 result = new Clipperz.ByteArray(resultArray);
275
276//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
277 return result;
278 },
279
280 //-----------------------------------------------------------------------------
281
282 'sha_d256': function(aValue) {
283//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256");
284 var result;
285 var resultArray;
286 varvalueArray;
287
288 valueArray = aValue.arrayValues();
289 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
290 resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray);
291
292 result = new Clipperz.ByteArray(resultArray);
293
294//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
295 return result;
296 },
297
298 //-----------------------------------------------------------------------------
299 __syntaxFix__: "syntax fix"
300
301});
diff --git a/frontend/gamma/js/Clipperz/Crypto/SRP.js b/frontend/gamma/js/Clipperz/Crypto/SRP.js
new file mode 100644
index 0000000..0eef6ec
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Crypto/SRP.js
@@ -0,0 +1,331 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
31}
32
33try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
34 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!";
35}
36
37try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
38 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!";
39}
40
41if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; }
42
43Clipperz.Crypto.SRP.VERSION = "0.1";
44Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP";
45
46//#############################################################################
47
48MochiKit.Base.update(Clipperz.Crypto.SRP, {
49
50 '_n': null,
51 '_g': null,
52 //-------------------------------------------------------------------------
53
54 'n': function() {
55 if (Clipperz.Crypto.SRP._n == null) {
56 Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16);
57 }
58
59 return Clipperz.Crypto.SRP._n;
60 },
61
62 //-------------------------------------------------------------------------
63
64 'g': function() {
65 if (Clipperz.Crypto.SRP._g == null) {
66 Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); //eventually 5 (as suggested on the Diffi-Helmann documentation)
67 }
68
69 return Clipperz.Crypto.SRP._g;
70 },
71
72 //-----------------------------------------------------------------------------
73
74 'exception': {
75 'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue")
76 },
77
78 //-------------------------------------------------------------------------
79 __syntaxFix__: "syntax fix"
80
81});
82
83//#############################################################################
84//
85 // S R P C o n n e c t i o n version 1.0
86//
87//=============================================================================
88Clipperz.Crypto.SRP.Connection = function (args) {
89 args = args || {};
90
91 this._C = args.C;
92 this._P = args.P;
93 this.hash = args.hash;
94
95 this._a = null;
96 this._A = null;
97
98 this._s = null;
99 this._B = null;
100
101 this._x = null;
102
103 this._u = null;
104 this._K = null;
105 this._M1 = null;
106 this._M2 = null;
107
108 this._sessionKey = null;
109
110 return this;
111}
112
113Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, {
114
115 'toString': function () {
116 return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription();
117 },
118
119 //-------------------------------------------------------------------------
120
121 'C': function () {
122 return this._C;
123 },
124
125 //-------------------------------------------------------------------------
126
127 'P': function () {
128 return this._P;
129 },
130
131 //-------------------------------------------------------------------------
132
133 'a': function () {
134 if (this._a == null) {
135 this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16);
136 // this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
137//MochiKit.Logging.logDebug("SRP a: " + this._a);
138 }
139
140 return this._a;
141 },
142
143 //-------------------------------------------------------------------------
144
145 'A': function () {
146 if (this._A == null) {
147 //Warning: this value should be strictly greater than zero: how should we perform this check?
148 this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n());
149
150 if (this._A.equals(0)) {
151MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0.");
152 throw Clipperz.Crypto.SRP.exception.InvalidValue;
153 }
154//MochiKit.Logging.logDebug("SRP A: " + this._A);
155 }
156
157 return this._A;
158 },
159
160 //-------------------------------------------------------------------------
161
162 's': function () {
163 return this._s;
164//MochiKit.Logging.logDebug("SRP s: " + this._S);
165 },
166
167 'set_s': function(aValue) {
168 this._s = aValue;
169 },
170
171 //-------------------------------------------------------------------------
172
173 'B': function () {
174 return this._B;
175 },
176
177 'set_B': function(aValue) {
178 //Warning: this value should be strictly greater than zero: how should we perform this check?
179 if (! aValue.equals(0)) {
180 this._B = aValue;
181//MochiKit.Logging.logDebug("SRP B: " + this._B);
182 } else {
183MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0.");
184 throw Clipperz.Crypto.SRP.exception.InvalidValue;
185 }
186 },
187
188 //-------------------------------------------------------------------------
189
190 'x': function () {
191 if (this._x == null) {
192 this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16);
193//MochiKit.Logging.logDebug("SRP x: " + this._x);
194 }
195
196 return this._x;
197 },
198
199 //-------------------------------------------------------------------------
200
201 'u': function () {
202 if (this._u == null) {
203 this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16);
204//MochiKit.Logging.logDebug("SRP u: " + this._u);
205 }
206
207 return this._u;
208 },
209
210 //-------------------------------------------------------------------------
211
212 'S': function () {
213 if (this._S == null) {
214 var bigint;
215 varsrp;
216
217 bigint = Clipperz.Crypto.BigInt;
218 srp = Clipperz.Crypto.SRP;
219
220 this._S =bigint.powerModule(
221 bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())),
222 bigint.add(this.a(), bigint.multiply(this.u(), this.x())),
223 srp.n()
224 )
225//MochiKit.Logging.logDebug("SRP S: " + this._S);
226 }
227
228 return this._S;
229 },
230
231 //-------------------------------------------------------------------------
232
233 'K': function () {
234 if (this._K == null) {
235 this._K = this.stringHash(this.S().asString());
236//MochiKit.Logging.logDebug("SRP K: " + this._K);
237 }
238
239 return this._K;
240 },
241
242 //-------------------------------------------------------------------------
243
244 'M1': function () {
245 if (this._M1 == null) {
246 this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K());
247//MochiKit.Logging.logDebug("SRP M1: " + this._M1);
248 }
249
250 return this._M1;
251 },
252
253 //-------------------------------------------------------------------------
254
255 'M2': function () {
256 if (this._M2 == null) {
257 this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K());
258//MochiKit.Logging.logDebug("SRP M2: " + this._M2);
259 }
260
261 return this._M2;
262 },
263
264 //=========================================================================
265
266 'serverSideCredentialsWithSalt': function(aSalt) {
267 var result;
268 var s, x, v;
269
270 s = aSalt;
271 x = this.stringHash(s + this.P());
272 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
273
274 result = {};
275 result['C'] = this.C();
276 result['s'] = s;
277 result['v'] = v.asString(16);
278
279 return result;
280 },
281
282 'serverSideCredentials': function() {
283 var result;
284 var s;
285
286 s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
287
288 result = this.serverSideCredentialsWithSalt(s);
289
290 return result;
291 },
292
293 //=========================================================================
294/*
295 'computeServerSide_S': function(b) {
296 var result;
297 var v;
298 var bigint;
299 varsrp;
300
301 bigint = Clipperz.Crypto.BigInt;
302 srp = Clipperz.Crypto.SRP;
303
304 v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16);
305 // _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n());
306 result = bigint.powerModule(
307 bigint.multiply(
308 this.A(),
309 bigint.powerModule(v, this.u(), srp.n())
310 ), new Clipperz.Crypto.BigInt(b, 10), srp.n()
311 );
312
313 return result;
314 },
315*/
316 //=========================================================================
317
318 'stringHash': function(aValue) {
319 varresult;
320
321 result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2);
322
323 return result;
324 },
325
326 //=========================================================================
327 __syntaxFix__: "syntax fix"
328
329});
330
331//#############################################################################
diff --git a/frontend/gamma/js/Clipperz/DOM.js b/frontend/gamma/js/Clipperz/DOM.js
new file mode 100644
index 0000000..40720d8
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/DOM.js
@@ -0,0 +1,139 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; }
31
32Clipperz.DOM.VERSION = "0.1";
33Clipperz.DOM.NAME = "Clipperz.DOM";
34
35MochiKit.Base.update(Clipperz.DOM, {
36
37 //-------------------------------------------------------------------------
38
39 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]";
41 },
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return this.__repr__();
47 },
48
49 //-------------------------------------------------------------------------
50
51 'selectOptionMatchingValue': function (aSelectElement, aValue, shouldUseCaseInsensitiveTest) {
52 var selectedOptionIndex;
53 var i, c;
54
55 selectedOptionIndex = -1;
56
57 c = aSelectElement.options.length;
58 for (i=0; (i<c) && (selectedOptionIndex == -1); i++) {
59 if (shouldUseCaseInsensitiveTest == true) {
60 if (aSelectElement.options[i].value.toLowerCase() == aValue.toLowerCase()) {
61 selectedOptionIndex = i;
62 }
63 } else {
64 if (aSelectElement.options[i].value == aValue) {
65 selectedOptionIndex = i;
66 }
67 }
68 }
69
70 if (selectedOptionIndex != -1) {
71 aSelectElement.selectedIndex = selectedOptionIndex;
72 }
73 },
74
75 //-------------------------------------------------------------------------
76
77 'setFormContents': function(aNode, someValues) {
78 var node;
79 var values;
80 var i, c;
81
82 values = {};
83 c = someValues[0].length;
84 for (i=0; i<c; i++) {
85 values[someValues[0][i]] = someValues[1][i];
86 }
87
88 // var m = MochiKit.Base;
89 // var self = MochiKit.DOM;
90 if (typeof(aNode) == "undefined" || aNode === null) {
91 node = MochiKit.DOM._document.body;
92 } else {
93 node = MochiKit.DOM.getElement(aNode);
94 }
95
96 MochiKit.Base.nodeWalk(node, function(aNode) {
97 var result;
98 var name;
99
100 result = null;
101 name = aNode.name;
102 if (MochiKit.Base.isNotEmpty(name) && (typeof(values[name]) != 'undefined')) {
103 var tagName;
104
105 tagName = aNode.tagName.toUpperCase();
106 if (tagName === "INPUT" && (aNode.type == "radio" || aNode.type == "checkbox")) {
107 aNode.checked = values[name];
108 } else if (tagName === "SELECT") {
109 if (aNode.type == "select-one") {
110 Clipperz.DOM.selectOptionMatchingValue(aNode, values[name]);
111 } else { //aNode.type == "select-multiple"
112MochiKit.Logging.logWarning("### unhandled Select.type = 'select-multiple' condition");
113 }
114 } else if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" || tagName === "DIV") {
115 result = aNode.childNodes;
116 } else {
117 aNode.value = values[name]
118 }
119 } else {
120 result = aNode.childNodes;
121 }
122
123 return result;
124 });
125 },
126
127 //-------------------------------------------------------------------------
128
129 'get': MochiKit.DOM.getElement,
130
131 //-------------------------------------------------------------------------
132
133 'Helper': Clipperz.YUI.DomHelper,
134
135 //-------------------------------------------------------------------------
136 __syntaxFix__: "syntax fix"
137
138});
139
diff --git a/frontend/gamma/js/Clipperz/Date.js b/frontend/gamma/js/Clipperz/Date.js
new file mode 100644
index 0000000..4103b88
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Date.js
@@ -0,0 +1,305 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; }
31
32Clipperz.Date.VERSION = "0.1";
33Clipperz.Date.NAME = "Clipperz.Date";
34
35MochiKit.Base.update(Clipperz.Date, {
36
37 //-------------------------------------------------------------------------
38
39 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]";
41 },
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return this.__repr__();
47 },
48
49 //-------------------------------------------------------------------------
50
51 'daysInMonth': [31,28,31,30,31,30,31,31,30,31,30,31],
52
53 //-------------------------------------------------------------------------
54
55 'englishOrdinalDaySuffixForDate': function(aDate) {
56 var result;
57
58 switch (aDate.getDate()) {
59 case 1:
60 case 21:
61 case 31:
62 result = "st";
63 break;
64 case 2:
65 case 22:
66 result = "nd";
67 break;
68 case 3:
69 case 23:
70 result = "rd";
71 break;
72 default:
73 result = "th";
74 break;
75 }
76
77 return result;
78 },
79
80 //-------------------------------------------------------------------------
81
82 'isLeapYear': function(aDate) {
83 var year;
84 var result;
85
86 year = aDate.getFullYear();
87 result = ((year & 0x03) == 0 && (year % 100 || (year % 400 == 0 && year)));
88
89 return result;
90 },
91
92 //-------------------------------------------------------------------------
93
94 'getDaysInMonth': function(aDate) {
95 var result;
96
97 if (aDate.getMonth() == 1) {
98 Clipperz.Date.isLeapYear(aDate)
99 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
100 } else {
101 result = Clipperz.Date.daysInMonth[aDate.getMonth()];
102 }
103
104 return result;
105 },
106
107 //-------------------------------------------------------------------------
108
109 'getTimezone': function(aDate) {
110 var result;
111
112 result = aDate.toString();
113 result = result.replace(/([A-Z]{3}) [0-9]{4}/, '$1');
114 result = result.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
115
116 return result;
117 },
118
119 'getGMTOffset': function(aDate) {
120 return (aDate.getTimezoneOffset() > 0 ? "-" : "+")+ MochiKit.Format.numberFormatter('00')(Math.floor(this.getTimezoneOffset() / 60))
121 + MochiKit.Format.numberFormatter('00')(this.getTimezoneOffset() % 60);
122 },
123
124 //-------------------------------------------------------------------------
125
126 'dayOfYear': function(aDate) {
127 var result;
128 var i,c;
129
130 result = 0;
131 c = aDate.getMonth();
132 for (i=0; i<c; i++) {
133 if (i == 1) {
134 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
135 } else {
136 result += Clipperz.Date.daysInMonth[i];
137 }
138 }
139 return num + this.getDate() - 1;
140 },
141
142 //-------------------------------------------------------------------------
143
144 'getPHPLikeFormatCode': function(aCharacter) {
145 var result;
146
147 switch (aCharacter) {
148 case "d":
149 result = " + MochiKit.Format.numberFormatter('00')(aDate.getDate())";
150 break;
151 case "D":
152 result = " + aLocale['shortDays'][aDate.getDay()]";
153 break;
154 case "j":
155 result = " + aDate.getDate()";
156 break;
157 case "l":
158 result = " + aLocale['days'][aDate.getDay()]";
159 break;
160 case "S":
161 result = " + Clipperz.Date.englishOrdinalDaySuffixForDate(aDate)";
162 break;
163 case "w":
164 result = " + aDate.getDay()";
165 break;
166 case "z":
167 result = " + aDate.getDayOfYear()";
168 break;
169 case "W":
170 result = " + aDate.getWeekOfYear()";
171 break;
172 case "F":
173 result = " + aLocale['months'][aDate.getMonth()]";
174 break;
175 case "m":
176 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMonth() + 1)";
177 break;
178 case "M":
179 result = " + aLocale['shortMonths'][aDate.getMonth()]";
180 break;
181 case "n":
182 result = " + (aDate.getMonth() + 1)";
183 break;
184 case "t":
185 result = " + Clipperz.Date.getDaysInMonth(aDate)";
186 break;
187 case "L":
188 result = " + (Clipperz.Date.isLeapYear(aDate) ? 1 : 0)";
189 break;
190 case "Y":
191 result = " + aDate.getFullYear()";
192 break;
193 case "y":
194 result = " + ('' + aDate.getFullYear()).substring(2, 4)";
195 break;
196 case "a":
197 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'] : aLocale['pmDesignation'])";
198 break;
199 case "A":
200 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'].toUpperCase() : aLocale['pmDesignation'].toUpperCase())";
201 break;
202 case "g":
203 result = " + ((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
204 break;
205 case "G":
206 result = " + aDate.getHours()";
207 break;
208 case "h":
209 result = " + MochiKit.Format.numberFormatter('00')((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
210 break;
211 case "H":
212 result = " + MochiKit.Format.numberFormatter('00')(aDate.getHours())";
213 break;
214 case "i":
215 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMinutes())";
216 break;
217 case "s":
218 result = " + MochiKit.Format.numberFormatter('00')(aDate.getSeconds())";
219 break;
220 case "O":
221 result = " + aDate.getGMTOffset()";
222 break;
223 case "T":
224 result = " + Clipperz.Date.getTimezone(aDate)";
225 break;
226 case "Z":
227 result = " + ( + aDate.getTimezoneOffset() * -60)";
228 break;
229 default:
230 result = " + '" + aCharacter + "'";
231 break;
232 };
233
234 return result;
235 },
236
237 //=========================================================================
238
239 'formatDateWithPHPLikeTemplateAndLocale': function(aDate, aFormat, aLocale) {
240 var result;
241 var formatterCode;
242 var formatter;
243 var i,c;
244
245//MochiKit.Logging.logDebug(">>> Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale");
246 formatterCode = "Clipperz.Date.__scratchFormatter = function(aDate, aLocale){return ''";
247
248 c = aFormat.length;
249 i = 0;
250
251 while (i<c) {
252 var character;
253
254 character = aFormat.charAt(i);
255 if (character == "\\") {
256 i++;
257 character = aFormat.charAt(i);
258 formatterCode += " + '" + character + "'"
259 } else {
260 formatterCode += Clipperz.Date.getPHPLikeFormatCode(character);
261 }
262
263 i++;
264 }
265
266 formatterCode += ";}";
267//MochiKit.Logging.logDebug("--- Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale - formatterCode: " + formatterCode);
268 eval(formatterCode);
269
270 result = Clipperz.Date.__scratchFormatter.call(this, aDate, aLocale);
271 delete Clipperz.Date.__scratchFormatter;
272//MochiKit.Logging.logDebug("<<< Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale");
273
274 return result;
275 },
276
277 //-------------------------------------------------------------------------
278
279 'parseDateWithPHPLikeTemplateAndLocale': function(aString, aFormat, aLocale) {
280 return new Date();
281 },
282
283 //=========================================================================
284
285 'formatDateWithUTCFormatAndLocale': function(aDate, aLocale) {
286 // return Clipperz.Date.formatWithJavaLikeTemplateAndLocale(aDate, "EEE, dd MMMM yyyy HH:mm:ss zzz", aLocale);
287 return aDate.toString();
288 },
289
290 'parseDateWithUTCFormatAndLocale': function(aValue, aLocale) {
291 return new Date(Date.parse(aValue));
292 },
293
294 //=========================================================================
295
296 'exception': {
297 // 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
298 // 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType")
299 },
300
301 //-------------------------------------------------------------------------
302 __syntaxFix__: "syntax fix"
303
304});
305
diff --git a/frontend/gamma/js/Clipperz/KeePassExportProcessor.js b/frontend/gamma/js/Clipperz/KeePassExportProcessor.js
new file mode 100644
index 0000000..06ab5a8
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/KeePassExportProcessor.js
@@ -0,0 +1,196 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30
31
32Clipperz.KeePassExportProcessor = function(args) {
33 args = args || {};
34
35 return this;
36}
37
38//=============================================================================
39
40Clipperz.KeePassExportProcessor.prototype = MochiKit.Base.update(null, {
41
42 //-------------------------------------------------------------------------
43
44 'deferredParse_core': function(aContext) {
45 var deferredResult;
46
47 if (aContext.line == "") {
48 deferredResult = MochiKit.Async.succeed(aContext.result);
49 } else {
50 var record;
51
52 record = this.parseRecord(aContext);
53 if (record != null) {
54 aContext.result.push(record);
55 }
56
57 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
58
59 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredParse_core");
60 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
61 deferredResult.addCallback(MochiKit.Async.wait, 0.2);
62 deferredResult.addMethod(this, 'deferredParse_core');
63 deferredResult.callback(aContext);
64 }
65
66 return deferredResult;
67 },
68
69 //.........................................................................
70
71 'deferredParse': function(aValue) {
72 var deferredResult;
73 var lines;
74 var context;
75
76 lines = aValue.replace(/\r?\n/g, "\n");
77 context = {
78 line: lines,
79 size: lines.length,
80 result: []
81 }
82
83 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredResult");
84 deferredResult.addMethod(this, 'deferredParse_core');
85 deferredResult.callback(context);
86
87 return deferredResult;
88 },
89
90 //-------------------------------------------------------------------------
91
92 'parseRecord': function(aContext) {
93 var result;
94 var recordLabelRegexp;
95 varfieldLabelRegexp;
96 var fieldValueRegexp;
97 var fullLineRegexp;
98/*
99[Record name]
100Group Tree:
101UserName:
102URL:
103Password:
104Notes: test
105UUID: 525f62430079bae48b79ed2961924b05
106Icon: 0
107Creation Time: 2007-06-26 17:56:03
108Last Access: 2007-10-25 16:23:51
109Last Modification: 2007-10-25 16:23:51
110Expires: 2999-12-28 23:59:59
111
112 [Record name] ==> Title
113 Group: General ==> Group
114 Group Tree: ==> Group Tree
115 UserName: ==> UserName
116 URL: ==>URL
117 Password: ==>Password
118 Notes: test ==>Notes
119 UUID: 525f62430079bae48b79ed2961924b05 ==>UUID
120 Icon: 0 ==>Icon
121 Creation Time: 2007-06-26 17:56:03 ==>Creation Time
122 Last Access: 2007-10-25 16:23:51 ==>Last Access
123 Last Modification: 2007-10-25 16:23:51 ==>Last Modification
124 Expires: 2999-12-28 23:59:59 ==> Expires
125 Attachment Description: ==> Attachment Description
126 Attachment: ==> Attachment
127*/
128 // recordLabelRegexp = new RegExp("(^\\[(.*)\\]\\n|^Title:\s*(.*)\\n)");
129 recordLabelRegexp = new RegExp("^\\[(.*)\\]\\n|^Title:\s*(.*)\\n");
130 fieldLabelRegexp = new RegExp("^\s?(Group|Group Tree|Username|UserName|User Name|Url|URL|Password|Notes|Comment|UUID|Icon|Creation Time|Last Access|Last Modification|Expires|Attachment Description|Attachment|Valid until): ");
131 fieldValueRegexp = new RegExp("(.*)(\\n|$)");
132 fullLineRegexp = new RegExp("^(.*\\n)");
133
134 if (recordLabelRegexp.test(aContext.line) == true) {
135 var line;
136
137 line = aContext.line;
138
139 result = {};
140 result['Title'] = line.match(recordLabelRegexp)[1];
141 line = line.replace(/^.*\n/, "");
142 while (fieldLabelRegexp.test(line) == true) {
143 var fieldName;
144 var fieldValue;
145
146 fieldName = RegExp.$1;
147 line = RegExp.rightContext;
148
149 fieldValue = line.match(fieldValueRegexp)[1];
150 line = RegExp.rightContext;
151
152 if (fieldName == 'Notes') {
153 var isMultiline;
154
155 isMultiline = false;
156
157 if ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) {
158 fieldValue += '\n';
159 }
160
161 while ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) {
162 var newLineValue;
163
164 newLineValue = line.match(fullLineRegexp)[1];
165 if (newLineValue != "\n") {
166 isMultiline = true;
167 }
168 fieldValue += newLineValue;
169 line = RegExp.rightContext;
170 }
171
172 if (isMultiline) {
173 fieldValue = fieldValue.replace(/\n$/g, "");
174 } else {
175 fieldValue = fieldValue.replace(/\n\n$/g, "");
176 }
177
178 line = line.replace(/^\n/, '');
179 }
180
181 result[fieldName] = fieldValue;
182 }
183 } else {
184 result = null;
185 }
186
187 aContext.line = line;
188
189 return result;
190 },
191
192 //-------------------------------------------------------------------------
193 __syntaxFix__: "syntax fix"
194});
195
196
diff --git a/frontend/gamma/js/Clipperz/KeyValueObjectStore.js b/frontend/gamma/js/Clipperz/KeyValueObjectStore.js
new file mode 100644
index 0000000..04beb85
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/KeyValueObjectStore.js
@@ -0,0 +1,176 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30
31//#############################################################################
32
33Clipperz.KeyValueObjectStore = function(args) {
34 args = args || {};
35
36 //this._name = args['name'] || "unnamed KeyValueObjectStore";
37 this._values = args['values'] || {};
38 //this._referenceObjectStore = null;
39//console.log("new KeyValueObjectStore", args, this._values);
40
41 return this;
42}
43
44Clipperz.KeyValueObjectStore.prototype = MochiKit.Base.update(null, {
45
46 'values': function() {
47 return this._values;
48 },
49
50 'initWithValues': function (someValues) {
51 this._values = Clipperz.Base.deepClone(someValues) || {};
52 return this;
53 },
54
55 'setValues': function (someValues) {
56//console.log("KeyValueObjectStore.setValues", someValues);
57 this._values = someValues;
58 return this;
59 },
60
61 //'initWithObjectStore': function (anObjectStore) {
62 // this._referenceObjectStore = anObjectStore;
63 //},
64
65 'removeAllData': function () {
66 this._values = {};
67 },
68
69 //-------------------------------------------------------------------------
70
71 'getValue': function(aKeyPath) {
72 var result;
73 var keys;
74 var i,c;
75
76 result = this.values();
77
78 keys = (aKeyPath + '').split('.');
79 c = keys.length;
80 i = 0;
81
82 while ((i<c) && (result != null)) {
83 if (typeof result[keys[i]] != 'undefined') {
84 result = result[keys[i]];
85 } else {
86 result = null;
87 }
88
89 i++;
90 }
91
92 return result;
93 },
94
95 //-------------------------------------------------------------------------
96
97 'setValue': function(aKeyPath, aValue) {
98 var targetObject;
99 var keys;
100 var i,c;
101
102//console.log(">>> KeyValueObjectStore.setValue", this, this.values(), aKeyPath, aValue);
103 targetObject = this.values();
104 keys = (aKeyPath + '').split('.');
105 c = keys.length - 1;
106 for (i=0; i<c; i++) {
107//console.log("--- KeyValueObjectStore.setValue", i, targetObject, keys[i]);
108 if (typeof targetObject[keys[i]] == 'undefined') {
109 targetObject[keys[i]] = {}
110 }
111
112 targetObject = targetObject[keys[i]];
113 }
114
115 targetObject[keys[c]] = aValue;
116//console.log("<<< KeyValueObjectStore.setValue");
117
118 return aValue;
119 },
120
121 //-------------------------------------------------------------------------
122
123 'removeValue': function (aKeyPath) {
124 // this.setValue(aKeyPath, null);
125
126 var targetObject;
127 var keys;
128 var i,c;
129
130 targetObject = this.values();
131 keys = ('' + aKeyPath).split('.');
132 c = keys.length - 1;
133 for (i=0; i<c; i++) {
134 if (typeof targetObject[keys[i]] == 'undefined') {
135 targetObject[keys[i]] = {}
136 }
137
138 targetObject = targetObject[keys[i]];
139 }
140
141 delete targetObject[keys[c]];
142 },
143
144 //-------------------------------------------------------------------------
145
146 'deferredGetOrSet': function(aKeyPath, aGetterFunction) {
147 var deferredResult;
148
149 if (this.getValue(aKeyPath) != null) {
150 deferredResult = MochiKit.Async.succeed(this.getValue(aKeyPath));
151 } else {
152 deferredResult = new Clipperz.Async.Deferred("KeyValueObjectStore.deferredGetOrSet [" + aKeyPath + "]", {trace:false});
153
154 deferredResult.addCallback(aGetterFunction);
155 deferredResult.addMethod(this, 'setValue', aKeyPath);
156 deferredResult.callback();
157 }
158
159 return deferredResult;
160 },
161
162 //-------------------------------------------------------------------------
163
164 'isEmpty': function () {
165 return (MochiKit.Base.keys(this.values()).length == 0)
166 },
167
168 //-------------------------------------------------------------------------
169/*
170 'dumpData': function () {
171 return Clipperz.Base.serializeJSON(this.values());
172 },
173*/
174 //-------------------------------------------------------------------------
175 __syntaxFix__: "syntax fix"
176});
diff --git a/frontend/gamma/js/Clipperz/Logging.js b/frontend/gamma/js/Clipperz/Logging.js
new file mode 100644
index 0000000..d6c107e
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Logging.js
@@ -0,0 +1,42 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz');
30
31if (typeof console == 'undefined') {
32 Clipperz.log = MochiKit.Logging.logDebug;
33// Safari/WebKit 4
34} else if (navigator.userAgent.match(/WebKit/)) {
35 //Clipperz.log = console.log;
36 Clipperz.log = MochiKit.Logging.logDebug;
37} else if (navigator.userAgent.match(/Gecko/)) {
38 Clipperz.log = function () {
39 // firebug 1.3 bug see http://code.google.com/p/fbug/issues/detail?id=1347
40 console.log.apply(window._firebug, arguments);
41 };
42} \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js b/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
new file mode 100644
index 0000000..789d6b8
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
@@ -0,0 +1,196 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29/*
30if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
31if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
32
33Clipperz.PM.BookmarkletProcessor = function(aConfiguration) {
34 this._configuration = aConfiguration;
35
36 this._editableFields = null;
37 this._favicon = null;
38
39 return this;
40}
41
42Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, {
43
44 'toString': function() {
45 return "Clipperz.PM.BookmarkletProcessor";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'configuration': function() {
51 return this._configuration;
52 },
53
54 //-------------------------------------------------------------------------
55
56 'pageTitle': function() {
57 return this.configuration().page.title;
58 },
59
60 //-------------------------------------------------------------------------
61
62 'fields': function() {
63 return this.configuration().form.inputs;
64 },
65
66 //-------------------------------------------------------------------------
67
68 'editableFields': function() {
69 if (this._editableFields == null) {
70 this._editableFields = MochiKit.Base.filter(function(aField) {
71 var result;
72 var type;
73
74 type = aField['type'].toLowerCase();
75 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
76
77 return result;
78 }, this.fields())
79 }
80
81 return this._editableFields;
82 },
83
84 //-------------------------------------------------------------------------
85
86 'hostname': function() {
87 if (this._hostname == null) {
88 var actionUrl;
89
90 actionUrl = this.configuration()['form']['attributes']['action'];
91 this._hostname = actionUrl.replace(/ ^ h t t p s ? : \ / \ / ( [ ^ \ / ] * ) \ / . * /, '$1');
92 }
93
94 return this._hostname;
95 },
96
97 'favicon': function() {
98 if (this._favicon == null) {
99 this._favicon = "http://" + this.hostname() + "/favicon.ico";
100 }
101
102 return this._favicon;
103 },
104
105 //-------------------------------------------------------------------------
106 __syntaxFix__: "syntax fix"
107});
108
109//#############################################################################
110/ *
111Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) {
112 var processor;
113 var record;
114 var recordVersion;
115 var directLogin;
116 var bindings;
117 var i,c;
118
119 processor = new Clipperz.PM.BookmarkletProcessor(aConfiguration);
120
121 record = new Clipperz.PM.DataModel.Record({
122 'label':processor.pageTitle(),
123 'notes':"",
124 'user': anUser
125 });
126 recordVersion = new Clipperz.PM.DataModel.Record.Version(record, {})
127 record.setCurrentVersion(recordVersion);
128
129 bindings = {};
130
131 c = processor.editableFields().length;
132 for (i=0; i<c; i++) {
133 var formField;
134 var recordField;
135
136 formField = processor.editableFields()[i];
137 recordField = new Clipperz.PM.DataModel.RecordField({
138 'label':formField['name'],
139 'value':formField['value'],
140 'type': Clipperz.PM.Strings.inputTypeToRecordFieldType[formField['type']],
141 'hidden': false,
142 'recordVersion':recordVersion
143 });
144 recordVersion.addField(recordField);
145
146 bindings[formField['name']] = recordField.key();
147 }
148
149 directLogin = new Clipperz.PM.DataModel.DirectLogin({
150 'record': record,
151 'label': processor.pageTitle(),
152 'favicon': processor.favicon(),
153 'formData': processor.configuration()['form'],
154 'bindingData':bindings,
155 'bookmarkletVersion':'0.2'
156 });
157 record.addDirectLogin(directLogin);
158
159 anUser.addRecord(record);
160
161 return record;
162};
163* /
164//-----------------------------------------------------------------------------
165
166Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration = function(aConfiguration) {
167 var result;
168
169 //throw "XSS Bookmarklet attempt";
170
171 result = aConfiguration;
172
173 return result;
174};
175
176//-----------------------------------------------------------------------------
177
178Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration = function(aConfiguration) {
179 var result;
180
181 try {
182 result = Clipperz.Base.evalJSON(aConfiguration);
183 result = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(result);
184
185 if (result['version'] != '0.2.3') {
186 throw "WrongBookmarkletVersion";
187 }
188 } catch (exception) {
189 throw exception;
190 }
191
192 return result;
193};
194
195//-----------------------------------------------------------------------------
196*/ \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/Connection.js b/frontend/gamma/js/Clipperz/PM/Connection.js
new file mode 100644
index 0000000..6e58c60
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Connection.js
@@ -0,0 +1,619 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31
32//-----------------------------------------------------------------------------
33//
34 // Abstract C O N N E C T I O N class
35//
36//-----------------------------------------------------------------------------
37
38Clipperz.PM.Connection = function (args) {
39 args = args || {};
40
41 this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy;
42 this._getCredentialsFunction = args.getCredentialsFunction;
43
44 this._clipperz_pm_crypto_version = null;
45 this._connectionId = null;
46 this._sharedSecret = null;
47
48 return this;
49}
50
51Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, {
52
53 'toString': function() {
54 return "Connection [" + this.version() + "]";
55 },
56
57 //=========================================================================
58
59 'version': function() {
60 throw Clipperz.Base.exception.AbstractMethod;
61 },
62
63 'clipperz_pm_crypto_version': function() {
64 if (this._clipperz_pm_crypto_version == null) {
65 var connectionVersions;
66 varversions;
67 varversion;
68 var i, c;
69
70 version = null;
71 connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions;
72 versions = MochiKit.Base.keys(connectionVersions);
73 c = versions.length;
74 for (i=0; i<c; i++) {
75 if (! (versions[i] == 'current')) {
76 if (this instanceof connectionVersions[versions[i]]) {
77 version = versions[i];
78 };
79 }
80 }
81
82 this._clipperz_pm_crypto_version = version;
83 }
84
85 return this._clipperz_pm_crypto_version;
86 },
87
88 //-------------------------------------------------------------------------
89
90 'defaultErrorHandler': function(anErrorString, anException) {
91MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")");
92 },
93
94 //-------------------------------------------------------------------------
95
96 'getCredentialsFunction': function () {
97 return this._getCredentialsFunction;
98 },
99
100 'normalizedCredentials': function(someValues) {
101 throw Clipperz.Base.exception.AbstractMethod;
102 },
103
104 //=========================================================================
105
106 'proxy': function () {
107 return this._proxy;
108 },
109
110 //=========================================================================
111
112 'register': function () {
113 throw Clipperz.Base.exception.AbstractMethod;
114 },
115
116 'login': function() {
117 throw Clipperz.Base.exception.AbstractMethod;
118 },
119
120 //-------------------------------------------------------------------------
121
122 'message': function(someArguments, aCallback) {
123 throw Clipperz.Base.exception.AbstractMethod;
124 },
125
126 //-------------------------------------------------------------------------
127
128 'serverSideUserCredentials': function() {
129 throw Clipperz.Base.exception.AbstractMethod;
130 },
131
132 //=========================================================================
133
134 'sharedSecret': function () {
135 return this._sharedSecret;
136 },
137
138 'setSharedSecret': function (aValue) {
139 this._sharedSecret = aValue;
140 },
141
142 //-------------------------------------------------------------------------
143
144 'connectionId': function() {
145 return this._connectionId;
146 },
147
148 'setConnectionId': function(aValue) {
149 this._connectionId = aValue;
150 },
151
152 //=========================================================================
153/*
154 //TODO: ?????
155 'oneTimePassword': function() {
156 return this._oneTimePassword;
157 },
158
159 'setOneTimePassword': function(aValue) {
160 this._oneTimePassword = aValue;
161 },
162*/
163 //=========================================================================
164
165 'reset': function() {
166 this.setSharedSecret(null);
167 this.setConnectionId(null);
168 },
169
170 //=========================================================================
171 __syntaxFix__: "syntax fix"
172
173}
174);
175
176
177if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; }
178//-----------------------------------------------------------------------------
179//
180 // S R P [ 1 . 0 ] C O N N E C T I O N class
181//
182//-----------------------------------------------------------------------------
183
184Clipperz.PM.Connection.SRP['1.0'] = function (args) {
185 Clipperz.PM.Connection.call(this, args);
186
187 return this;
188}
189
190Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), {
191
192 'version': function() {
193 return '1.0';
194 },
195
196 //=========================================================================
197
198 'register': function (someUserData) {
199 vardeferredResult;
200 var cryptoVersion;
201 var srpConnection;
202
203 cryptoVersion = this.clipperz_pm_crypto_version();
204
205 deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false});
206 deferredResult.collectResults({
207 'credentials': [
208 this.getCredentialsFunction(),
209 MochiKit.Base.method(this, 'normalizedCredentials'),
210 MochiKit.Base.bind(function(someCredentials) {
211 var srpConnection;
212 var result;
213
214 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
215 result = srpConnection.serverSideCredentials();
216 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
217
218 return result;
219 }, this)
220 ],
221 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData),
222 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Connection.communicationProtocol.currentVersion),
223 'message':MochiKit.Base.partial(MochiKit.Async.succeed, 'completeRegistration')
224 });
225 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
226 deferredResult.addMethod(this.proxy(), 'registration');
227 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
228
229 deferredResult.callback();
230
231 return deferredResult;
232 },
233
234 //-------------------------------------------------------------------------
235
236 'updateCredentials': function (aUsername, aPassphrase, someUserData) {
237 vardeferredResult;
238
239 deferredResult = new Clipperz.Async.Deferred("Connection.updateCredentials", {trace:false});
240 deferredResult.collectResults({
241 'credentials': [
242 MochiKit.Base.method(this, 'normalizedCredentials', {username:aUsername, password:aPassphrase}),
243 MochiKit.Base.bind(function(someCredentials) {
244 var srpConnection;
245 var result;
246
247 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
248 result = srpConnection.serverSideCredentials();
249 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
250
251 return result;
252 }, this)
253 ],
254 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData)
255 });
256 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
257 deferredResult.addMethod(this, 'message', 'upgradeUserCredentials');
258 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
259 deferredResult.callback();
260
261 return deferredResult;
262
263 },
264
265 //=========================================================================
266
267 'redeemOneTimePassword': function (someParameters) {
268//console.log("Connections.redeemOneTimePassword", someParameters['username'], someParameters['password']);
269/*
270 //=========================================================================
271 //LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js)
272 deferredResult.addCallback(function(anUsername, aOneTimePassword) {
273 var args;
274
275 args = {
276 'message': 'oneTimePassword',
277 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion,
278 'parameters': {
279 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword),
280 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword)
281 }
282 }
283
284 return args;
285 }, anUsername, oneTimePassword);
286 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP');
287 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
288 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase');
289 deferredResult.addCallback(function(aResult) {
290 return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']);
291 });
292 deferredResult.addCallback(function(aResult) {
293 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
294 });
295 deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername),
296*/
297 var args;
298 var normalizedOTP;
299
300 normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']);
301
302 args = {
303 'message': 'oneTimePassword',
304 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion,
305 'parameters': {
306 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP),
307 'oneTimePasswordKeyChecksum':Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP)
308 }
309 }
310
311 return Clipperz.Async.callbacks("Connction.redeemOTP", [
312 MochiKit.Base.method(this.proxy(), 'handshake', args),
313 function(aResult) {
314 return Clipperz.PM.Crypto.deferredDecrypt({
315 value:aResult['data'],
316 key:normalizedOTP,
317 version:aResult['version']
318 });
319 },
320 function(aResult) {
321 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
322 }
323 ], {trace:false})
324 },
325
326 'login': function(/*anUsername, aPassphrase*/) {
327 vardeferredResult;
328 var cryptoVersion;
329 var srpConnection;
330
331 cryptoVersion = this.clipperz_pm_crypto_version();
332
333 deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false});
334 deferredResult.addCallback(this.getCredentialsFunction());
335 deferredResult.addMethod(this, 'normalizedCredentials');
336 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials');
337 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
338 deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) {
339 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
340 }, this));
341 deferredResult.addCallback(function() {
342 var result;
343
344 result = {
345 message: 'connect',
346 version: cryptoVersion,
347 parameters: {
348 C: srpConnection.C(),
349 A: srpConnection.A().asString(16)
350 // reconnecting: this.connectionId()
351 }
352 };
353
354 // TODO: ?????
355 // if (isReconnecting == true) {
356 // args.parameters['reconnecting'] = aConnection.connectionId();
357 // }
358
359 return result;
360 });
361 deferredResult.addMethod(this.proxy(), 'handshake');
362 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification');
363 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
364 deferredResult.addCallback(function(someParameters) {
365 var result;
366
367 srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16));
368 srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16));
369
370 //TODO: ?????
371 // if (typeof(someParameters['oneTimePassword']) != 'undefined') {
372 // this.setOneTimePassword(someParameters['oneTimePassword']);
373 // }
374
375 result = {
376 message: 'credentialCheck',
377 version: cryptoVersion,
378 parameters: {
379 M1: srpConnection.M1()
380 }
381 };
382
383 return result;
384 });
385 deferredResult.addMethod(this.proxy(), 'handshake');
386 deferredResult.addCallback(function(someParameters) {
387 var result;
388
389 if (someParameters['M2'] == srpConnection.M2()) {
390 result = MochiKit.Async.succeed(someParameters);
391 } else {
392 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum);
393 }
394
395 return result;
396 });
397 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
398 this.setConnectionId(someParameters['connectionId']);
399 this.setSharedSecret(srpConnection.K());
400
401 // TODO: ?????
402 // if (this.oneTimePassword() != null) {
403 /// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword()));
404 // }
405 return someParameters;
406 }, this));
407 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn');
408 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
409 deferredResult.addCallback(MochiKit.Async.succeed, {result:"done"});
410
411 deferredResult.callback();
412
413 return deferredResult;
414 },
415
416 //=========================================================================
417
418 'logout': function() {
419 return Clipperz.Async.callbacks("Connection.logout", [
420 MochiKit.Base.method(this, 'setSharedSecret'),
421 MochiKit.Base.method(this.proxy(), 'logout', {})
422 ], {trace:false});
423 },
424
425 //=========================================================================
426
427 'ping': function () {
428 //TODO: ping the server in order to have a valid session
429 },
430
431 //=========================================================================
432
433 'message': function(aMessageName, someParameters) {
434 var args;
435
436//console.log(">>> Connection.message", aMessageName, someParameters);
437 args = {
438 message: aMessageName,
439 srpSharedSecret: this.sharedSecret(),
440 parameters: (someParameters || {})
441 }
442
443 return this.sendMessage(args);
444 },
445
446 //-------------------------------------------------------------------------
447
448 'sendMessage': function(someArguments) {
449 vardeferredResult;
450
451 deferredResult = new Clipperz.Async.Deferred("Connection.sendMessage", {trace:false});
452 deferredResult.addMethod(this.proxy(), 'message', someArguments);
453 deferredResult.addCallback(MochiKit.Base.bind(function(res) {
454 if (typeof(res['lock']) != 'undefined') {
455 //TODO: ?????
456 // ?? this.user().setLock(res['lock']);
457 }
458 return res;
459 }, this));
460
461 deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments);
462 deferredResult.callback();
463
464 return deferredResult
465 },
466
467 //-------------------------------------------------------------------------
468
469 'messageExceptionHandler': function(anOriginalMessageArguments, anError) {
470 var result;
471
472console.log(">>> Connection.messageExceptionHandler", anError, anError.message);
473 if (anError instanceof MochiKit.Async.CancelledError) {
474 result = anError;
475 } else {
476 if ((anError.message == 'Trying to communicate without an active connection')||
477 (anError.message == 'No tollManager available for current session')
478 ) {
479 result = this.reestablishConnection(anOriginalMessageArguments);
480 } else if (anError.message == 'Session with stale data') {
481 MochiKit.Signal.signal(this, 'EXCEPTION');
482 } else {
483 result = anError;
484 }
485 }
486console.log("<<< Connection.messageExceptionHandler", anError)
487
488 return result;;
489 },
490
491 //=========================================================================
492
493 'reestablishConnection': function(anOriginalMessageArguments) {
494 var deferredResult;
495
496 deferredResult = new Clipperz.Async.Deferred("Connection.reestablishConnection");
497 deferredResult.addMethod(this, 'reset');
498 deferredResult.addMethod(this, 'login', true);
499 deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) {
500 aMessage['srpSharedSecret'] = this.sharedSecret();
501 return aMessage;
502 }, this), anOriginalMessageArguments);
503 deferredResult.addMethod(this, 'sendMessage');
504 deferredResult.addErrback(MochiKit.Signal.signal, this, 'EXCEPTION', null);
505 deferredResult.callback();
506
507 return deferredResult;
508 },
509
510 //=========================================================================
511
512 'serverSideUserCredentials': function(aUsername, aPassword) {
513 varresult;
514 varnewSrpConnection;
515 var normalizedAttributes;
516
517 normalizedAttributes = this.normalizedCredentials({username:aUsername, password:aPassword});
518 newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:normalizedAttributes['username'], P:normalizedAttributes['password'], hash:this.hash() });
519 result = newSrpConnection.serverSideCredentials();
520 result['version'] = this.clipperz_pm_crypto_version();
521
522 return result;
523 },
524
525 //=========================================================================
526
527 'normalizedCredentials': function(someValues) {
528 var result;
529
530 result = {}
531 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'])).toHexString().substring(2);
532 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
533
534 return result;
535 },
536
537 //-----------------------------------------------------------------------------
538
539 'hash': function() {
540 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash;
541 },
542
543 //-----------------------------------------------------------------------------
544 __syntaxFix__: "syntax fix"
545
546});
547
548
549
550//-----------------------------------------------------------------------------
551//
552 // S R P [ 1 . 1 ] C O N N E C T I O N class
553//
554//-----------------------------------------------------------------------------
555
556Clipperz.PM.Connection.SRP['1.1'] = function (args) {
557 Clipperz.PM.Connection.SRP['1.0'].call(this, args);
558
559 return this;
560}
561
562Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), {
563
564 'version': function() {
565 return '1.1';
566 },
567
568 //-----------------------------------------------------------------------------
569
570 'normalizedCredentials': function(someValues) {
571 var result;
572
573 result = {}
574 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'] + someValues['password'])).toHexString().substring(2);
575 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
576
577 return result;
578 },
579
580 //-----------------------------------------------------------------------------
581
582 'hash': function() {
583 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash;
584 },
585
586 //-----------------------------------------------------------------------------
587 __syntaxFix__: "syntax fix"
588
589});
590
591Clipperz.PM.Connection.exception = {
592 WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue"),
593 UnexpectedRequest:new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.UnexpectedRequest")
594};
595
596
597Clipperz.PM.Connection.communicationProtocol = {
598 'currentVersion': '0.2',
599 'versions': {
600 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection,
601 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection
602 },
603 'fallbackVersions': {
604 // 'current':'0.1',
605 '0.2': '0.1',
606 '0.1': null
607 }
608};
609
610MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
611 'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
612});
613
614MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.fallbackVersions, {
615 'current': Clipperz.PM.Connection.communicationProtocol.fallbackVersions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
616});
617
618
619
diff --git a/frontend/gamma/js/Clipperz/PM/Crypto.js b/frontend/gamma/js/Clipperz/PM/Crypto.js
new file mode 100644
index 0000000..bfafbea
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Crypto.js
@@ -0,0 +1,513 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; }
32
33Clipperz.PM.Crypto.VERSION = "0.2";
34Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto";
35
36Clipperz.PM.Crypto.encryptingFunctions = {};
37
38MochiKit.Base.update(Clipperz.PM.Crypto, {
39
40 '__repr__': function () {
41 return "[" + this.NAME + " " + this.VERSION + "]";
42 },
43
44 //-------------------------------------------------------------------------
45
46 'toString': function () {
47 return this.__repr__();
48 },
49
50 //-------------------------------------------------------------------------
51/*
52 'communicationProtocol': {
53 'currentVersion': '0.2',
54 'versions': {
55 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection,
56 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection
57 },
58 'fallbackVersions': {
59 'current':'0.1',
60 '0.2': '0.1',
61 '0.1': null
62 }
63 },
64*/
65 //-------------------------------------------------------------------------
66
67 'encryptingFunctions': {
68 'currentVersion': '0.3',
69 'versions': {
70
71 //#####################################################################
72
73 '0.1': {
74 'encrypt': function(aKey, aValue) {
75 return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue));
76 },
77
78 'deferredEncrypt': function(aKey, aValue) {
79 var deferredResult;
80
81 deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt");
82 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue);
83 deferredResult.callback();
84
85 return deferredResult;
86 },
87
88 'decrypt': function(aKey, aValue) {
89 var result;
90
91 if (aValue != null) {
92 result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue));
93 } else {
94 result = null;
95 }
96
97 return result;
98 },
99
100 'deferredDecrypt': function(aKey, aValue) {
101 var deferredResult;
102
103 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt");
104 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue);
105 deferredResult.callback();
106
107 return deferredResult;
108 },
109
110 'hash': function(aValue) {
111 var result;
112 var strngResult;
113
114 stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); //!!!!!!!
115 result = new Clipperz.ByteArray("0x" + stringResult);
116
117 return result;
118 },
119
120 'deriveKey': function(aStringValue) {
121 return Clipperz.Crypto.Base.computeHashValue(aStringValue);
122 }
123 },
124
125 //#####################################################################
126
127 '0.2': {
128 'encrypt': function(aKey, aValue, aNonce) {
129 var result;
130 varkey, value;
131 var dataToEncrypt;
132 var encryptedData;
133
134 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
135 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
136 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
137 encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce);
138 result = encryptedData.toBase64String();
139
140 return result;
141 },
142
143 'deferredEncrypt': function(aKey, aValue, aNonce) {
144 var deferredResult;
145 varkey, value;
146 var dataToEncrypt;
147 // var encryptedData;
148
149 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
150 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
151 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
152
153 deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt")
154 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce);
155 deferredResult.addCallback(function(aResult) {
156 return aResult.toBase64String();
157 })
158 deferredResult.callback();
159
160 return deferredResult;
161 },
162
163 'decrypt': function(aKey, aValue) {
164 var result;
165
166 if (aValue != null) {
167 var key, value;
168 var decryptedData;
169 var decryptedValue;
170
171 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
172 value = new Clipperz.ByteArray().appendBase64String(aValue);
173
174 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
175 decryptedValue = decryptedData.split((256/8));
176
177 try {
178 result = Clipperz.Base.evalJSON(decryptedValue.asString());
179 } catch (exception) {
180 MochiKit.Logging.logError("Error while decrypting data [1]");
181 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
182 }
183 } else {
184 result = null;
185 }
186
187 return result;
188 },
189
190 'deferredDecrypt': function(aKey, aValue) {
191 var result;
192
193 if (aValue != null) {
194 var deferredResult;
195 var key, value;
196 // var decryptedData;
197
198 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
199 value = new Clipperz.ByteArray().appendBase64String(aValue);
200
201 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt");
202 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
203 deferredResult.addCallback(function(aResult) {
204 var result;
205 var decryptedData;
206
207 decryptedData = aResult.split((256/8));
208
209 try {
210 result = Clipperz.Base.evalJSON(decryptedData.asString());
211 } catch (exception) {
212 MochiKit.Logging.logError("Error while decrypting data [2]");
213 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
214 }
215
216 return result;
217 })
218 deferredResult.callback();
219
220 result = deferredResult;
221 } else {
222 result = MochiKit.Async.succeed(null);
223 }
224
225 return result;
226 },
227
228 'hash': Clipperz.Crypto.SHA.sha_d256,
229
230 'deriveKey': function(aStringValue) {
231 varbyteData;
232 var result;
233
234 byteData = new Clipperz.ByteArray(aStringValue);
235 result = Clipperz.Crypto.SHA.sha_d256(byteData);
236
237 return result;
238 }
239 },
240
241 //#####################################################################
242
243 '0.3': {
244 'encrypt': function(aKey, aValue, aNonce) {
245 var result;
246 varkey, value;
247 var data;
248 var dataToEncrypt;
249 var encryptedData;
250
251 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
252 value = Clipperz.Base.serializeJSON(aValue);
253 data = new Clipperz.ByteArray(value);
254 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
255 result = encryptedData.toBase64String();
256
257 return result;
258 },
259
260 'deferredEncrypt': function(aKey, aValue, aNonce) {
261 var deferredResult;
262 varkey, value;
263 var data;
264 var dataToEncrypt;
265 var encryptedData;
266
267 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
268 value = Clipperz.Base.serializeJSON(aValue);
269 data = new Clipperz.ByteArray(value);
270
271 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt")
272 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce);
273 deferredResult.addCallback(function(aResult) {
274 return aResult.toBase64String();
275 })
276 deferredResult.callback();
277
278 return deferredResult;
279 },
280
281 'decrypt': function(aKey, aValue) {
282 var result;
283
284 if (aValue != null) {
285 var key, value;
286 var decryptedData;
287
288 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
289 value = new Clipperz.ByteArray().appendBase64String(aValue);
290
291 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
292
293 value = decryptedData.asString();
294 try {
295 result = Clipperz.Base.evalJSON(value);
296 } catch (exception) {
297 MochiKit.Logging.logError("Error while decrypting data [3]");
298 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
299 }
300 } else {
301 result = null;
302 }
303
304 return result;
305 },
306
307 'deferredDecrypt': function(aKey, aValue) {
308 var deferredResult;
309
310 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false});
311 // now = new Date;
312
313 if (aValue != null) {
314 var key, value;
315 // var decryptedData;
316
317 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
318 value = new Clipperz.ByteArray().appendBase64String(aValue);
319
320 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
321 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
322 deferredResult.addCallback(function(aResult) {
323 return aResult.asString();
324 });
325 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
326 deferredResult.addCallback(Clipperz.Base.evalJSON);
327 deferredResult.addErrback(function(anError) {
328 MochiKit.Logging.logError("Error while decrypting data [4]");
329 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
330 })
331 } else {
332 deferredResult.addCallback(function() {
333 return null;
334 });
335 }
336 deferredResult.callback();
337
338 return deferredResult;
339 },
340
341 'hash': Clipperz.Crypto.SHA.sha_d256,
342
343 'deriveKey': function(aStringValue) {
344 varbyteData;
345 var result;
346
347 byteData = new Clipperz.ByteArray(aStringValue);
348 result = Clipperz.Crypto.SHA.sha_d256(byteData);
349
350 return result;
351 }
352
353 },
354
355 //#####################################################################
356/*
357 '0.4': {
358 'encrypt': function(aKey, aValue, aNonce) {
359 var result;
360 varkey, value;
361 var data;
362 var dataToEncrypt;
363 var encryptedData;
364
365//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
366 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
367//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1");
368 value = Clipperz.Base.serializeJSON(aValue);
369//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2");
370/ *
371//MochiKit.Logging.logDebug("--> encrypt.fullSize: " + value.length);
372 value = value.replace(/":{"label":"/g, '":{l:"');
373 value = value.replace(/":{"key":"/g, '":{k:"');
374 value = value.replace(/":{"notes":"/g, '":{n:"');
375 value = value.replace(/":{"record":"/g, '":{r:"');
376 value = value.replace(/", "label":"/g, '",l:"');
377 value = value.replace(/", "favicon":"/g,'",f:"');
378//MochiKit.Logging.logDebug("<-- encrypt.compressed: " + value.length);
379* /
380 data = new Clipperz.ByteArray(value);
381//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3");
382 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
383//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4");
384 result = encryptedData.toBase64String();
385//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
386
387 return result;
388 },
389
390 'decrypt': function(aKey, aValue) {
391 var result;
392
393 if (aValue != null) {
394 var key, value;
395 var decryptedData;
396
397 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
398 value = new Clipperz.ByteArray().appendBase64String(aValue);
399
400 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
401
402 value = decryptedData.asString();
403/ *
404 value = value.replace(/":{l:"/g,'":{"label":"');
405 value = value.replace(/":{k:"/g,'":{"key":"');
406 value = value.replace(/":{n:"/g,'":{"notes":"');
407 value = value.replace(/":{r:"/g,'":{"record":"');
408 value = value.replace(/",l:"/g, '", "label":"');
409 value = value.replace(/",f:"/g, '", "favicon":"');
410* /
411 try {
412 result = Clipperz.Base.evalJSON(value);
413 } catch (exception) {
414 MochiKit.Logging.logError("Error while decrypting data");
415 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
416 }
417
418
419 } else {
420 result = null;
421 }
422
423 return result;
424 },
425
426 'hash': Clipperz.Crypto.SHA.sha_d256
427 },
428*/
429 //#####################################################################
430 __syntaxFix__: "syntax fix"
431 }
432 },
433
434 //-------------------------------------------------------------------------
435
436 'encrypt': function(aKey, aValue, aVersion) {
437 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue);
438 },
439
440 'deferredEncrypt': function(someParameters) {
441 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredEncrypt(someParameters['key'], someParameters['value']);
442 },
443
444 //.........................................................................
445
446 'decrypt': function(aKey, aValue, aVersion) {
447 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].decrypt(aKey, aValue);
448 },
449
450 'deferredDecrypt': function(someParameters) {
451 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredDecrypt(someParameters['key'], someParameters['value']);
452 },
453
454 //-------------------------------------------------------------------------
455
456 'hash': function(aValue) {
457 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]['hash'](aValue);
458 },
459
460 //-------------------------------------------------------------------------
461
462 'randomKey': function() {
463 return Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
464 },
465
466 //-------------------------------------------------------------------------
467
468 'deriveKey': function(aValue) {
469 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion].deriveKey(aValue);
470 },
471
472 //-------------------------------------------------------------------------
473
474 'passwordEntropy': function(aValue) {
475 var result;
476 varbitPerChar;
477
478 bitPerChar = 4;
479 if (/[a-z]/.test(aValue)) {
480 bitPerChar ++;
481 }
482 if (/[A-Z]/.test(aValue)) {
483 bitPerChar ++;
484 }
485 if (/[^a-zA-Z0-9]/.test(aValue)) {
486 bitPerChar ++;
487 }
488
489 result = aValue.length * bitPerChar;
490
491 return result;
492 },
493
494 //-------------------------------------------------------------------------
495
496 'nullValue': '####',
497
498 //-------------------------------------------------------------------------
499 __syntaxFix__: "syntax fix"
500
501});
502
503//*****************************************************************************
504
505//MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
506 //'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
507//});
508
509MochiKit.Base.update(Clipperz.PM.Crypto.encryptingFunctions.versions, {
510 'current': Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]
511});
512
513//*****************************************************************************
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
new file mode 100644
index 0000000..1d38509
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
@@ -0,0 +1,1076 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.DataModel');
30
31Clipperz.PM.DataModel.DirectLogin = function(args) {
32 args = args || {};
33
34 Clipperz.PM.DataModel.DirectLogin.superclass.constructor.apply(this, arguments);
35
36 this._reference =args.reference
37 ||Clipperz.PM.Crypto.randomKey();
38 this._record =args.record
39 ||Clipperz.Base.exception.raise('MandatoryParameter');
40
41 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction
42 ||this.record().retrieveDirectLoginIndexDataFunction()
43 ||Clipperz.Base.exception.raise('MandatoryParameter');
44 this._setIndexDataFunction = args.setIndexDataFunction
45 ||this.record().setDirectLoginIndexDataFunction()
46 ||Clipperz.Base.exception.raise('MandatoryParameter');
47 this._removeIndexDataFunction =args.removeIndexDataFunction
48 ||this.record().removeDirectLoginIndexDataFunction()
49 ||Clipperz.Base.exception.raise('MandatoryParameter');
50
51 this._inputs = null;
52 this._bindings = null;
53 this._formValues = null;
54
55 // this._inputsDeferredLock = new MochiKit.Async.DeferredLock();
56 // this._bindingsDeferredLock = new MochiKit.Async.DeferredLock();
57 // this._formValuesDeferredLock = new MochiKit.Async.DeferredLock();
58
59 this._transientState = null;
60
61 this._isBrandNew = MochiKit.Base.isUndefinedOrNull(args.reference);
62
63 this.record().addDirectLogin(this);
64
65 return this;
66}
67
68Clipperz.Base.extend(Clipperz.PM.DataModel.DirectLogin, Object, {
69
70 'toString': function() {
71 return "DirectLogin (" + this.reference() + ")";
72 },
73
74 //=========================================================================
75
76 'reference': function () {
77 return this._reference;
78 },
79
80 //-------------------------------------------------------------------------
81
82 'record': function () {
83 return this._record;
84 },
85
86 //=========================================================================
87
88 'isBrandNew': function () {
89 return this._isBrandNew;
90 },
91
92 //=========================================================================
93
94 'removeIndexDataFunction': function () {
95 return this._removeIndexDataFunction;
96 },
97
98 'remove': function () {
99 return Clipperz.Async.callbacks("DirectLogin.remove", [
100 MochiKit.Base.partial(this.removeIndexDataFunction(), this.reference()),
101 MochiKit.Base.method(this.record(), 'removeDirectLogin', this)
102 ], {trace:false});
103 },
104
105 //=========================================================================
106 /*
107 'inputsDeferredLock': function () {
108 return this._inputsDeferredLock;
109 },
110
111 'bindingsDeferredLock': function () {
112 return this._bindingsDeferredLock;
113 },
114
115 'formValuesDeferredLock': function () {
116 return this._formValuesDeferredLock;
117 },
118*/
119 //=========================================================================
120
121 'label': function () {
122 return this.getIndexDataForKey('label');
123 },
124
125 'setLabelKeepingBackwardCompatibilityWithBeta': function (aValue) {
126 return Clipperz.Async.callbacks("DirectLogin.setLabelKeepingBackwardCompatibilityWithBeta", [
127 MochiKit.Base.method(this, 'setIndexDataForKey', 'label', aValue),
128 MochiKit.Base.method(this, 'setValue', 'label', aValue)
129 ], {trace:false});
130 },
131
132 'setLabel': function (aValue) {
133 return this.setLabelKeepingBackwardCompatibilityWithBeta(aValue);
134 // return this.setIndexDataForKey('label', aValue);
135 },
136
137 //=========================================================================
138
139 'favicon': function () {
140 return this.getIndexDataForKey('favicon');
141 },
142
143 'setFavicon': function (aValue) {
144 return this.setIndexDataForKey('favicon', aValue);
145 },
146
147 'faviconUrlWithBookmarkletConfiguration': function (aBookmarkletConfiguration) {
148 varresult;
149
150 if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['page']['favicon'])) {
151 result = aBookmarkletConfiguration['page']['favicon'];
152 } else if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['form']['attributes']['action'])) {
153 var actionUrl;
154 var hostname;
155
156 actionUrl = aBookmarkletConfiguration['form']['attributes']['action'];
157 hostname = actionUrl.replace(/^https?:\/\/([^\/]*)\/.*/, '$1');
158 result = "http://" + hostname + "/favicon.ico";
159 } else {
160 result = null;
161 }
162
163
164 return result;
165 },
166
167 //-------------------------------------------------------------------------
168/*
169 'faviconData': function () {
170 var regexp = new RegExp('^data\:\/\/.*', 'i');
171
172 return Clipperz.Async.callbacks("DirectLogin.favicon", [
173 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'),
174 MochiKit.Base.method(regexp, 'test'),
175 Clipperz.Async.deferredIf("is data URL", [
176 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon')
177 ], [
178 MochiKit.Base.method(this, 'transientState'),
179 MochiKit.Base.itemgetter('faviconData'),
180 Clipperz.Async.deferredIf('has a chaced value for the favicon data', [
181 MochiKit.Base.operator.identity
182 ], [
183 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'),
184 MochiKit.Base.method(this, 'loadFaviconDataFromURL')
185 ])
186
187 ])
188 ], {trace:false});
189 },
190
191 //-------------------------------------------------------------------------
192
193 'loadFaviconDataFromURL': function (anURL) {
194 var deferredResult;
195 var image;
196
197 deferredResult = new Clipperz.Async.Deferred("DirectLogin.loadFaviconDataFromURL", {trace:false});
198 deferredResult.addCallback(function (anEvent) {
199 var image = anEvent.src();
200 var canvas = document.createElement("canvas");
201 var result;
202
203 canvas.width = image.width;
204 canvas.height = image.height;
205
206 var ctx = canvas.getContext("2d");
207 ctx.drawImage(image, 0, 0);
208
209 result = canvas.toDataURL(/*"image/png"* /);
210
211 return result;
212 });
213 deferredResult.addErrback(MochiKit.Async.succeed, Clipperz.PM.Strings.getValue('defaultFaviconUrl'));
214 deferredResult.addBoth(MochiKit.Base.bind(function (aDataUrl) {
215 this.transientState()['faviconData'] = aDataUrl;
216
217 return aDataUrl;
218 }, this));
219
220 image = new Image();
221 MochiKit.Signal.connect(image, 'onload', MochiKit.Base.method(deferredResult, 'callback'));
222 MochiKit.Signal.connect(image, 'onerror', MochiKit.Base.method(deferredResult, 'errback'));
223 MochiKit.Signal.connect(image, 'onabort', MochiKit.Base.method(deferredResult, 'errback'));
224
225 image.src = anURL;
226
227 return deferredResult;
228 },
229*/
230
231 //=========================================================================
232
233 'type': function () {
234 return this.getValue('formData.attributes.type')
235 },
236
237 //=========================================================================
238
239 'serializedData': function () {
240 return Clipperz.Async.collectResults("DirectLogin.serializedData", {
241 'bookmarkletVersion': MochiKit.Base.method(this, 'getValue', 'bookmarkletVersion'),
242 'formData': MochiKit.Base.method(this, 'getValue', 'formData'),
243 'formValues': MochiKit.Base.method(this, 'getValue', 'formValues'),
244 'bindingData': [
245 MochiKit.Base.method(this, 'bindings'),
246 function (someBindings) {
247 var result;
248 var bindingKey;
249
250 result = {}
251 for (bindingKey in someBindings) {
252 result[bindingKey] = someBindings[bindingKey].serializedData();
253 }
254
255 return result;
256 }
257 ]
258 }, {trace:false})()
259 },
260
261 //=========================================================================
262/*
263 'fixFormDataFromBookmarkletVersion_0_1': function(aValue) {
264//{"type":"radio", "name":"action", "value":"new-user", "checked":false }, { "type":"radio", "name":"action", "value":"sign-in", "checked":true }
265 // ||
266 // \ /
267 // \/
268//{"name":"dominio", "type":"radio", "options":[{"value":"@alice.it", "checked":true}, {"value":"@tin.it", "checked":false}, {"value":"@virgilio.it", "checked":false}, {"value":"@tim.it", "checked":false}]}
269 var result;
270 var inputs;
271 var updatedInputs;
272 var radios;
273
274 result = aValue;
275 inputs = aValue['inputs'];
276
277 updatedInputs = MochiKit.Base.filter(function(anInput) {
278 varresult;
279 var type;
280
281 type = anInput['type'] || 'text';
282 result = type.toLowerCase() != 'radio';
283
284 return result;
285 }, inputs);
286 radios = MochiKit.Base.filter(function(anInput) {
287 varresult;
288 var type;
289
290 type = anInput['type'] || 'text';
291 result = type.toLowerCase() == 'radio';
292
293 return result;
294 }, inputs);
295
296 if (radios.length > 0) {
297 var updatedRadios;
298
299 updatedRadios = {};
300 MochiKit.Iter.forEach(radios, MochiKit.Base.bind(function(aRadio) {
301 varradioConfiguration;
302
303 radioConfiguration = updatedRadios[aRadio['name']];
304 if (radioConfiguration == null) {
305 radioConfiguration = {type:'radio', name:aRadio['name'], options:[]};
306 updatedRadios[aRadio['name']] = radioConfiguration;
307 }
308
309 //TODO: remove the value: field and replace it with element.dom.value = <some value>
310 radioConfiguration.options.push({value:aRadio['value'], checked:aRadio['checked']});
311
312 //TODO: shoud remove the 'formValues' call, as it is now deferred
313 // if ((aRadio['checked'] == true) && (this.formValues()[aRadio['name']] == null)) {
314 // this.formValues()[aRadio['name']] = aRadio['value'];
315 // }
316 }, this))
317
318 updatedInputs = MochiKit.Base.concat(updatedInputs, MochiKit.Base.values(updatedRadios));
319 }
320
321 delete result.inputs;
322 result.inputs = updatedInputs;
323
324 return result;
325 },
326
327 '_fixConfiguration': function (aConfiguration) {
328 var fixedConfiguration;
329 // var inputs;
330 // var bindings;
331 // var i,c;
332
333 fixedConfiguration = Clipperz.Base.deepClone(aConfiguration);
334
335//console.log("PROCESS CONFIGURATION", aConfiguration);
336 switch (aConfiguration['bookmarkletVersion']) {
337 case '0.1':
338 fixedConfiguration['formData'] = this.fixFormDataFromBookmarkletVersion_0_1(aConfiguration['formData']);
339 break;
340 case '0.2':
341 fixedConfiguration['formData'] = aConfiguration['formData'];
342 break;
343 }
344
345 / *
346 aConfiguration['_inputs'] = [];
347 c = formData['inputs'].length;
348 for (i=0; i<c; i++) {
349 aConfiguration['_inputs'].push(new Clipperz.PM.DataModel.DirectLoginInput(formData['inputs'][i]));
350 }
351* /
352/ *
353 aConfiguration['_bindings'] = {};
354 if (aConfiguration['legacyBindingData'] == null) {
355 if (aConfiguration['bindingData'] != null) {
356 var bindingKey;
357
358 for (bindingKey in aConfiguration['bindingData']) {
359 var newBinding;
360
361 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldKey:aConfiguration['bindingData'][bindingKey]});
362 aConfiguration['_bindings'][newBinding.key()] = newBinding;
363 }
364 } else {
365 var editableFields;
366
367 editableFields = MochiKit.Base.filter(function(aField) {
368 var result;
369 var type;
370
371 type = aField['type'].toLowerCase();
372 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
373
374 return result;
375 }, aConfiguration['_inputs']);
376
377 MochiKit.Iter.forEach(editableFields, MochiKit.Base.bind(function(anEditableField) {
378 var newBinding;
379
380 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(anEditableField['name']);
381 aConfiguration['_bindings'][newBinding.key()] = newBinding;
382 }, this));
383 }
384
385 } else {
386 var bindingKey;
387
388 for (bindingKey in aConfiguration['legacyBindingData']) {
389 var newBinding;
390
391 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldName:aConfiguration['legacyBindingData'][bindingKey]});
392 aConfiguration['_bindings'][newBinding.key()] = newBinding;
393 }
394 }
395* /
396
397 return fixedConfiguration;
398 },
399
400 //-------------------------------------------------------------------------
401
402 'getObjectDataStore': function () {
403 var deferredResult;
404
405 deferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore", {trace:false});
406 deferredResult.acquireLock(this.objectDataStoreDeferredLock());
407 deferredResult.addCallback(MochiKit.Base.bind(function () {
408 var innerDeferredResult;
409
410 if (this._objectDataStore == null) {
411 this._objectDataStore = new Clipperz.KeyValueObjectStore();
412
413 innerDeferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore <inner deferred>", {trace:false});
414 // innerDeferredResult.addMethod(this.record(), 'getValue', 'directLogins' + '.' + this.reference());
415 innerDeferredResult.addMethod(this, 'getValue', ''),
416 innerDeferredResult.addMethod(this, 'setOriginalState');
417 innerDeferredResult.addMethod(this, '_fixConfiguration');
418 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues');
419 // innerDeferredResult.addMethod(this._objectDataStore, 'setValues');
420 innerDeferredResult.callback();
421 } else {
422 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore);
423 }
424
425 return innerDeferredResult;
426 }, this));
427 deferredResult.releaseLock(this.objectDataStoreDeferredLock());
428 deferredResult.callback();
429
430 return deferredResult;
431 },
432
433 //-------------------------------------------------------------------------
434
435 'hasInitiatedObjectDataStore': function () {
436 return (this._objectDataStore != null);
437 },
438
439 //-------------------------------------------------------------------------
440
441 'resetObjectDataStore': function () {
442 this._objectDataStore.removeAllData();
443 this._objectDataStore = null;
444 },
445*/
446 //=========================================================================
447
448 'bookmarkletConfiguration': function () {
449 return Clipperz.Async.callbacks("DirectLogin.bookmarkletConfiguration", [
450 Clipperz.Async.collectResults("DirectLogin.bookmarkletConfiguration <inner results>", {
451 'label': MochiKit.Base.method(this, 'label'),
452 'configuration': MochiKit.Base.method(this, 'getValue', '')
453 }, {trace:false}),
454 function (someValues) {
455 var result;
456
457 if (someValues['configuration'] != null) {
458 varconfiguration;
459
460 configuration = {
461 'page': {
462 'title': someValues['label']
463 //'favicon'
464 // 'url'
465 },
466 'form': someValues['configuration']['formData'],
467 'version':someValues['configuration']['bookmarkletVersion']
468 }
469
470 result = Clipperz.Base.formatJSON(configuration);
471 } else {
472 result = '';
473 }
474
475 return result;
476 }
477 ], {trace:false});
478
479 },
480
481 //-------------------------------------------------------------------------
482
483 'setBookmarkletConfiguration': function (aValue) {
484 var bookmarkletConfiguration;
485
486 bookmarkletConfiguration = Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(aValue);
487//console.log("BOOKMARKLET CONFIGURATION", bookmarkletConfiguration);
488 return Clipperz.Async.callbacks("DirectLogin.setBookmarkletConfiguration", [
489 MochiKit.Base.method(this, 'setValue', 'formData', bookmarkletConfiguration['form']),
490//function (aValue) { console.log("SET VALUE - formData", aValue); return aValue; },
491 MochiKit.Base.method(this, 'setValue', 'bookmarkletVersion', bookmarkletConfiguration['version']),
492
493 MochiKit.Base.method(this, 'favicon'),
494 Clipperz.Async.deferredIf("the favicon is not set", [
495 ], [
496 MochiKit.Base.method(this, 'faviconUrlWithBookmarkletConfiguration', bookmarkletConfiguration),
497 MochiKit.Base.method(this, 'setFavicon')
498 ]),
499
500 MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration'),
501 MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'),
502 MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'),
503
504 MochiKit.Base.noop
505 ], {trace:false});
506 },
507
508 //=========================================================================
509
510 'formAttributes': function () {
511 return this.getValue('formData.attributes');
512 },
513
514 //=========================================================================
515
516 'inputs': function () {
517 return Clipperz.Async.callbacks("DirectLogin.inputs", [
518 Clipperz.Async.deferredIf("this._inputs is defined", [
519 ], [
520 MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration')
521 ])
522 ], {trace:false}, this._inputs);
523 },
524
525 'setInputWithFormDataConfiguration': function (aFormDataConfiguration) {
526 this._inputs = {};
527
528 if (aFormDataConfiguration != null) {
529 MochiKit.Iter.forEach(aFormDataConfiguration['inputs'], MochiKit.Base.bind(function (anInputData) {
530 var newInput;
531
532 newInput = new Clipperz.PM.DataModel.DirectLoginInput(anInputData);
533 this._inputs[newInput.name()] = newInput;
534 }, this));
535 }
536
537 return this._inputs;
538 },
539
540 'updateInputsAfterChangingBookmarkletConfiguration': function () {
541 return Clipperz.Async.callbacks("DirectLogin.updateInputsAfterChangingBookmarkletConfiguration", [
542 // MochiKit.Base.method(this, 'getValue', ''),
543//function (aValue) { console.log("VALUE", aValue); return aValue },
544 MochiKit.Base.method(this, 'getValue', 'formData'),
545//function (aValue) { console.log("FORM DATA", aValue); return aValue },
546 MochiKit.Base.method(this, 'setInputWithFormDataConfiguration')
547 ], {trace:false});
548 },
549
550 //=========================================================================
551
552 'inputValues': function () {
553 return Clipperz.Async.callbacks("DirectLogin.inputValues", [
554 MochiKit.Base.method(this, 'inputs'),
555 MochiKit.Base.values,
556 //function (aValue) { console.log("INPUTS", aValue); return aValue; },
557 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.partial(MochiKit.Base.method(this, 'inputValue'))),
558 Clipperz.Async.collectAll,
559 Clipperz.Base.mergeItems
560 ], {trace:false});
561 },
562
563 'inputValue': function (anInput) {
564 vardeferredResult;
565
566 deferredResult = new Clipperz.Async.Deferred("DirectLogin.inputValue", {trace:false});
567
568 if (anInput.needsFormValue()) {
569 deferredResult.addMethod(this, 'formValues');
570 deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name()));
571 deferredResult.addMethodcaller('value');
572 } else if (anInput.needsBinding()) {
573 deferredResult.addMethod(this, 'bindings');
574 deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name()));
575 deferredResult.addMethodcaller('field');
576 deferredResult.addMethodcaller('value');
577 } else {
578 deferredResult.addCallback(MochiKit.Async.succeed, anInput.value());
579 }
580 deferredResult.addCallback(function (anActualValue) {
581 return [anInput.name(), anActualValue];
582 });
583
584 deferredResult.callback();
585
586 return deferredResult;
587 },
588
589 //=========================================================================
590
591 'bindings': function () {
592 return Clipperz.Async.callbacks("DirectLogin.bindings", [
593 Clipperz.Async.deferredIf("this._bindings is defined", [
594 ], [
595 MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'),
596 MochiKit.Base.bind(function () { return this._bindings;}, this)
597 ])
598 ], {trace:false}, this._bindings);
599 },
600
601 'bindFormFieldWithLabelToRecordFieldWithLabel': function (aFormFieldLabel, aRecordFieldLabel) {
602 return Clipperz.Async.callbacks("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel", [
603 Clipperz.Async.collectResults("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel - collect results", {
604 'binding': [
605 MochiKit.Base.method(this, 'bindings'),
606 MochiKit.Base.itemgetter(aFormFieldLabel)
607 ],
608 'field': [
609 MochiKit.Base.method(this.record(), 'fieldWithLabel', aRecordFieldLabel)
610 ]
611 }),
612 function (someValues) {
613 someValues['binding'].setField(someValues['field'])
614 }
615 ], {trace:false});
616 },
617
618 //-------------------------------------------------------------------------
619/*
620 'bindingValues': function () {
621 return Clipperz.Async.callbacks("DirectLogin.bindingValues", [
622 Clipperz.Async.collectResults("DirectLogin.bindingValues [collectResults]", {
623 'fieldValues': [
624 MochiKit.Base.method(this, 'record'),
625 MochiKit.Base.methodcaller('getFieldsValues')
626 ],
627 'bindings': MochiKit.Base.method(this, 'bindings')
628 }, {trace:false}),
629 function (someData) {
630 var result;
631 varbindingKey;
632
633 result = {};
634 for (bindingKey in someData['bindings']) {
635 result[bindingKey] = someData['fieldValues'][someData['bindings'][bindingKey].fieldKey()]['value'];
636 }
637
638 return result;
639 }
640 ], {trace:false});
641 },
642*/
643 //-------------------------------------------------------------------------
644
645 'updateBindingsAfterChangingBookmarkletConfiguration': function () {
646 return Clipperz.Async.callbacks("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration", [
647 Clipperz.Async.collectResults("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration<collect results>", {
648 'currentValues':MochiKit.Base.method(this, 'getValue', ''),
649 'originalValues':MochiKit.Base.method(this, 'originalConfiguration'),
650 'inputs': MochiKit.Base.method(this, 'inputs')
651 }, {trace:false}),
652 MochiKit.Base.bind(function (someValues) {
653 var availableBindingValues;
654 var inputRequiringBindingValues;
655 var newBindingValues;
656
657 if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['bindingData'])) {
658 availableBindingValues = {};
659 } else {
660 availableBindingValues = Clipperz.Base.deepClone(someValues['originalValues']['bindingData'])
661 }
662
663 if (someValues['currentValues'] != null) {
664 MochiKit.Base.update(availableBindingValues, someValues['currentValues']['bindingData']);
665 }
666
667 this._bindings = {};
668 newBindingValues = {}
669 MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsBinding'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) {
670 varnewBinding;
671
672 newBindingValues[anInput.name()] = availableBindingValues[anInput.name()];
673 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
674 'key': anInput.name(),
675 'field':availableBindingValues[anInput.name()]
676 });
677
678 this._bindings[anInput.name()] = newBinding;
679 }, this))
680//console.log("THIS._BINDINGS", this._bindings);
681
682 return newBindingValues;
683
684/*
685 this._bindings = {};
686//console.log("CONFIGURATION", aConfiguration);
687
688 if (someValues['currentValues'] != null) {
689 if (someValues['currentValues']['bindingData'] != null) {
690 var bindingKey;
691
692//console.log("BINDING DATA", someValues['currentValues']['bindingData']);
693 for (bindingKey in someValues['currentValues']['bindingData']) {
694 var newBinding;
695
696 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
697 'key': bindingKey,
698 'field':someValues['currentValues']['bindingData'][bindingKey]
699 });
700 this._bindings[newBinding.key()] = newBinding;
701 }
702 } else if (someValues['currentValues']['legacyBindingData'] == null) {
703 var bindingKey;
704
705 for (bindingKey in someValues['currentValues']['legacyBindingData']) {
706 var newBinding;
707
708 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
709 'key': bindingKey,
710 'field':someValues['currentValues']['legacyBindingData'][bindingKey]
711 });
712 this._bindings[newBinding.key()] = newBinding;
713 }
714 } else {
715 WTF = TODO;
716 }
717 }
718
719 return this._bindings;
720*/
721 }, this),
722 MochiKit.Base.method(this, 'setValue', 'bindingData')
723 ], {trace:false});
724 },
725
726 //=========================================================================
727
728 'formValues': function () {
729 return Clipperz.Async.callbacks("DirectLogin.formValues", [
730 Clipperz.Async.deferredIf("this._formValues is defined", [
731 ], [
732 MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'),
733 MochiKit.Base.bind(function () { return this._formValues;}, this)
734 ])
735 ], {trace:false}, this._formValues);
736 },
737
738 //-------------------------------------------------------------------------
739
740 'updateFormValuesAfterChangingBookmarkletConfiguration': function () {
741 return Clipperz.Async.callbacks("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration", [
742 Clipperz.Async.collectResults("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration <collect results>", {
743 'currentValues':MochiKit.Base.method(this, 'getValue', ''),
744 'originalValues':MochiKit.Base.method(this, 'originalConfiguration'),
745 'inputs': MochiKit.Base.method(this, 'inputs')
746 }, {trace:false}),
747 MochiKit.Base.bind(function (someValues) {
748 var availableFormValues;
749 var inputRequiringFormValues;
750 var newFormValues;
751
752 if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['formValues'])) {
753 availableFormValues = {};
754 } else {
755 availableFormValues = Clipperz.Base.deepClone(someValues['originalValues']['formValues'])
756 }
757
758 MochiKit.Base.update(availableFormValues, someValues['currentValues']['formValues']);
759
760 this._formValues = {};
761 newFormValues = {};
762 MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsFormValue'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) {
763 varnewFormValue;
764 var fieldOptions;
765
766 fieldOptions = {
767 'type': anInput.type(),
768 'options':anInput.options()
769 };
770
771 newFormValues[anInput.name()] = availableFormValues[anInput.name()]
772 newFormValue = new Clipperz.PM.DataModel.DirectLoginFormValue(this, {
773 'key': anInput.name(),
774 'fieldOptions':fieldOptions,
775 'value': availableFormValues[anInput.name()]
776 });
777
778 this._formValues[anInput.name()] = newFormValue;
779 }, this))
780
781 return newFormValues;
782 }, this),
783 MochiKit.Base.method(this, 'setValue', 'formValues')
784 ], {trace:false});
785 },
786
787 //=========================================================================
788
789 'retrieveIndexDataFunction': function () {
790 return this._retrieveIndexDataFunction;
791 },
792
793 'getIndexDataForKey': function (aKey) {
794 return Clipperz.Async.callbacks("DirectLogin.getIndexDataForKey", [
795 MochiKit.Base.partial(this.retrieveIndexDataFunction(), this.reference()),
796 Clipperz.Async.deferredIf("DirectLogin.getIndexDataForKey - index data not null", [
797 MochiKit.Base.itemgetter(aKey)
798 ],[
799 MochiKit.Async.succeed
800 ])
801 ], {trace:false});
802 },
803
804 //-------------------------------------------------------------------------
805
806 'setIndexDataForKey': function (aKey, aValue) {
807 return Clipperz.Async.callbacks("DirectLogin.setValueForKey", [
808 MochiKit.Base.method(this, 'getIndexDataForKey', aKey),
809 MochiKit.Base.bind(function (anActualValue) {
810 var transientStateKey;
811
812 transientStateKey = 'original_' + aKey;
813 if (MochiKit.Base.isUndefinedOrNull(this.transientState()[transientStateKey])) {
814 if (anActualValue != aValue) {
815 this.transientState()[transientStateKey] = anActualValue;
816 }
817 } else if (this.transientState()[transientStateKey] == aValue) {
818 this.transientState()[transientStateKey] = null;
819 }
820 }, this),
821 MochiKit.Base.partial(this._setIndexDataFunction, this.reference(), aKey, aValue)
822 ], {trace:false})
823 },
824
825 //-------------------------------------------------------------------------
826/*
827 'setValueForKey': function (aKey, aValue) {
828 return Clipperz.Async.callbacks("DirectLogin.setValueForKey", [
829 MochiKit.Base.method(this, 'getIndexDataForKey', aKey),
830 MochiKit.Base.bind(function (anActualValue) {
831 var transientStateKey;
832
833 transientStateKey = 'original_' + aKey;
834 if (MochiKit.Base.isUndefinedOrNull(this.transientState()[transientStateKey])) {
835 if (anActualValue != aValue) {
836 this.transientState()[transientStateKey] = anActualValue;
837 }
838 } else if (this.transientState()[transientStateKey] == aValue) {
839 this.transientState()[transientStateKey] = null;
840 }
841 }, this),
842 MochiKit.Base.method(this, 'setIndexDataForKey', aKey, aValue)
843 ], {trace:false})
844 },
845*/
846 //=========================================================================
847/*
848 'storedConfiguration': function () {
849 return this.record().getValue('directLogins' + '.' + this.reference());
850 },
851
852 //'setStoredConfiguration': function (aValue) {
853 // return this.record().setValue('directLogins' + '.' + this.reference(), aValue);
854 //},
855*/
856 //=========================================================================
857
858 'hasPendingChanges': function () {
859 varresult;
860 var deferredResult;
861
862 result = false;
863 result = result || this.isBrandNew();
864 result = result || (! MochiKit.Base.isUndefinedOrNull(this.transientState()['original_label']));
865 result = result || (! MochiKit.Base.isUndefinedOrNull(this.transientState()['original_favicon']));
866
867 if ((result == false) && (this.originalConfiguration() != null)) {
868 deferredResult = Clipperz.Async.callbacks("DirectLogin.hasPendingChanges", [
869 MochiKit.Base.method(this, 'serializedData'),
870 MochiKit.Base.bind(function (aCurrentConfiguration) {
871 varoriginalConfiguration;
872 var currentConfiguration;
873 var result;
874
875 originalConfiguration = this.originalConfiguration();
876 currentConfiguration = aCurrentConfiguration;
877
878 result = false;
879 result = result || (MochiKit.Base.compare(originalConfiguration['bookmarkletVersion'], currentConfiguration['bookmarkletVersion'])!= 0);
880 result = result || (MochiKit.Base.compare(originalConfiguration['formData'], currentConfiguration['formData']) != 0);
881 result = result || (MochiKit.Base.compare(originalConfiguration['formValues'], currentConfiguration['formValues']) != 0);
882 result = result || (MochiKit.Base.compare(originalConfiguration['bindingData'], currentConfiguration['bindingData']) != 0);
883
884 return result;
885 }, this)
886 ], {trace:false});
887 } else {
888 deferredResult = MochiKit.Async.succeed(result);
889 }
890
891 return deferredResult;
892 },
893
894 //-------------------------------------------------------------------------
895
896 'revertChanges': function () {
897 var deferredResult;
898
899 if (this.transientState()['original_label'] != null) {
900 this.setLabel(this.transientState()['original_label']);
901 }
902
903 if (this.transientState()['original_favicon'] != null) {
904 this.setFavicon(this.transientState()['original_favicon']);
905 }
906
907 if (this.originalConfiguration() != null) {
908 deferredResult = this.setValue('', this.originalConfiguration());
909 } else {
910 deferredResult = MochiKit.Async.succeed();
911 }
912
913 this._inputs = null;
914 this._bindings = null;
915 this._formValues= null;
916
917 this.resetTransientState(false);
918
919/*
920 if (this.hasInitiatedObjectDataStore()) {
921 deferredResult = Clipperz.Async.callbacks("DirectLogin.revertChanges", [
922 // MochiKit.Base.method(this.record(), 'setValue', 'directLogins' + '.' + this.reference(), this.originalState()),
923 MochiKit.Base.method(this, 'setValue', '', this.originalState()),
924 MochiKit.Base.method(this, 'resetObjectDataStore')
925 ], {trace:false})
926 } else {
927 deferredResult = MochiKit.Async.succeed();
928 }
929*/
930 return deferredResult;
931 },
932
933
934 //=========================================================================
935
936 'transientState': function () {
937 if (this._transientState == null) {
938 this._transientState = {}
939 }
940
941 return this._transientState;
942 },
943
944 'resetTransientState': function (isCommitting) {
945 this._transientState = null;
946 },
947
948 'commitTransientState': function (isCommitting) {
949 this._transientState = null;
950 this._isBrandNew = false;
951 },
952
953 //-------------------------------------------------------------------------
954
955 'originalConfiguration': function () {
956 return this.transientState()['original_configuration'];
957 },
958
959 'setOriginalConfiguration': function (aConfiguration) {
960 this.transientState()['original_configuration'] = Clipperz.Base.deepClone(aConfiguration);
961 },
962
963 //=========================================================================
964
965 'actualKey': function (aValueKey) {
966 var actualKey;
967
968 actualKey = 'directLogins' + '.' + this.reference();
969 if (aValueKey != '') {
970 actualKey = actualKey + '.' + aValueKey;
971 }
972
973 return actualKey;
974 },
975
976 //-------------------------------------------------------------------------
977
978 'getValue': function (aValueKey) {
979 return this.record().getValue(this.actualKey(aValueKey));
980 },
981
982 'setValue': function (aValueKey, aValue) {
983 // return this.record().setValue(this.actualKey(aValueKey), aValue);
984
985 return Clipperz.Async.callbacks("DirectLogin.setValue", [
986 MochiKit.Base.method(this, 'getValue', ''),
987 MochiKit.Base.bind(function (aValue) {
988 if (this.originalConfiguration() == null) {
989 this.setOriginalConfiguration(aValue);
990 }
991 }, this),
992 // MochiKit.Base.method(this, 'originalConfiguration'),
993 // Clipperz.Async.deferredIf("originalConfiguration has been set", [
994 // ], [
995 // MochiKit.Base.method(this, 'getValue', ''),
996 // MochiKit.Base.method(this, 'setOriginalConfiguration')
997 // ]),
998 MochiKit.Base.method(this.record(), 'setValue', this.actualKey(aValueKey), aValue)
999 ], {trace:false});
1000 },
1001
1002 'removeValue': function (aValueKey) {
1003 // return this.record().removeValue(this.actualKey(aValueKey));
1004
1005 return Clipperz.Async.callbacks("DirectLogin.setValue", [
1006 MochiKit.Base.method(this, 'originalConfiguration'),
1007 Clipperz.Async.deferredIf("originalConfiguration has been set", [
1008 ], [
1009 MochiKit.Base.method(this, 'getValue', ''),
1010 MochiKit.Base.method(this, 'setOriginalConfiguration')
1011 ]),
1012 MochiKit.Base.method(this.record(), 'removeValue', this.actualKey(aValueKey))
1013 ], {trace:false});
1014 },
1015
1016 //=========================================================================
1017
1018 'deleteAllCleanTextData': function () {
1019 this._inputs = null;
1020 this._bindings = null;
1021 this._formValues = null;
1022
1023 this.resetTransientState();
1024 },
1025
1026 //-------------------------------------------------------------------------
1027
1028 'hasAnyCleanTextData': function () {
1029 var result;
1030
1031 result = false;
1032
1033 result = result || (this._inputs != null);
1034 result = result || (this._bindings != null);
1035 result = result || (this._formValues != null);
1036 result = result || (MochiKit.Base.keys(this.transientState()).length != 0);
1037
1038 return MochiKit.Async.succeed(result);
1039 },
1040
1041 //=========================================================================
1042 __syntaxFix__: "syntax fix"
1043});
1044
1045//#############################################################################
1046
1047Clipperz.PM.DataModel.DirectLogin.exception = {
1048 'WrongBookmarkletConfiguration': new MochiKit.Base.NamedError("Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration")
1049};
1050
1051Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration = function(aConfiguration) {
1052 var configuration;
1053
1054 try {
1055 configuration = Clipperz.Base.evalJSON(aConfiguration);
1056 // configuration = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(configuration);
1057
1058 if (MochiKit.Base.isUndefinedOrNull(configuration['page']['title'])
1059 ||MochiKit.Base.isUndefinedOrNull(configuration['form']['attributes']['action'])
1060 // ||MochiKit.Base.isUndefinedOrNull(configuration['form']['attributes']['method'])
1061 ||MochiKit.Base.isUndefinedOrNull(configuration['form']['inputs'])
1062 ||MochiKit.Base.isUndefinedOrNull(configuration['version'])
1063 ) {
1064 throw Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration;
1065 }
1066
1067 // if (MochiKit.Base.isUndefinedOrNull(configuration['favicon'])) {
1068 // throw Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration;
1069 // }
1070
1071 } catch (exception) {
1072 throw exception;
1073 }
1074
1075 return configuration;
1076};
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
new file mode 100644
index 0000000..fd55c63
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
@@ -0,0 +1,125 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32
33
34//#############################################################################
35
36Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, args) {
37 args = args || {};
38
39 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
40
41 this._key = args.key|| Clipperz.Base.exception.raise('MandatoryParameter');
42 this._fieldKey = args.field || /* this.directLogin().fieldWithName(args.fieldName).reference() || */null;
43
44 return this;
45}
46
47Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, {
48
49 'toString': function() {
50 return "DirectLoginBinding (" + this.key() + ", " + this.fieldKey() + ")";
51 },
52
53 //-------------------------------------------------------------------------
54
55 'directLogin': function () {
56 return this._directLogin;
57 },
58
59 //-------------------------------------------------------------------------
60
61 'key': function() {
62 return this._key;
63 },
64
65 //-------------------------------------------------------------------------
66
67 'fieldKey': function() {
68 return this._fieldKey;
69 },
70
71 'setFieldKey': function(aValue) {
72 this._fieldKey = aValue;
73
74 return this.directLogin().setValue('bindingData' + '.' + this.key(), aValue);
75 },
76
77 //'fieldName': function() {
78 // return this._fieldName;
79 //},
80
81 //-------------------------------------------------------------------------
82
83 'field': function() {
84 var deferredResult;
85
86 if (this.fieldKey() != null) {
87 deferredResult = Clipperz.Async.callbacks("DirectLoginBinding.field [1]", [
88 MochiKit.Base.method(this.directLogin().record(), 'fields'),
89 MochiKit.Base.itemgetter(this.fieldKey())
90 ], {trace:false});
91 // } else if (this.fieldName() != null) {
92 // WTF = TODO;
93 // result = this.directLogin().record().fieldWithName(this.fieldName());
94 //
95 // this.setFieldKey(result.key());
96 } else {
97 deferredResult = MochiKit.Async.succeed(null);
98 }
99
100 return deferredResult;
101 },
102
103 'setField': function (aField) {
104 this.setFieldKey(aField.reference());
105 },
106
107 //-------------------------------------------------------------------------
108/*
109 'fieldValue': function () {
110 return Clipperz.Async.callbacks("DirectLoginBinding.fieldValue", [
111 MochiKit.Base.method('field'),
112 MochiKit.Base.methodcaller('value')
113 ], {trace:false});
114 },
115*/
116 //-------------------------------------------------------------------------
117
118 'serializedData': function() {
119 return this.fieldKey();
120 },
121
122 //-------------------------------------------------------------------------
123 __syntaxFix__: "syntax fix"
124});
125
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
new file mode 100644
index 0000000..939ab4b
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
@@ -0,0 +1,107 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32
33
34//#############################################################################
35
36Clipperz.PM.DataModel.DirectLoginFormValue = function(aDirectLogin, args) {
37 args = args || {};
38
39 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
40
41 this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter');
42 this._fieldOptions = args.fieldOptions|| Clipperz.Base.exception.raise('MandatoryParameter');
43 this._value = args.value || null;
44
45 return this;
46}
47
48Clipperz.PM.DataModel.DirectLoginFormValue.prototype = MochiKit.Base.update(null, {
49
50 'toString': function() {
51 return "DirectLoginFormValue (" + this.key() + ", " + this.value() + ")";
52 },
53
54 //-------------------------------------------------------------------------
55
56 'directLogin': function () {
57 return this._directLogin;
58 },
59
60 //-------------------------------------------------------------------------
61
62 'key': function() {
63 return this._key;
64 },
65
66 //-------------------------------------------------------------------------
67
68 'fieldOptions': function() {
69 return this._fieldOptions;
70 },
71
72 //-------------------------------------------------------------------------
73
74 'type': function () {
75 return this.fieldOptions()['type'];
76 },
77
78 //-------------------------------------------------------------------------
79
80 'value': function() {
81 varresult;
82
83 result = this._value;
84
85 // if ((result == null) && (this.type() == 'checkbox')) {
86 // result = false;
87 // };
88
89 return result;
90 },
91
92 'setValue': function (aValue) {
93//console.log("DirectLoginFormValue.setValue", aValue);
94 this._value = aValue;
95 return this.directLogin().setValue('formValues' + '.' + this.key(), aValue);
96 },
97
98 //-------------------------------------------------------------------------
99/*
100 'serializedData': function() {
101 return this.value();
102 },
103*/
104 //-------------------------------------------------------------------------
105 __syntaxFix__: "syntax fix"
106});
107
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
new file mode 100644
index 0000000..673d5ee
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
@@ -0,0 +1,203 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32
33//#############################################################################
34
35Clipperz.PM.DataModel.DirectLoginInput = function(args) {
36 this._args = args;
37
38 return this;
39}
40
41Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, {
42
43 'args': function() {
44 return this._args;
45 },
46
47 //-------------------------------------------------------------------------
48
49 'name': function() {
50 return this.args()['name'];
51 },
52
53 //-------------------------------------------------------------------------
54
55 'type': function() {
56 var result;
57
58 result = this.args()['type'];
59
60 if (result != null) {
61 result = result.toLowerCase();
62 }
63 return result;
64 },
65
66 //-------------------------------------------------------------------------
67
68 'options': function() {
69 return this.args()['options'];
70 },
71
72 //-------------------------------------------------------------------------
73
74 'value': function() {
75 return this.args()['value'];
76 },
77
78 //-------------------------------------------------------------------------
79 /*
80 'formConfiguration': function(someFormValues, someBindings, someFields) {
81 var result;
82//console.log("### DirectLoginInput.formConfiguration", someFields);
83 if (this.shouldSetValue()) {
84 switch (this.type()) {
85 case 'select':
86 var currentValue;
87 var options;
88
89 // currentValue = this.directLogin()._configuration['formValues'][this.name()];
90 currentValue = someFormValues[this.name()];
91 options = this.args()['options'];
92
93 result = MochiKit.DOM.SELECT({name:this.name()},
94 MochiKit.Base.map(function(anOption) {
95 var options;
96
97 options = {value:anOption['value']};
98 if (currentValue == anOption['value']) {
99 options.selected = true;
100 }
101
102 return MochiKit.DOM.OPTION(options, anOption['label'])
103 }, options)
104 )
105 break;
106 case 'checkbox':
107 var options;
108
109 options = {type:'checkbox', name: this.name()};
110 // if (this.directLogin()._configuration['formValues'][this.name()] == true) {
111 if (someFormValues[this.name()] == true) {
112 options['checked'] = true;
113 };
114
115 result = MochiKit.DOM.INPUT(options, null);
116 break;
117 case 'radio':
118 var currentName;
119 var currentValue;
120 var options;
121
122 currentName = this.name();
123 // currentValue = this.directLogin()._configuration['formValues'][this.name()];
124 currentValue = someFormValues[this.name()];
125 options = this.args()['options'];
126
127 result = MochiKit.DOM.DIV(null,
128 MochiKit.Base.map(function(anOption) {
129 var options;
130 var isChecked;
131 var inputNode;
132 var divNode;
133
134 options = {type:'radio', name:currentName, value:anOption['value']}
135 isChecked = (currentValue == anOption['value']);
136 if (isChecked) {
137 options.checked = true;
138 }
139
140 if (Clipperz_IEisBroken == true) {
141 var checkedValue;
142
143 checkedValue = (isChecked ? " CHECKED" : "");
144 inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">");
145 } else {
146 inputNode = MochiKit.DOM.INPUT(options, anOption['value']);
147 }
148 divNode = MochiKit.DOM.DIV(null, inputNode);
149
150 return divNode;
151 }, options)
152 );
153 break;
154 }
155 } else {
156 var binding;
157 // binding = this.directLogin().bindings()[this.name()];
158 binding = someBindings[this.name()];
159
160//console.log("### binding", binding);
161//if (binding != null) {
162 ///console.log(" binding.field()", binding.field());
163 ///console.log(" binding.field().value()", binding.field().value());
164 //console.log(" someFields[binding.fieldKey()].value()", someFields[binding.fieldKey()].value());
165//}
166 result = MochiKit.DOM.INPUT({
167 type:((this.type() != 'password') ? this.type() : 'text'),
168 name:this.name(),
169 // value:((binding != null)? binding.field().value() : this.value())
170 value:((binding != null)? someFields[binding.fieldKey()]['value'] : this.value())
171 // value:((binding != null)? someFields[binding.fieldKey()].value() : this.value())
172 }, null);
173 }
174
175 return result;
176 },
177 */
178 //-------------------------------------------------------------------------
179
180 'needsFormValue': function() {
181 var type;
182 var result;
183
184 type = this.type();
185 result = ((type == 'checkbox') || (type == 'radio') || (type == 'select'));
186
187 return result;
188 },
189
190 'needsBinding': function() {
191 var type;
192 var result;
193
194 type = this.type();
195 result = ((type == 'text') || (type == 'password'));
196
197 return result;
198 },
199
200 //-------------------------------------------------------------------------
201 __syntaxFix__: "syntax fix"
202});
203
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js b/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
new file mode 100644
index 0000000..3408b08
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
@@ -0,0 +1,551 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!";
31}
32
33if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
34if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
35
36Clipperz.PM.DataModel.EncryptedRemoteObject = function(args) {
37 args = args || {};
38
39 this._name = args.name || null;
40 this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
41 this._isBrandNew = ((args.reference == null) && (args.remoteData == null));
42
43 if ((this._isBrandNew == false) && (args['retrieveKeyFunction'] == null)) {
44 Clipperz.Base.exception.raise('MandatoryParameter');
45 } else {
46 this._retrieveKeyFunction = args['retrieveKeyFunction'];
47 }
48
49 this._retrieveRemoteDataFunction = args.retrieveRemoteDataFunction|| null;
50 this._remoteData = args.remoteData || null;
51 // this._remoteData = args.remoteData ? Clipperz.Base.deepClone(args.remoteData) : null;
52 if ((!this._isBrandNew) && ((this._retrieveRemoteDataFunction == null) && (this._remoteData == null))) {
53 Clipperz.Base.exception.raise('MandatoryParameter');
54 }
55
56
57 this._encryptedDataKeypath = args.encryptedDataKeypath || 'data'; //Clipperz.Base.exception.raise('MandatoryParameter');
58 this._encryptedVersionKeypath = args.encryptedVersionKeypath || 'version';//Clipperz.Base.exception.raise('MandatoryParameter');
59
60
61 this._transientState = null;
62 this._deferredLocks = {};
63
64 if (this._isBrandNew == true) {
65 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [1]'}*/);
66 } else {
67 this._objectDataStore = null;
68 }
69
70 return this;
71}
72
73//
74 // Basic data workflow
75 //=======================
76//
77 //getRemoteData
78 // unpackRemoteData
79 // getDecryptData [encryptedDataKeypath, encryptedVersionKeypath]
80 // unpackData
81 //
82 //
83 // ?? packData
84 // ?? encryptDataWithKey
85 // ??packRemoteData [encryptedDataKeypath (?), encryptedVersionKeypath (?)]
86//
87
88Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(null, {
89
90 'toString': function () {
91 return "Clipperz.PM.DataModel.EncryptedRemoteObject" + (this.name() != null ? " - " + this.name() : "");
92 },
93
94 //-------------------------------------------------------------------------
95
96 'name': function () {
97 return this._name;
98 },
99
100 //-------------------------------------------------------------------------
101
102 'reference': function () {
103 return this._reference;
104 },
105
106 'setReference': function (aValue) {
107 this._reference = aValue;
108
109 return this._reference;
110 },
111
112 //-------------------------------------------------------------------------
113
114 'transientState': function () {
115 if (this._transientState == null) {
116 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.transientState [2]'}*/);
117 }
118
119 return this._transientState;
120 },
121
122 'resetTransientState': function (isCommitting) {
123 if (this._transientState != null) {
124 this._transientState.removeAllData();
125 }
126
127 this._transientState = null;
128 },
129
130 //-------------------------------------------------------------------------
131
132 'isBrandNew': function () {
133 return this._isBrandNew;
134 },
135
136 //-------------------------------------------------------------------------
137
138 'getKey': function () {
139 var deferredResult;
140 var deferredLock;
141
142 deferredLock = this.getDeferredLockForKey('key');
143
144 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getKey", {trace:false});
145 deferredResult.acquireLock(deferredLock);
146 deferredResult.addMethod(
147 this.decryptedDataStore(),
148 'deferredGetOrSet',
149 'decryptionKey',
150 MochiKit.Base.partial(this.retrieveKeyFunction(), this.reference())
151 );
152 deferredResult.releaseLock(deferredLock);
153 deferredResult.callback();
154
155 return deferredResult;
156 },
157
158 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
159
160 'retrieveKeyFunction': function () {
161 return this._retrieveKeyFunction;
162 },
163
164 'setRetrieveKeyFunction': function (aFunction) {
165 this._retrieveKeyFunction = aFunction;
166 },
167
168 //-------------------------------------------------------------------------
169
170 'hasLoadedRemoteData': function () {
171 return (this._remoteData != null);
172 },
173
174 'getRemoteData': function () {
175 var deferredResult;
176 vardeferredLock;
177
178 deferredLock = this.getDeferredLockForKey('remoteData');
179
180 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObjects.getRemoteData", {trace:false});
181 deferredResult.acquireLock(deferredLock);
182 deferredResult.addCallback(MochiKit.Base.bind(function () {
183 var innerDeferredResult;
184
185 if (this._remoteData != null) {
186 innerDeferredResult = MochiKit.Async.succeed(this._remoteData);
187 } else {
188 innerDeferredResult = Clipperz.Async.callbacks("EncryptedRemoteObjects.getRemoteData <inner deferred>", [
189 MochiKit.Base.partial(this.retrieveRemoteDataFunction(), this.reference()),
190 MochiKit.Base.method(this, 'unpackRemoteData'),
191 MochiKit.Base.bind(function (someData) {
192 this._remoteData = someData;
193 return this._remoteData;
194 }, this)
195 ], {trace:false});
196 }
197
198 return innerDeferredResult;
199 }, this))
200 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
201 deferredResult.releaseLock(deferredLock);
202
203 deferredResult.callback();
204
205 return deferredResult;
206 },
207
208 //-------------------------------------------------------------------------
209
210 'unpackRemoteData': function (someData) {
211 return MochiKit.Async.succeed(someData);
212 },
213
214 //.........................................................................
215
216 'packRemoteData': function (someData) {
217 var result;
218
219 result = {
220 'reference':this.reference(),
221 'data': someData,
222 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
223 };
224
225 return MochiKit.Async.succeed(result);
226 },
227
228 //-------------------------------------------------------------------------
229
230 'retrieveRemoteDataFunction': function () {
231 return this._retrieveRemoteDataFunction;
232 },
233
234 'setRetrieveRemoteDataFunction': function (aFunction) {
235 this._retrieveRemoteDataFunction = aFunction;
236 },
237
238 //-------------------------------------------------------------------------
239
240 'decryptedDataStore': function () {
241 if (this._decryptedDataStore == null) {
242 this._decryptedDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.decryptedDataStore [3]'}*/);
243 };
244
245 return this._decryptedDataStore;
246 },
247
248 //.........................................................................
249
250 'getDecryptedData': function () {
251 var deferredResult;
252 var deferredLock;
253
254 deferredLock = this.getDeferredLockForKey('decryptedData');
255
256 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData", {trace:false});
257 deferredResult.acquireLock(deferredLock);
258 deferredResult.addMethod(this, 'decryptedDataStore');
259 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredGetOrSet', 'decryptedData', MochiKit.Base.bind(function () {
260 varinnerDeferredResult;
261
262 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData <inner deferred>", {trace:false});
263
264 innerDeferredResult.addMethod(this, 'getRemoteData');
265 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
266 innerDeferredResult.collectResults({
267 'key': MochiKit.Base.method(this, 'getKey'),
268 'value':MochiKit.Base.itemgetter(this._encryptedDataKeypath),
269 'version':MochiKit.Base.itemgetter(this._encryptedVersionKeypath)
270 });
271
272 innerDeferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt);
273 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
274 innerDeferredResult.addMethod(this, 'unpackData');
275 innerDeferredResult.callback();
276
277 return innerDeferredResult;
278 }, this)));
279 deferredResult.releaseLock(deferredLock);
280 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
281 deferredResult.callback();
282
283 return deferredResult;
284 },
285
286 //-------------------------------------------------------------------------
287
288 'setValue': function(aKey, aValue) {
289 var deferredResult;
290
291 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.setValue", {trace:false});
292 deferredResult.addMethod(this, '_getObjectDataStore');
293 deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', aKey, aValue));
294 deferredResult.callback();
295
296 return deferredResult;
297 },
298
299 //.........................................................................
300
301 'getValue': function (aKey) {
302 return Clipperz.Async.callbacks("EncryptedRemoteObject.getValue", [
303 MochiKit.Base.method(this, '_getObjectDataStore'),
304 MochiKit.Base.methodcaller('getValue', aKey)
305 ], {trace:false});
306 },
307
308 //.........................................................................
309
310 'removeValue': function (aKey) {
311 return Clipperz.Async.callbacks("EncryptedRemoteObject.removeValue", [
312 MochiKit.Base.method(this, '_getObjectDataStore'),
313 MochiKit.Base.methodcaller('removeValue', aKey)
314 ], {trace:false});
315 },
316
317 //.........................................................................
318
319 'values': function () {
320 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
321 MochiKit.Base.method(this, '_getObjectDataStore'),
322 MochiKit.Base.methodcaller('values')
323 ], {trace:false});
324 },
325
326 'setValues': function (someValues) {
327 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
328 MochiKit.Base.method(this, '_getObjectDataStore'),
329 MochiKit.Base.methodcaller('setValues', someValues)
330 ], {trace:false});
331 },
332
333 //.........................................................................
334
335 '_getObjectDataStore': function () {
336 var deferredResult;
337 var deferredLock;
338
339 deferredLock = this.getDeferredLockForKey('objectDataStore');
340
341 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore", {trace:false});
342 deferredResult.acquireLock(deferredLock);
343 deferredResult.addCallback(MochiKit.Base.bind(function () {
344 var innerDeferredResult;
345
346 if (this._objectDataStore == null) {
347 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [4]'}*/);
348
349 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore <inner deferred>", {trace:false});
350 innerDeferredResult.addMethod(this, 'getDecryptedData');
351 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues');
352 innerDeferredResult.callback();
353 } else {
354 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore);
355 }
356
357 return innerDeferredResult;
358 }, this));
359 deferredResult.releaseLock(deferredLock);
360 deferredResult.callback();
361
362 return deferredResult;
363 },
364
365 'hasInitiatedObjectDataStore': function () {
366 return (this._objectDataStore != null);
367 },
368
369 //-------------------------------------------------------------------------
370
371 'getDeferredLockForKey': function (aKey) {
372 var result;
373
374 result = this._deferredLocks[aKey];
375
376 if (typeof(result) == 'undefined') {
377 result = new MochiKit.Async.DeferredLock();
378 this._deferredLocks[aKey] = result;
379 }
380
381 return result;
382 },
383
384 //-------------------------------------------------------------------------
385
386 'unpackData': function (someData) { //++
387 return someData;
388 },
389
390 'packData': function (someData) { //++
391 return someData;
392 },
393
394 //-------------------------------------------------------------------------
395
396 'hasPendingChanges': function () {
397 var deferredResult;
398 var tempObj = this;
399
400 if (this.isBrandNew()) {
401 // deferredResult = MochiKit.Async.succeed(true);
402 deferredResult = this.hasPendingChangesWhenBrandNew();
403 } else if (this.hasInitiatedObjectDataStore()) {
404 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.hasPendingChanges", {trace:false});
405 deferredResult.collectResults({
406 'decryptedData': [
407 MochiKit.Base.method(this, 'getDecryptedData'),
408 Clipperz.Base.serializeJSON
409 ],
410 'objectData': [
411 MochiKit.Base.method(this, '_getObjectDataStore'),
412 MochiKit.Base.methodcaller('values'),
413 Clipperz.Base.serializeJSON
414 ]
415 });
416 deferredResult.addCallback(function (someValues) {
417//if (someValues['decryptedData'] != someValues['objectData']) {
418 //console.log("ORIGINAL DATA", '[[[' + someValues['decryptedData'] + ']]]');
419 //console.log("CURRENT DATA", '>>>' + someValues['objectData'] + '<<<');
420//}
421 return (someValues['decryptedData'] != someValues['objectData']);
422 });
423 deferredResult.callback();
424 } else {
425 deferredResult = MochiKit.Async.succeed(false);
426 }
427
428 return deferredResult;
429 },
430
431 'hasPendingChangesWhenBrandNew': function () {
432 return MochiKit.Async.succeed(true);
433 },
434
435 //-------------------------------------------------------------------------
436
437 'commitTransientState': function () {
438 var deferredResult;
439
440 // if (this.transientState().getValue('__prepareRemoteData') == true) {
441 if (this.transientState().getValue('packedRemoteData') != null) {
442 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - prepareRemoteData", [
443 MochiKit.Base.bind(function (someData) {
444 this._remoteData = this.transientState().getValue('packedRemoteData');
445 }, this),
446
447 MochiKit.Base.method(this, '_getObjectDataStore'),
448 MochiKit.Base.methodcaller('values'),
449 Clipperz.Base.deepClone,
450 MochiKit.Base.method(this.decryptedDataStore(), 'setValue', 'decryptedData'),
451
452 MochiKit.Base.method(this, 'resetTransientState', true)
453 ], {trace:false});
454
455 } else {
456 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - NO prepareRemoteData", [
457 MochiKit.Base.method(this, 'resetTransientState', true)
458 ], {trace:false});
459 }
460
461 this._isBrandNew = false;
462
463 return deferredResult;
464 },
465
466 //-------------------------------------------------------------------------
467
468 'revertChanges': function () {
469 if (this.hasInitiatedObjectDataStore()) {
470 this._objectDataStore.removeAllData();
471 this._objectDataStore = null;
472 }
473 this.resetTransientState(false);
474
475 return MochiKit.Async.succeed();
476 },
477
478 //-------------------------------------------------------------------------
479
480 'deleteAllCleanTextData': function () {
481 var deferredResult;
482
483 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.deleteAllCleanTextData", {trace:false});
484
485 deferredResult.addMethod(this, 'resetTransientState', false);
486
487 deferredResult.acquireLock(this.getDeferredLockForKey('decryptedData'));
488 deferredResult.addCallback(MochiKit.Base.bind(function () {
489 if (this._decryptedDataStore != null) {
490 this._decryptedDataStore.removeAllData();
491 }
492 }, this));
493 deferredResult.releaseLock(this.getDeferredLockForKey('decryptedData'));
494
495 deferredResult.acquireLock(this.getDeferredLockForKey('objectDataStore'));
496 deferredResult.addCallback(MochiKit.Base.bind(function () {
497 if (this._objectDataStore != null) {
498 this._objectDataStore.removeAllData();
499 this._objectDataStore = null;
500 }
501 }, this));
502 deferredResult.releaseLock(this.getDeferredLockForKey('objectDataStore'));
503
504 deferredResult.callback();
505
506 return deferredResult;
507 },
508
509 //.........................................................................
510
511 'hasAnyCleanTextData': function () {
512 var result;
513
514 result = false;
515
516 result = result || (! this.decryptedDataStore().isEmpty());
517 result = result || (! this.transientState().isEmpty());
518 if (this.hasInitiatedObjectDataStore()) {
519 result = result || (! this._objectDataStore.isEmpty());
520 }
521
522 return MochiKit.Async.succeed(result);
523 },
524
525 //-------------------------------------------------------------------------
526
527 'prepareRemoteDataWithKey': function (aKey) {
528 return Clipperz.Async.callbacks("EncryptedRemoteObject.prepareRemoteDataWithKey", [
529 // MochiKit.Base.method(this.transientState(), 'setValue', '__prepareRemoteData', true),
530 MochiKit.Base.method(this, '_getObjectDataStore'),
531 MochiKit.Base.methodcaller('values'),
532 MochiKit.Base.method(this, 'packData'),
533 function (someData) {
534 return Clipperz.PM.Crypto.deferredEncrypt({
535 'key': aKey,
536 'value':someData,
537 'version':Clipperz.PM.Crypto.encryptingFunctions.currentVersion
538 })
539 },
540 MochiKit.Base.method(this, 'packRemoteData'),
541 MochiKit.Base.method(this.transientState(), 'setValue', 'packedRemoteData'),
542 function (someData) {
543 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'advanceProgress');
544 return someData;
545 }
546 ], {trace:false});
547 },
548
549 //-------------------------------------------------------------------------
550 __syntaxFix__: "syntax fix"
551});
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js b/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
new file mode 100644
index 0000000..9f1c197
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
@@ -0,0 +1,357 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32
33
34//#############################################################################
35
36Clipperz.PM.DataModel.OneTimePassword = function(args) {
37 args = args || {};
38
39 //this._user = args['user'];
40 this._reference = args['reference']|| Clipperz.PM.Crypto.randomKey();
41 this._password = args['password'];
42 this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']);
43 this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date();
44 this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null;
45
46 this._status = args['status'] || 'ACTIVE'; //'REQUESTED', 'USED', 'DISABLED'
47 this._connectionInfo= null;
48
49 this._key = null;
50 this._keyChecksum= null;
51
52 return this;
53}
54
55Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, {
56
57 'toString': function() {
58 return "Clipperz.PM.DataModel.OneTimePassword";
59 },
60/*
61 //-------------------------------------------------------------------------
62
63 'user': function() {
64 return this._user;
65 },
66
67 //-------------------------------------------------------------------------
68
69 'password': function() {
70 return this._password;
71 },
72
73 //-------------------------------------------------------------------------
74
75 'passwordValue': function() {
76 return this._passwordValue;
77 },
78
79 //-------------------------------------------------------------------------
80
81 'creationDate': function() {
82 return this._creationDate;
83 },
84
85 //-------------------------------------------------------------------------
86
87 'reference': function() {
88 return this._reference;
89 },
90
91 //-------------------------------------------------------------------------
92
93 'key': function() {
94 if (this._key == null) {
95 this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue());
96 }
97
98 return this._key;
99 },
100
101 //-------------------------------------------------------------------------
102
103 'keyChecksum': function() {
104 if (this._keyChecksum == null) {
105 this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue());
106 }
107
108 return this._keyChecksum;
109 },
110*/
111 //-------------------------------------------------------------------------
112
113 'status': function() {
114 return this._status;
115 },
116
117 'setStatus': function(aValue) {
118 this._status = aValue;
119 },
120
121 //-------------------------------------------------------------------------
122/*
123 'serializedData': function() {
124 var result;
125
126 result = {
127 'password': this.password(),
128 'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null,
129 'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null,
130 'status': this.status()
131 };
132
133 return result;
134 },
135
136 //-------------------------------------------------------------------------
137
138 'packedPassphrase': function() {
139 var result;
140 var packedPassphrase;
141 var encodedPassphrase;
142 varprefixPadding;
143 var suffixPadding;
144 var getRandomBytes;
145
146 getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes');
147
148 encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String();
149//MochiKit.Logging.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length);
150 prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String();
151//MochiKit.Logging.logDebug("--- prefixPadding.length: " + prefixPadding.length);
152 suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String();
153//MochiKit.Logging.logDebug("--- suffixPadding.length: " + suffixPadding.length);
154//MochiKit.Logging.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length));
155
156 packedPassphrase = {
157 'prefix': prefixPadding,
158 'passphrase': encodedPassphrase,
159 'suffix': suffixPadding
160 };
161
162 // result = Clipperz.Base.serializeJSON(packedPassphrase);
163 result = packedPassphrase;
164//MochiKit.Logging.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result);
165//MochiKit.Logging.logDebug("<<< OneTimePassword.packedPassphrase");
166
167 return result;
168 },
169
170 //-------------------------------------------------------------------------
171
172 'encryptedPackedPassphrase': function() {
173 return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase())
174 },
175
176 //-------------------------------------------------------------------------
177
178 'encryptedData': function() {
179 var deferredResult;
180 varresult;
181
182//MochiKit.Logging.logDebug(">>> OneTimePassword.encryptedData");
183//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference());
184 result = {
185 'reference': this.reference(),
186 'key': this.key(),
187 'keyChecksum': this.keyChecksum(),
188 'data': "",
189 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
190 }
191//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result));
192 deferredResult = new MochiKit.Async.Deferred();
193//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 3");
194//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;});
195 //# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase());
196 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase'));
197//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 4");
198//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;});
199 deferredResult.addCallback(function(aResult, res) {
200 aResult['data'] = res;
201 return aResult;
202 }, result);
203//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 5");
204//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
205 deferredResult.callback();
206//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 6");
207
208 return deferredResult;
209 },
210
211 //-------------------------------------------------------------------------
212
213 'saveChanges': function() {
214 var deferredResult;
215 varresult;
216
217//MochiKit.Logging.logDebug(">>> OneTimePassword.saveChanges");
218 result = {};
219 deferredResult = new MochiKit.Async.Deferred();
220
221 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData');
222 deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
223 deferredResult.addCallback(function(aResult, res) {
224 aResult['user'] = res;
225 return aResult;
226 }, result);
227
228 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData');
229 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
230 deferredResult.addCallback(function(aResult, res) {
231 aResult['oneTimePassword'] = res;
232 return aResult;
233 }, result);
234
235 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData');
236//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;});
237 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword');
238
239 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface');
240//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
241 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated');
242 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null);
243//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
244 deferredResult.callback();
245//MochiKit.Logging.logDebug("<<< OneTimePassword.saveChanges");
246
247 return deferredResult;
248 },
249
250 //-------------------------------------------------------------------------
251
252 'usageDate': function() {
253 return this._usageDate;
254 },
255
256 'setUsageDate': function(aValue) {
257 this._usageDate = aValue;
258 },
259
260 //-------------------------------------------------------------------------
261
262 'connectionInfo': function() {
263 return this._connectionInfo;
264 },
265
266 'setConnectionInfo': function(aValue) {
267 this._connectionInfo = aValue;
268 },
269
270 //-------------------------------------------------------------------------
271
272 'isExpired': function() {
273 return (this.usageDate() != null);
274 },
275
276 //-------------------------------------------------------------------------
277
278 'updateStatusWithValues': function(someValues) {
279 var result;
280
281 result = false;
282
283 if (someValues['status'] != this.status()) {
284 result = true;
285 }
286
287 this.setStatus(someValues['status']);
288 this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate']));
289 this.setConnectionInfo(someValues['connection']);
290
291 return result;
292 },
293 */
294 //-------------------------------------------------------------------------
295 __syntaxFix__: "syntax fix"
296});
297
298//#############################################################################
299
300Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) {
301 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2);
302}
303
304Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) {
305 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2);
306}
307
308//=============================================================================
309
310Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue = function(aPassword) {
311 var result;
312
313 //"yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"
314//console.log("Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue", aPassword);
315 if (aPassword.replace(/[\s\-]/g, '').length == 32) {
316 try {
317 var passwordByteArray;
318
319 passwordByteArray = new Clipperz.ByteArray();
320 passwordByteArray.appendBase32String(aPassword);
321
322 result = true;
323 } catch(exception) {
324 result = false;
325 }
326 } else {
327 result = false;
328 }
329
330 return result;
331}
332
333//=============================================================================
334
335Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) {
336 varresult;
337
338 if (aPassword.replace(/[\s\-]/g, '').length == 32) {
339 try {
340 var passwordByteArray;
341
342 passwordByteArray = new Clipperz.ByteArray();
343 passwordByteArray.appendBase32String(aPassword);
344
345 result = passwordByteArray.toBase64String();
346 } catch(exception) {
347 result = aPassword;
348 }
349 } else {
350 result = aPassword;
351 }
352
353//console.log("Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword", aPassword, result);
354 return result;
355}
356
357//#############################################################################
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
new file mode 100644
index 0000000..147aa7d
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
@@ -0,0 +1,167 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.PM.DataModel.Record.Version) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.Record.Version.Field depends on Clipperz.PM.DataModel.Record.Version!";
31}
32
33Clipperz.PM.DataModel.Record.Version.Field = function(args) {
34 Clipperz.PM.DataModel.Record.Version.Field.superclass.constructor.apply(this, arguments);
35
36 this._recordVersion = args.recordVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
38
39 return this;
40}
41
42
43Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version.Field, Object, {
44
45 'toString': function() {
46 return "Record.Version.Field (" + this.reference() + ")";
47 },
48
49 //-------------------------------------------------------------------------
50
51 'recordVersion': function () {
52 return this._recordVersion;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'reference': function () {
58 return this._reference;
59 },
60
61 //-------------------------------------------------------------------------
62
63 'getItem': function (aKey) {
64 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
65 MochiKit.Base.method(this, 'recordVersion'),
66 MochiKit.Base.methodcaller('getValue', 'fields' + '.' + this.reference() + '.' + aKey)
67 ], {trace:false});
68 },
69
70 'setItem': function (aKey, aValue) {
71 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
72 MochiKit.Base.method(this, 'recordVersion'),
73 MochiKit.Base.methodcaller('setValue', 'fields' + '.' + this.reference() + '.' + aKey, aValue)
74 ], {trace:false});
75 },
76
77 //-------------------------------------------------------------------------
78
79 'label': function () {
80 return this.getItem('label');
81 },
82
83 'setLabel': function (aValue) {
84 return this.setItem('label', aValue);
85 },
86
87 //-------------------------------------------------------------------------
88
89 'value': function () {
90 return this.getItem('value');
91 },
92
93 'setValue': function (aValue) {
94 return this.setItem('value', aValue);
95 },
96
97 //-------------------------------------------------------------------------
98
99 'actionType': function () {
100 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.actionType", [
101 Clipperz.Async.collectResults("Clipperz.PM.DataModel.Record.Version.Field.actionType [collect results]", {
102 'isHidden':MochiKit.Base.method(this, 'isHidden'),
103 'value':MochiKit.Base.method(this, 'value')
104 }, {trace:false}),
105 function (someValues) {
106 var result; //'NONE', 'URL', 'EMAIL', 'PASSWORD'
107
108 result = 'NONE';
109
110 if (someValues['isHidden']) {
111 result = 'PASSWORD';
112 } else if (Clipperz.Base.isUrl(someValues['value'])) {
113 result = 'URL'
114 } else if (Clipperz.Base.isEmail(someValues['value'])) {
115 result = 'EMAIL'
116 };
117
118 return result;
119 }
120 ], {trace:false});
121 },
122
123 //-------------------------------------------------------------------------
124
125 'isHidden': function () {
126 return this.getItem('hidden');
127 },
128
129 'setIsHidden': function (aValue) {
130 return this.setItem('hidden', aValue);
131 },
132
133 //-------------------------------------------------------------------------
134
135 'isEmpty': function () {
136 var deferredResult;
137
138 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.Field.isEmpty", {trace:false});
139
140 deferredResult.collectResults({
141 'label': [
142 MochiKit.Base.method(this, 'label'),
143 MochiKit.Base.partial(MochiKit.Base.operator.eq, '')
144 ],
145 'value': [
146 MochiKit.Base.method(this, 'value'),
147 MochiKit.Base.partial(MochiKit.Base.operator.eq, '')
148 ],
149 'isHidden': [
150 MochiKit.Base.method(this, 'isHidden'),
151 MochiKit.Base.partial(MochiKit.Base.operator.eq, false)
152 ]
153 });
154 deferredResult.addCallback(MochiKit.Base.values);
155 deferredResult.addCallback(function(someValues) {
156 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
157 });
158 deferredResult.callback();
159
160 return deferredResult;
161 },
162
163 //-------------------------------------------------------------------------
164 __syntaxFix__: "syntax fix"
165});
166
167
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
new file mode 100644
index 0000000..6e50f8e
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
@@ -0,0 +1,336 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!";
31}
32
33Clipperz.PM.DataModel.Record.Version = function(args) {
34//console.log(">>> Record.new");
35 Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments);
36
37 this._getVersionFunction = args.getVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
38 this._fields = null;
39
40 return this;
41}
42
43
44Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, {
45
46 'toString': function() {
47 return "Record.Version (" + this.reference() + ")";
48 },
49
50 //-------------------------------------------------------------------------
51
52 'reference': function () {
53 return this._reference;
54 },
55
56 //-------------------------------------------------------------------------
57/*
58 'hasPendingChanges': function () {
59 var deferredResult;
60
61 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false});
62 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this));
63 deferredResult.callback();
64
65 return deferredResult;
66 },
67*/
68 //-------------------------------------------------------------------------
69
70
71 'hasPendingChangesWhenBrandNew': function () {
72 var deferredResult;
73
74 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false});
75 deferredResult.addMethod(this, 'fields');
76 deferredResult.addCallback(MochiKit.Base.values);
77 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty'))
78 deferredResult.addCallback(Clipperz.Async.collectAll);
79 deferredResult.addCallback(function(someValues) {
80 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
81 });
82 deferredResult.addCallback(MochiKit.Base.operator.lognot)
83 deferredResult.callback();
84
85 return deferredResult;
86 },
87
88 //=========================================================================
89
90 'commitTransientState': function () {
91 var deferredResult;
92
93 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false});
94 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this));
95 deferredResult.callback();
96
97 return deferredResult;
98 },
99
100 //=========================================================================
101
102 'unpackData': function (someData) { //++
103 varresult;
104
105//console.log("Record.Version - UNPACK DATA", this, someData);
106 result = someData;
107 if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) {
108 varfields;
109 var i,c;
110
111 fields = someData['fields'];
112 delete someData['fields'];
113
114 someData['fields'] = {};
115 c = fields.length;
116 for (i=0; i<c; i++) {
117 someData['fields'][i] = fields[i];
118 }
119 }
120
121
122
123 return result;
124 },
125
126 //=========================================================================
127
128 'fields': function () {
129 vardeferredResult;
130 var deferredLock;
131
132 deferredLock = this.getDeferredLockForKey('fields');
133
134 deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false});
135 deferredResult.acquireLock(deferredLock);
136 deferredResult.addCallback(MochiKit.Base.bind(function () {
137 var innerDeferredResult;
138
139 if (this._fields == null) {
140 innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false});
141 innerDeferredResult.addMethod(this, 'getValue', 'fields');
142 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
143 var reference;
144
145 this._fields = {};
146
147 for (reference in someObjectData) {
148 varrecordVersionField;
149
150 recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({
151 'recordVersion':this,
152 'reference': reference
153 });
154
155 this._fields[reference] = recordVersionField;
156 }
157
158 return this._fields;
159 }, this));
160 innerDeferredResult.callback();
161 } else {
162 innerDeferredResult = MochiKit.Async.succeed(this._fields);
163 }
164
165 return innerDeferredResult;
166 }, this));
167 deferredResult.releaseLock(deferredLock);
168 deferredResult.callback();
169
170 return deferredResult;
171 },
172
173 //-------------------------------------------------------------------------
174
175 'getFieldsValues': function () {
176 return this.getValue('fields');
177 },
178
179 //-------------------------------------------------------------------------
180
181 'addField': function (someParameters) {
182 varnewField;
183
184 newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this});
185
186 return Clipperz.Async.callbacks("Record.Version.addField", [
187 MochiKit.Base.method(this, 'fields'),
188
189 MochiKit.Base.method(this, '_getObjectDataStore'),
190 MochiKit.Base.methodcaller('values'),
191 Clipperz.Base.serializeJSON,
192
193 MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this),
194 MochiKit.Base.method(newField, 'setLabel', someParameters['label']),
195 MochiKit.Base.method(newField, 'setValue', someParameters['value']),
196 MochiKit.Base.method(newField, 'setIsHidden',someParameters['isHidden']),
197
198 MochiKit.Base.method(this, '_getObjectDataStore'),
199 MochiKit.Base.methodcaller('values'),
200 Clipperz.Base.serializeJSON,
201
202 MochiKit.Base.partial(MochiKit.Async.succeed, newField)
203 ], {trace:false});
204 },
205
206 //-------------------------------------------------------------------------
207
208 'removeField': function (aField) {
209 return Clipperz.Async.callbacks("Record.Version.removeField", [
210 MochiKit.Base.method(this, 'fields'),
211 MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this),
212 MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference())
213 ], {trace:false});
214 },
215
216 //-------------------------------------------------------------------------
217/*
218 'sortFieldReference': function (someSortedFieldReferences) {
219
220
221
222 },
223*/
224 //=========================================================================
225/*
226 'directLogins': function () {
227 return MochiKit.Base.values(this._directLogins);
228 },
229
230 'addDirectLogin': function (aDirectLogin) {
231 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
232 },
233*/
234
235 //=========================================================================
236/*
237 'updateValues': function (anotherVersion) {
238 return Clipperz.Async.callbacks("Record.Version.updateValue", [
239 MochiKit.Base.partial(MochiKit.Async.succeed, this)
240 ], {trace:false});
241 },
242*/
243 //=========================================================================
244
245 'setRemoteData': function (aValue) {
246 this._remoteData = aValue;
247
248 return aValue;
249 },
250
251 //=========================================================================
252
253 'getVersionFunction': function () {
254 return this._getVersionFunction;
255 },
256
257 'previousVersion': function () {
258 return Clipperz.Async.callbacks("Record.Versions.previousVersion", [
259 MochiKit.Base.method(this, 'previousVersionReference'),
260 this.getVersionFunction()
261 ], {trace:false});
262 },
263
264 'previousVersionReference': function () {
265 return this.getValue('previousVersionReference');
266 },
267
268 'previousVersionKey': function () {
269 //TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!!
270 return this.getValue('previousVersionKey');
271 },
272
273 //-------------------------------------------------------------------------
274
275 'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) {
276 // this._previousVersion = anotherVersion;
277 return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [
278 MochiKit.Base.method(this, 'setValue', 'previousVersionReference',aVersionObjectAndKey['reference']),
279 MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key'])
280 ], {trace:false});
281 },
282
283 //=========================================================================
284
285 'revertChanges': function () {
286 this.setReference(this.transientState()['originalReference']);
287 Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments);
288 },
289
290 //-------------------------------------------------------------------------
291
292 'prepareRemoteDataWithKey': function (aKey) {
293 var deferredResult;
294 var result;
295
296 result = {};
297
298//console.log("prepareRemoteDataWithKey", aKey);
299 deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false});
300 if (this.isBrandNew() == false) {
301 this.transientState()['originalReference'] = this.reference();
302
303 deferredResult.collectResults({
304 'key':MochiKit.Base.partial(MochiKit.Async.succeed, aKey),
305 'value': MochiKit.Base.method(this, 'getKey'),
306 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion)
307 });
308 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt);
309 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey');
310 } else {
311 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue);
312 }
313 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey));
314 deferredResult.addCallback(MochiKit.Base.update, result);
315 deferredResult.addMethod(this, 'setRemoteData');
316
317 deferredResult.callback();
318
319 return deferredResult;
320 },
321
322 //=========================================================================
323/*
324 'deleteAllCleanTextData': function () {
325 return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments);
326 },
327
328 'hasAnyCleanTextData': function () {
329 return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments);
330 },
331*/
332 //=========================================================================
333 __syntaxFix__: "syntax fix"
334});
335
336
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/Record.js b/frontend/gamma/js/Clipperz/PM/DataModel/Record.js
new file mode 100644
index 0000000..85dd06b
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.js
@@ -0,0 +1,881 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32
33
34Clipperz.PM.DataModel.Record = function(args) {
35//console.log(">>> new Clipperz.PM.DataModel.Record", args);
36 Clipperz.PM.DataModel.Record.superclass.constructor.apply(this, arguments);
37
38 this._updateDate = (args.updateDate ? Clipperz.PM.Date.parse(args.updateDate) : Clipperz.Base.exception.raise('MandatoryParameter'));
39
40 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
41 this._updateIndexDataFunction = args.updateIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter');
42
43 this._retrieveDirectLoginIndexDataFunction = args.retrieveDirectLoginIndexDataFunction|| null;
44 this._setDirectLoginIndexDataFunction = args.setDirectLoginIndexDataFunction || null;
45 this._removeDirectLoginIndexDataFunction = args.removeDirectLoginIndexDataFunction|| null;
46
47 this._createNewDirectLoginFunction = args.createNewDirectLoginFunction || null;
48
49 this._directLogins = {};
50
51 this._versions = {};
52
53 this._currentRecordVersion = null;
54 if (this.isBrandNew()) {
55 var newVersion;
56
57 this.setNotes('');
58 newVersion = new Clipperz.PM.DataModel.Record.Version({
59 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
60 'getVersion': MochiKit.Base.method(this, 'getVersion')
61
62 });
63 this._versions[newVersion.reference()] = newVersion;
64 this._currentVersionReference = newVersion.reference();
65 // this.setLabel('');
66 }
67
68//console.log("<<< new Clipperz.PM.DataModel.Record", args);
69
70 return this;
71}
72
73
74Clipperz.Base.extend(Clipperz.PM.DataModel.Record, Clipperz.PM.DataModel.EncryptedRemoteObject, {
75
76 'toString': function() {
77 return "Record (" + this.reference() + ")";
78 },
79
80 //-------------------------------------------------------------------------
81
82 'reference': function () {
83 return this._reference;
84 },
85
86 //=========================================================================
87
88 'getIndexData': function () {
89 return this._retrieveIndexDataFunction(this.reference());
90 },
91
92 //.........................................................................
93
94 'getIndexDataForKey': function (aKey) {
95 return Clipperz.Async.callbacks("Record.getIndexDataForKey", [
96 MochiKit.Base.method(this, 'getIndexData'),
97 MochiKit.Base.itemgetter(aKey)
98 ], {trace:false});
99 },
100
101 //-------------------------------------------------------------------------
102
103 'setIndexDataForKey': function (aKey, aValue) {
104 // return this._updateIndexDataFunction(this.reference(), aKey, aValue);
105
106 var deferredResult;
107
108 deferredResult = new Clipperz.Async.Deferred("Record.setIndexDataForKey", {trace:false});
109 deferredResult.addMethod(this, 'getIndexDataForKey', aKey);
110 deferredResult.addCallback(MochiKit.Base.bind(function (aCurrentValue) {
111 var result;
112 var originalValue;
113
114 originalValue = this.transientState().getValue('originalValues.indexData.' + aKey);
115 if (originalValue == null) {
116 originalValue = this.transientState().setValue('originalValues.indexData.' + aKey, aCurrentValue);
117 }
118
119 if (aCurrentValue != aValue) {
120 if (originalValue != aValue) {
121 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, true);
122 } else {
123 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, false);
124 }
125
126 result = this._updateIndexDataFunction(this.reference(), aKey, aValue);
127 } else {
128 result = MochiKit.Async.succeed(aValue);
129 }
130
131 return result;
132 }, this));
133
134 deferredResult.callback();
135
136 return deferredResult;
137 },
138
139 //=========================================================================
140/*
141 'key': function () {
142 return this.getIndexDataForKey('key');
143 },
144*/
145 //=========================================================================
146
147 'label': function () {
148 return this.getIndexDataForKey('label');
149 },
150
151 //.........................................................................
152
153 'setLabel': function (aValue) {
154 return this.setIndexDataForKey('label', aValue);
155 },
156
157 //=========================================================================
158
159 'headerNotes': function () {
160 return this.getIndexDataForKey('notes');
161 },
162
163 //-------------------------------------------------------------------------
164
165 'notes': function () {
166 return Clipperz.Async.callbacks("Record.notes", [
167 MochiKit.Base.method(this, 'headerNotes'),
168 MochiKit.Base.bind(function (someHeaderNotes) {
169 var result;
170
171 if ((someHeaderNotes == null) || (typeof(someHeaderNotes) == 'undefined')) {
172 result = this.getValue('notes');
173 } else {
174 result = MochiKit.Async.succeed(someHeaderNotes);
175 }
176
177 return result;
178 }, this)
179 ], {trace:false});
180 },
181
182 //.........................................................................
183
184 'setNotes': function (aValue) {
185 return this.setValue('notes', aValue);
186 },
187
188 //=========================================================================
189
190 'updateDate': function () {
191 return MochiKit.Async.succeed(this._updateDate);
192 },
193
194 //=========================================================================
195
196 'favicon': function () {
197 var result;
198 var directLogins;
199
200 directLogins = MochiKit.Base.values(this.directLogins());
201 if (directLogins.length > 0) {
202 result = directLogins[0].favicon();
203 // } else if (/* is there an URL to use for searching a favicon */){
204 } else {
205 result = null; //MochiKit.Async.succeed(Clipperz.PM.Strings['defaultFaviconUrl']);
206 }
207
208 return result;
209 },
210
211 //-------------------------------------------------------------------------
212
213 'searchableContent': function () {
214 var deferredResult;
215
216//console.log(">>> searchableContent");
217 deferredResult = new Clipperz.Async.Deferred("Record.searchableContent", {trace:false});
218
219 deferredResult.collectResults({
220 'recordLabel': MochiKit.Base.method(this, 'label'),
221 'directLoginLabels': [
222 MochiKit.Base.method(this, 'directLoginReferences'),
223 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.itemgetter('label'))
224 ]
225 })
226 deferredResult.addCallback(function (someValues) {
227 return someValues['recordLabel'] + ' ' + someValues['directLoginLabels'].join(' ');
228 });
229 deferredResult.callback();
230//console.log("<<< searchableContent");
231
232 return deferredResult;
233 },
234
235 //-------------------------------------------------------------------------
236
237 'isMatching': function (aRegExp) {
238 return Clipperz.Async.callbacks("deferredFilterFunction", [
239 MochiKit.Base.method(this, 'searchableContent'),
240 MochiKit.Base.method(aRegExp, 'test'),
241 function (doesItMatch) {
242 var result;
243
244 if (doesItMatch) {
245 result = MochiKit.Async.succeed('match');
246 } else {
247 result = MochiKit.Async.fail('miss');
248 }
249
250 return result;
251 }
252 ], {trace:false});
253 },
254
255 //=========================================================================
256
257 'directLogins': function () {
258 return this._directLogins;
259 },
260
261 'addDirectLogin': function (aDirectLogin) {
262 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
263 },
264
265 'directLoginWithReference': function (aDirectLoginReference) {
266 return this._directLogins[aDirectLoginReference];
267 },
268
269 'createNewDirectLoginFunction': function () {
270 return this._createNewDirectLoginFunction;
271 },
272
273 'saveOriginalDirectLoginStatusToTransientState': function () {
274 if (this.transientState().getValue('directLogins') == null) {
275 // this.transientState().setValue('directLogins', this._directLogins)
276//console.log("SET TRANSIENT STATE", Clipperz.Base.serializeJSON(MochiKit.Base.keys(this.transientState().getValue('directLogins'))))
277 MochiKit.Iter.forEach(MochiKit.Base.keys(this._directLogins), MochiKit.Base.bind(function(aKey) {
278 this.transientState().setValue('directLogins' + '.' + aKey, this._directLogins[aKey])
279 }, this))
280 }
281 },
282
283 'createNewDirectLogin': function () {
284 this.saveOriginalDirectLoginStatusToTransientState();
285
286 return this.createNewDirectLoginFunction()(this);
287 },
288
289 'removeDirectLogin': function(aDirectLogin) {
290 this.saveOriginalDirectLoginStatusToTransientState();
291
292 return Clipperz.Async.callbacks("Record.removeDirectLogin", [
293 MochiKit.Base.method(this, 'removeValue', 'directLogins' + '.' + aDirectLogin.reference()),
294 MochiKit.Base.bind(function () {
295 delete this._directLogins[aDirectLogin.reference()]
296 }, this)
297 ], {trace:false});
298
299 },
300
301 'directLoginReferences': function () {
302 var result;
303
304 result = Clipperz.Async.callbacks("Record.directLoginReferences", [
305 MochiKit.Base.method(this, 'directLogins'),
306 MochiKit.Base.values,
307 function (someDirectLogins) {
308 var result;
309 var i,c;
310
311 result = [];
312 c = someDirectLogins.length;
313 for (i=0; i<c; i++) {
314 result.push(Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", {
315 '_rowObject': MochiKit.Async.succeed,
316 '_reference': MochiKit.Base.methodcaller('reference'),
317 'label': MochiKit.Base.methodcaller('label'),
318 'favicon': MochiKit.Base.methodcaller('favicon')
319 }, {trace:false})(someDirectLogins[i]));
320 };
321
322 return result;
323 },
324 Clipperz.Async.collectAll
325 ], {trace:false});
326
327 return result;
328 },
329
330 //=========================================================================
331
332 'unpackRemoteData': function (someData) {
333 var result;
334
335//console.log("new Clipperz.PM.DataModel.Record.Version [2]");
336/*
337 this._currentRecordVersion = new Clipperz.PM.DataModel.Record.Version({
338 'reference': someData['currentVersion']['reference'],
339 'retrieveKeyFunction': MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
340 'remoteData': someData['currentVersion'],
341 });
342*/
343 var versionKey;
344
345 for (versionKey in someData['versions']) {
346//console.log("### versionKey", versionKey);
347 this._versions[versionKey] = new Clipperz.PM.DataModel.Record.Version({
348 'reference': versionKey,
349 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
350 'remoteData': someData['versions'][versionKey],
351 'getVersion': MochiKit.Base.method(this, 'getVersion')
352 })
353 }
354
355 // this._currentVersionReference = someData['currentVersion']['reference'];
356 this._currentVersionReference = someData['currentVersion'];
357//console.log("=== currentVersionReference", this._currentVersionReference, someData);
358
359 result = Clipperz.PM.DataModel.Record.superclass.unpackRemoteData.apply(this, arguments);
360
361 return result;
362 },
363
364 //-------------------------------------------------------------------------
365
366 'unpackData': function (someData) {
367 var result;
368
369 result = Clipperz.PM.DataModel.Record.superclass.unpackData.apply(this, arguments);
370
371 if (MochiKit.Base.isUndefinedOrNull(result['notes'])) {
372 result['notes'] = ''
373 }
374
375 return result;
376 },
377
378 //-------------------------------------------------------------------------
379
380 'prepareRemoteDataWithKey': function (aKey) {
381 var deferredResult;
382 varnewVersionKey;
383 var result;
384
385 newVersionKey = Clipperz.PM.Crypto.randomKey();
386 result = {};
387
388 deferredResult = new Clipperz.Async.Deferred("Record.prepareRemoteDataWithKey", {trace:false});
389 deferredResult.addCallbackList([
390 Clipperz.Async.collectResults("Record.prepareRemoteDataWithKey - collect results", {
391 'isBrandNew': MochiKit.Base.method(this, 'isBrandNew'),
392 'versionHasPendingChanges':[
393 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
394 // MochiKit.Base.methodcaller('hasPendingChanges')
395 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
396 ]
397 }),
398 Clipperz.Async.or,
399
400 Clipperz.Async.deferredIf("Current Version has pending changes", [
401 MochiKit.Base.method(this, 'createNewRecordVersion'),
402 MochiKit.Base.methodcaller('prepareRemoteDataWithKey', newVersionKey),
403 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'currentRecordVersion'),
404 MochiKit.Base.method(this, 'setCurrentRecordVersionKey', newVersionKey)
405 ], []),
406
407 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey),
408 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'record'),
409
410 MochiKit.Base.partial(MochiKit.Async.succeed, result)
411 ]);
412
413 deferredResult.callback();
414
415 return deferredResult;
416 },
417
418 //=========================================================================
419
420 'fields': function () {
421 return this.invokeCurrentRecordVersionMethod('fields');
422 },
423
424 'addField': function (someParameters) {
425 return this.invokeCurrentRecordVersionMethod('addField', someParameters);
426 },
427
428 'removeField': function (someParameters) {
429 return this.invokeCurrentRecordVersionMethod('removeField', someParameters);
430 },
431
432 //'sortFieldReference': function (someSortedFieldReferences) {
433 // return this.invokeCurrentRecordVersionMethod('sortFieldReference', someSortedFieldReferences);
434 //},
435
436 'getFieldsValues': function () {
437 return this.invokeCurrentRecordVersionMethod('getFieldsValues');
438 },
439
440 'fieldWithLabel': function (aLabel) {
441 return Clipperz.Async.callbacks("Record.fieldWithLabel", [
442 MochiKit.Base.method(this, 'fields'),
443 MochiKit.Base.values,
444 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aField) {
445 return Clipperz.Async.callbacks("Record.fieldWithLabel - check field label", [
446 MochiKit.Base.methodcaller('label'),
447 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
448 ], {trace:false}, aField);
449 }),
450 function (someFilteredResults) {
451 var result;
452
453 switch (someFilteredResults.length) {
454 case 0:
455 result = null;
456 break;
457 case 1:
458 result = someFilteredResults[0];
459 break;
460 default:
461 WTF = TODO;
462 break;
463 }
464
465 return result;
466 }
467 ], {trace:false});
468 },
469
470 //=========================================================================
471
472 'getVersion': function (aVersionReference) {
473 return Clipperz.Async.callbacks("Record.getVersion", [
474 MochiKit.Base.method(this, 'getVersions'),
475 MochiKit.Base.itemgetter(aVersionReference)
476 ], {trace:false});
477 },
478
479 //-------------------------------------------------------------------------
480
481 'getVersionKey': function (aVersionReference) {
482 vardeferredResult;
483 var transientStateKey;
484
485 transientStateKey = 'versionKeys' + '.' + aVersionReference;
486 if (this.transientState().getValue(transientStateKey) != null) {
487 deferredResult = MochiKit.Async.succeed(this.transientState().getValue(transientStateKey));
488 } else {
489 deferredResult = Clipperz.Async.callbacks("Record.getVersionKey", [
490 MochiKit.Base.method(this, 'getVersions'),
491 MochiKit.Base.partial(MochiKit.Base.operator.eq, aVersionReference, this.currentVersionReference()),
492 Clipperz.Async.deferredIf("getVersionKey for current version", [
493 MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
494 MochiKit.Base.method(this.transientState(), 'setValue', transientStateKey)
495 ],[
496 MochiKit.Async.fail
497 ])
498 ], {trace:false});
499 }
500
501 return deferredResult;
502 },
503
504 //-------------------------------------------------------------------------
505
506 'versions': function () {
507 return this._versions;
508 },
509
510 'getVersions': function () {
511 return Clipperz.Async.callbacks("Record.versions", [
512 MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'),
513 MochiKit.Base.bind(function () { return this._versions; }, this)
514 ], {trace:false});
515 },
516
517 //-------------------------------------------------------------------------
518
519 'getCurrentRecordVersion': function () {
520 return Clipperz.Async.callbacks("Record.getCurrentRecordVersion", [
521 // MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'),
522 // MochiKit.Base.bind(function () { return this._currentRecordVersion; }, this)
523
524 MochiKit.Base.method(this, 'versions'),
525 MochiKit.Base.itemgetter(this.currentVersionReference()),
526 Clipperz.Async.deferredIf("The current version is available", [
527 MochiKit.Async.succeed
528 ], [
529 MochiKit.Base.method(this, 'getVersions'),
530 MochiKit.Base.bind(function (someVersions) { return someVersions[this.currentVersionReference()]}, this)
531 ])
532 ], {trace:false});
533 },
534
535 'setCurrentRecordVersion': function (aRecordVersion) {
536 this._currentVersionReference = aRecordVersion.reference();
537 },
538
539 //.........................................................................
540
541 'currentVersionReference': function () {
542//console.log("currentVersionReference");
543 return this._currentVersionReference;
544 },
545
546 //-------------------------------------------------------------------------
547
548 'createNewRecordVersion': function () {
549 var deferredResult;
550
551 if (this.isBrandNew()) {
552 deferredResult = this.getCurrentRecordVersion();
553 } else {
554 var newVersion;
555
556 newVersion = new Clipperz.PM.DataModel.Record.Version({
557 // 'reference': versionKey,
558 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
559 // 'remoteData': {},
560 'getVersion': MochiKit.Base.method(this, 'getVersion')
561 })
562 this._versions[newVersion.reference()] = newVersion;
563
564 deferredResult = Clipperz.Async.callbacks("Record.createNewRecordVersion", [
565 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
566 // MochiKit.Base.methodcaller('values'),
567 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'values'),
568 MochiKit.Base.method(newVersion, 'setValues'),
569
570 Clipperz.Async.collectResults("Record.createNewRecordVersion [collect results]", {
571 'reference':MochiKit.Base.method(this, 'currentVersionReference'),
572 'key': MochiKit.Base.method(this, 'getCurrentRecordVersionKey')
573 }, {trace:false}),
574 MochiKit.Base.method(newVersion, 'setPreviousVersionReferenceAndKey'),
575
576 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
577 // MochiKit.Base.method(this, 'revertChanges'),
578 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'revertChanges'),
579
580 MochiKit.Base.method(this, 'setCurrentRecordVersion', newVersion),
581 MochiKit.Base.partial(MochiKit.Async.succeed, newVersion)
582 ], {trace:false});
583 }
584
585 return deferredResult;
586 },
587
588 //-------------------------------------------------------------------------
589
590 'getCurrentRecordVersionKey': function () {
591//console.log("getCurrentRecordVersionKey");
592 return Clipperz.Async.callbacks("Record.getCurrentRecordVersionKey", [
593 MochiKit.Base.method(this, 'getValue', 'currentVersionKey'),
594 Clipperz.Async.deferredIf("currentVersionKey is NOT null", [
595 MochiKit.Async.succeed
596 ], [
597 MochiKit.Base.method(this, 'getKey')
598 ])
599 ], {trace:false});
600 },
601
602 'setCurrentRecordVersionKey': function (aValue) {
603 //TODO: triple check this method!
604 return Clipperz.Async.callbacks("Record.setCurrentRecordVersionKey", [
605 MochiKit.Base.method(this, 'setValue', 'currentVersionKey', aValue)
606 ], {trace:false});
607 },
608
609 //-------------------------------------------------------------------------
610
611 'invokeCurrentRecordVersionMethod': function (aMethodName, someValues) {
612//console.log(">>> invokeCurrentRecordVersionMethod", aMethodName);
613 return Clipperz.Async.callbacks("Record.invokeCurrentRecordVersionMethod", [
614 MochiKit.Base.method(this, 'getCurrentRecordVersion'),
615//function (aValue) { console.log("=== getCurrentRecordVersion", aValue); return aValue},
616 MochiKit.Base.methodcaller(aMethodName, someValues)
617 ], {trace:false});
618 },
619
620
621 'lazilyinvokeCurrentRecordVersionMethod': function (aMethodName, someValues, defaultResult) {
622 return Clipperz.Async.callbacks("Record.lazilyinvokeCurrentRecordVersionMethod", [
623 MochiKit.Base.method(this, 'currentVersionReference'),
624//function (aValue) { console.log("LAZY -> versions", aValue); return aValue; },
625 Clipperz.Async.deferredIf("versions has been loaded", [
626//function (aValue) { console.log("LAZY -> then"); return aValue; },
627 MochiKit.Base.method(this, 'getCurrentRecordVersion'),
628 MochiKit.Base.methodcaller(aMethodName, someValues),
629//function (aValue) { console.log("LAZY <- then"); return aValue; }
630 ], [
631//function (aValue) { console.log("LAZY -> else"); return aValue; },
632 MochiKit.Base.partial(MochiKit.Async.succeed, defaultResult),
633//function (aValue) { console.log("LAZY <- else"); return aValue; }
634 ])
635 ], {trace:false});
636 },
637
638 //=========================================================================
639
640 'hasPendingChanges': function () {
641 var deferredResult;
642
643 if (this.hasInitiatedObjectDataStore()) {
644 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChanges", {trace:false});
645 deferredResult.collectResults({
646 'super': MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasPendingChanges, this),
647 'currentVersion': [
648 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
649 // MochiKit.Base.methodcaller('hasPendingChanges')
650 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
651 ],
652 'directLogins': [
653 MochiKit.Base.method(this, 'directLogins'),
654//function (aValue) { console.log("Record.directLogins", aValue); return aValue; },
655 MochiKit.Base.values,
656 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')),
657 Clipperz.Async.collectAll,
658 Clipperz.Async.or
659 // function(someValues) {
660 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
661 // }
662 ]
663 });
664//deferredResult.addCallback(function (aValue) { console.log("Record.hasPendingResults", aValue); return aValue; });
665 deferredResult.addCallback(MochiKit.Base.values);
666 deferredResult.addCallback(MochiKit.Base.bind(function(someValues) {
667 var result;
668 result = MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
669
670 if ((result == false) && (this.isBrandNew() == false)) {
671 result = MochiKit.Iter.some(MochiKit.Base.values(this.transientState().getValue('hasPendingChanges.indexData')), MochiKit.Base.operator.identity);
672 }
673
674 return result;
675 }, this));
676
677 deferredResult.callback();
678 } else {
679 deferredResult = Clipperz.Async.callbacks("Recrod.hasPendingChanges [hasInitiatedObjectDataStore == false]", [
680 MochiKit.Base.method(this, 'directLogins'),
681 MochiKit.Base.values,
682 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')),
683 Clipperz.Async.collectAll,
684 Clipperz.Async.or
685 // function(someValues) {
686 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
687 // }
688 ], {trace:false})
689 }
690
691 return deferredResult;
692 },
693
694 //-------------------------------------------------------------------------
695
696 'hasPendingChangesWhenBrandNew': function () {
697 var deferredResult;
698
699 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChangesWhenBrandNew", {trace:false});
700 deferredResult.collectResults({
701 'label': [
702 MochiKit.Base.method(this, 'label'),
703 MochiKit.Base.partial(MochiKit.Base.operator.ne, '')
704 ],
705 'notes': [
706 MochiKit.Base.method(this, 'notes'),
707 MochiKit.Base.partial(MochiKit.Base.operator.ne, '')
708 ]
709 });
710 // deferredResult.addCallback(MochiKit.Base.values);
711 // deferredResult.addCallback(function(someValues) {
712 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
713 // });
714 deferredResult.addCallback(Clipperz.Async.or);
715
716 deferredResult.callback();
717
718 return deferredResult;
719 },
720
721 //-------------------------------------------------------------------------
722
723 'isBrandNewWithNoPendingChanges': function () {
724 vardeferredResult;
725
726 if (this.isBrandNew() == false) {
727 deferredResult = MochiKit.Async.succeed(false);
728 } else {
729 deferredResult = Clipperz.Async.callbacks("Record.isBrandNewWithNoPendingChanges", [
730 MochiKit.Base.method(this, 'hasPendingChanges'),
731 MochiKit.Base.operator.lognot
732 ], {trace:false});
733 }
734
735 return deferredResult;
736 },
737
738 //=========================================================================
739
740 'revertChanges': function () {
741 var deferredResult;
742
743 if (this.isBrandNew() == false) {
744 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.revertChanges", {trace:false});
745 deferredResult.addMethod(this, 'hasPendingChanges');
746 deferredResult.addIf([
747 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
748 // MochiKit.Base.methodcaller('revertChanges'),
749 MochiKit.Base.method(this,'invokeCurrentRecordVersionMethod', 'revertChanges'),
750
751 MochiKit.Base.method(this, 'directLogins'),
752 MochiKit.Base.values,
753 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('revertChanges')),
754
755 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.revertChanges, this)
756 ], [
757 MochiKit.Async.succeed
758 ]);
759 deferredResult.callback();
760 } else {
761 // this.deleteAllCleanTextData();
762 deferredResult = MochiKit.Async.succeed();
763 }
764
765 return deferredResult;
766 },
767
768 //-------------------------------------------------------------------------
769
770 'resetTransientState': function (isCommitting) {
771 // if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) {
772 // this._directLogins = this.transientState().getValue('directLogins');
773 // }
774
775 return Clipperz.Async.callbacks("Record.resetTransientState", [
776 //- MochiKit.Base.method(this, 'getCurrentRecordVersion'),
777 //- MochiKit.Base.methodcaller('resetTransientState'),
778 // MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'resetTransientState'),
779 MochiKit.Base.method(this, 'lazilyinvokeCurrentRecordVersionMethod', 'resetTransientState'),
780
781 MochiKit.Base.method(this, 'directLogins'),
782//function (aValue) { console.log("resetTransientState - directLogins", aValue); return aValue; },
783 MochiKit.Base.values,
784 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('resetTransientState')),
785
786 MochiKit.Base.bind(function () {
787 if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) {
788 this._directLogins = this.transientState().getValue('directLogins');
789 }
790 }, this),
791
792 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.resetTransientState, this, isCommitting)
793 ], {trace:false})
794 },
795
796 //-------------------------------------------------------------------------
797
798 'commitTransientState': function () {
799 var deferredResult;
800
801 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.commitTransientState", {trace:false});
802 deferredResult.addMethod(this, 'hasPendingChanges');
803 deferredResult.addIf([
804 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.commitTransientState, this),
805 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
806 // MochiKit.Base.methodcaller('commitTransientState'),
807 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'commitTransientState'),
808 MochiKit.Base.method(this, 'directLogins'),
809 MochiKit.Base.values,
810 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('commitTransientState'))
811 ], [
812 MochiKit.Async.succeed
813 ]);
814 deferredResult.callback();
815
816 return deferredResult;
817 },
818
819 //=========================================================================
820
821 'retrieveDirectLoginIndexDataFunction': function () {
822//console.log("Record.retrieveDirectLoginIndexDataFunction", this._retrieveDirectLoginIndexDataFunction);
823 return this._retrieveDirectLoginIndexDataFunction;
824 },
825
826 'setDirectLoginIndexDataFunction': function () {
827 return this._setDirectLoginIndexDataFunction;
828 },
829
830 'removeDirectLoginIndexDataFunction': function () {
831 return this._removeDirectLoginIndexDataFunction;
832 },
833
834 //=========================================================================
835
836 'deleteAllCleanTextData': function () {
837 // return Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData.apply(this, arguments);
838
839 return Clipperz.Async.callbacks("Record.deleteAllCleanTextData", [
840 MochiKit.Base.method(this, 'versions'),
841 MochiKit.Base.values,
842 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
843
844 MochiKit.Base.method(this, 'directLogins'),
845 MochiKit.Base.values,
846 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
847
848 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData, this)
849 ], {trace:false});
850 },
851
852 'hasAnyCleanTextData': function () {
853 // return Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData.apply(this, arguments);
854
855 return Clipperz.Async.callbacks("Record.hasAnyCleanTextData", [
856 Clipperz.Async.collectResults("Record.hasAnyCleanTextData [collect results]", {
857 'versions':[
858 MochiKit.Base.method(this, 'versions'),
859 MochiKit.Base.values,
860 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
861 Clipperz.Async.collectAll
862 ],
863 'directLogins': [
864 MochiKit.Base.method(this, 'directLogins'),
865 MochiKit.Base.values,
866 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
867 Clipperz.Async.collectAll
868 ],
869 'super': [
870 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData, this)
871 ]
872 }, {trace:false}),
873 Clipperz.Async.or
874 ])
875 },
876
877 //=========================================================================
878 __syntaxFix__: "syntax fix"
879});
880
881
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
new file mode 100644
index 0000000..e675525
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
@@ -0,0 +1,187 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!";
31}
32
33if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
34
35Clipperz.PM.DataModel.User.Header.Legacy = function(args) {
36 //args = args || {};
37 Clipperz.PM.DataModel.User.Header.Legacy.superclass.constructor.apply(this, arguments);
38
39 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
40 this._records = null;
41 //this._directLogins = null;
42
43 return this;
44}
45
46
47Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Legacy, Clipperz.PM.DataModel.EncryptedRemoteObject, {
48
49 'toString': function() {
50 return "Clipperz.PM.DataModel.User.Header.Legacy";
51 },
52
53 //-------------------------------------------------------------------------
54
55 'retrieveRecordDetailFunction': function () {
56 return this._retrieveRecordDetailFunction;
57 },
58
59 //-------------------------------------------------------------------------
60
61 'getRecordKey': function (aRecordReference) {
62 var deferredResult;
63
64 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.getRecordKey", {trace:false});
65 deferredResult.addMethod(this, 'getRecordIndexData');
66 deferredResult.addCallback(MochiKit.Base.itemgetter('key'))
67 deferredResult.callback();
68
69 return deferredResult;
70 },
71
72 //=========================================================================
73
74 'getRecordIndexData': function (aRecordReference) {
75 return this.getValue('records.' + aRecordReference);
76 },
77
78 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
79 return this.setValue('records.' + aRecordReference + "." + aKey, aValue);
80 },
81
82 //-------------------------------------------------------------------------
83
84 'getDirectLoginIndexData': function (aDirectLoginReference) {
85 return this.getValue('directLogins.' + aDirectLoginReference);
86 },
87
88 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
89 return this.setValue('directLogins.' + aDirectLoginReference + '.' + aKey, aValue);
90 },
91
92 'removeDirectLoginIndexData': function (aDirectLoginReference) {
93 return this.removeValue('directLogins.' + aDirectLoginReference);
94 },
95
96 //=========================================================================
97
98 'records': function () {
99 vardeferredResult;
100 var deferredLock;
101
102 deferredLock = this.getDeferredLockForKey('records');
103
104 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records", {trace:false});
105 deferredResult.acquireLock(deferredLock);
106 deferredResult.addCallback(MochiKit.Base.bind(function () {
107 var innerDeferredResult;
108
109 if (this._records == null) {
110 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records <inner deferred>", {trace:false});
111 innerDeferredResult.collectResults({
112 'header': [
113 // MochiKit.Base.method(this, 'getObjectDataStore'),
114 // MochiKit.Base.methodcaller('values')
115 MochiKit.Base.method(this, 'values')
116 ],
117 'recordsStats': [
118 MochiKit.Base.method(this, 'getRemoteData'),
119 MochiKit.Base.itemgetter('recordsStats')
120 ]
121 });
122 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
123 var reference;
124
125 this._records = {};
126 // this._directLogins = {};
127
128 for (reference in someObjectData['header']['records']) {
129 varrecord;
130
131 record = new Clipperz.PM.DataModel.Record({
132 'reference': reference,
133 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
134 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
135 // 'encryptedDataKeypath': 'data',
136 // 'encryptedVersionKeypath': 'version',
137
138 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
139 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
140 'updateDate': someObjectData['recordsStats'][reference]['updateDate'],
141
142 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
143 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
144 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData')
145 });
146
147 this._records[reference] = record;
148 }
149
150 for (reference in someObjectData['header']['directLogins']) {
151 vardirectLogin;
152 var record;
153
154 record = this._records[someObjectData['header']['directLogins'][reference]['record']];
155 if (record != null) {
156 directLogin = new Clipperz.PM.DataModel.DirectLogin({
157 'reference': reference,
158 'record': record//,
159 // 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
160 // 'setIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
161 // 'removeIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData')
162 });
163 } else {
164Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!");
165 }
166 }
167
168 return this._records;
169 }, this));
170 innerDeferredResult.callback();
171 } else {
172 innerDeferredResult = MochiKit.Async.succeed(this._records);
173 }
174
175 return innerDeferredResult;
176 }, this));
177 deferredResult.releaseLock(deferredLock);
178 deferredResult.callback();
179
180 return deferredResult;
181 },
182
183 //=========================================================================
184 __syntaxFix__: "syntax fix"
185});
186
187
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
new file mode 100644
index 0000000..0ee8599
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
@@ -0,0 +1,128 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!";
31}
32if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
33
34//-----------------------------------------------------------------------------
35
36Clipperz.PM.DataModel.User.Header.OneTimePasswords = function(args) {
37 Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.constructor.apply(this, arguments);
38
39 this._oneTimePasswords = null;
40
41 return this;
42}
43
44//-----------------------------------------------------------------------------
45
46Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.OneTimePasswords, Clipperz.PM.DataModel.EncryptedRemoteObject, {
47
48 'toString': function() {
49 return "Clipperz.PM.DataModel.User.Header.OneTimePasswords";
50 },
51
52 //-------------------------------------------------------------------------
53/*
54 'packData': function (someData) { //++
55 var result;
56
57console.log(">>> OneTimePasswords.packData", someData);
58 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packData.apply(this, arguments);
59console.log("<<< OneTimePasswords.packData");
60
61 return result;
62 },
63*/
64 //-------------------------------------------------------------------------
65/*
66 'packRemoteData': function (someData) {
67 var result;
68
69console.log(">>> OneTimePasswords.packRemoteData", someData);
70 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packRemoteData.apply(this, arguments);
71console.log("<<< OneTimePasswords.packRemoteData");
72
73 return result;
74 },
75*/
76 //-------------------------------------------------------------------------
77/*
78 'prepareRemoteDataWithKey': function (aKey) {
79 var result;
80
81console.log(">>> OneTimePasswords.prepareRemoteDataWithKey");
82 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.prepareRemoteDataWithKey.apply(this, arguments);
83console.log("<<< OneTimePasswords.prepareRemoteDataWithKey");
84
85 return result;
86 },
87*/
88 //=========================================================================
89
90 'oneTimePasswords': function () {
91 vardeferredResult;
92
93 deferredResult = new Clipperz.Async.Deferred("User.Header.OneTimePasswords.oneTimePasswords", {trace:false});
94 if (this._oneTimePasswords == null) {
95 deferredResult.addMethod(this, 'values')
96 deferredResult.addCallback(MochiKit.Base.bind(function (someData) {
97 varotpKey;
98
99 this._oneTimePasswords = {};
100
101 for (otpKey in someData) {
102 var otp;
103 var otpParameters;
104
105 otpParameters = Clipperz.Base.deepClone(someData[otpKey]);
106 otpParameters['reference'] = otpKey;
107
108 otp = new Clipperz.PM.DataModel.OneTimePassword(otpParameters);
109 this._oneTimePasswords[otpKey] = otp;
110 }
111
112 return this._oneTimePasswords;
113
114 }, this));
115 deferredResult.callback();
116 } else {
117 deferredResult = MochiKit.Async.succeed(this._oneTimePasswords);
118 }
119
120 return deferredResult;
121 },
122
123 //=========================================================================
124 __syntaxFix__: "syntax fix"
125});
126
127//-----------------------------------------------------------------------------
128
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js
new file mode 100644
index 0000000..91b981e
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js
@@ -0,0 +1,53 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!";
31}
32
33if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
34
35Clipperz.PM.DataModel.User.Header.Preferences = function(args) {
36 Clipperz.PM.DataModel.User.Header.Preferences.superclass.constructor.apply(this, arguments);
37
38 return this;
39}
40
41
42Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Preferences, Clipperz.PM.DataModel.EncryptedRemoteObject, {
43
44 'toString': function() {
45 return "Clipperz.PM.DataModel.User.Header.Preferences";
46 },
47
48 //-------------------------------------------------------------------------
49 //=========================================================================
50 __syntaxFix__: "syntax fix"
51});
52
53
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
new file mode 100644
index 0000000..6ba58a8
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
@@ -0,0 +1,705 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!";
31}
32
33if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
34
35Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) {
36 Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments);
37
38//console.log("NEW Clipperz.PM.DataModel.User.Header.RecordIndex", args);
39 this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
40 'name':'recordsData',
41 'retrieveKeyFunction': args.retrieveKeyFunction,
42 'remoteData': {
43 'data': args.recordsData['data'],
44 'version': args.encryptedDataVersion,
45 'recordsStats': args.recordsStats
46 }//,
47 // 'encryptedDataKeypath': 'data',
48 // 'encryptedVersionKeypath': 'version'
49 });
50
51 this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
52 'name':'directLoginsData',
53 'retrieveKeyFunction': args.retrieveKeyFunction,
54 'remoteData': {
55 'data': args.directLoginsData['data'],
56 'version': args.encryptedDataVersion
57 }//,
58 // 'encryptedDataKeypath': 'data',
59 // 'encryptedVersionKeypath': 'version'
60 });
61
62 this._lock = new MochiKit.Async.DeferredLock();
63 this._transientState = null;
64
65 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
66 this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter');
67 this._directLoginsIndex = args.directLoginsData['index']|| Clipperz.Base.exception.raise('MandatoryParameter');
68
69 this._records = null;
70
71 return this;
72}
73
74
75Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, {
76
77 'toString': function() {
78 return "Clipperz.PM.DataModel.User.Header.RecordIndex";
79 },
80
81 //-------------------------------------------------------------------------
82
83 'retrieveRecordDetailFunction': function () {
84 return this._retrieveRecordDetailFunction;
85 },
86
87 //-------------------------------------------------------------------------
88
89 'recordsIndex': function () {
90 return this._recordsIndex;
91 },
92
93 'recordsData': function () {
94 return this._recordsData;
95 },
96
97 //-------------------------------------------------------------------------
98
99 'directLoginsIndex': function () {
100 return this._directLoginsIndex;
101 },
102
103 'directLoginsData': function () {
104 return this._directLoginsData;
105 },
106
107 //-------------------------------------------------------------------------
108
109 'lock': function () {
110 return this._lock;
111 },
112
113 //-------------------------------------------------------------------------
114
115 'transientState': function () {
116 if (this._transientState == null) {
117 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/);
118 }
119
120 return this._transientState;
121 },
122
123 'resetTransientState': function (isCommitting) {
124//console.log("######## UserHeaderRecordIndex - resetTransientState", Clipperz.Base.deepClone(this._transientState));
125 if (this._transientState != null) {
126 this._transientState.removeAllData();
127 }
128
129 this._transientState = null;
130 },
131
132 //-------------------------------------------------------------------------
133
134 'getRecordKey': function (aRecordReference) {
135 return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [
136 MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference),
137 MochiKit.Base.itemgetter('key')
138 ], {trace:false});
139 },
140
141 'setRecordKey': function (aRecordReference, aValue) {
142 return this.updateRecordIndexData(aRecordReference, 'key', aValue);
143 },
144
145 //-------------------------------------------------------------------------
146
147 'getRecordIndexData': function (aRecordReference) {
148 return this.recordsData().getValue(this.recordsIndex()[aRecordReference]);
149 },
150
151 //.........................................................................
152
153 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
154 return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue);
155 },
156
157 //-------------------------------------------------------------------------
158
159 'getDirectLoginIndexData': function (aDirectLoginReference) {
160 return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]);
161 },
162
163 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
164//console.log("UserHeaderRecordIndex.setDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference], aKey);
165//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) {
166 //throw "PIPPO";
167//}
168 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue);
169 },
170
171 'addDirectLoginIndexData': function (aDirectLoginReference) {
172//console.log("UserHeaderRecordIndex.addDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference]);
173 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {});
174 },
175
176 'removeDirectLoginIndexData': function (aDirectLoginReference) {
177 return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference])
178 },
179
180 //-------------------------------------------------------------------------
181
182 'records': function () {
183 vardeferredResult;
184
185 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false});
186 deferredResult.acquireLock(this.lock());
187 deferredResult.addCallback(MochiKit.Base.bind(function () {
188 var innerDeferredResult;
189
190 if (this._records == null) {
191 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false});
192 innerDeferredResult.collectResults({
193 'records': [
194 // MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'),
195 // MochiKit.Base.methodcaller('values')
196 MochiKit.Base.method(this.recordsData(), 'values')
197 ],
198 'recordsStats': [
199 MochiKit.Base.method(this.recordsData(), 'getRemoteData'),
200 MochiKit.Base.itemgetter('recordsStats')
201 ],
202 'directLogins': [
203 // MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'),
204 // MochiKit.Base.methodcaller('values')
205 MochiKit.Base.method(this.directLoginsData(), 'values')
206 ]
207 })
208 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) {
209 var indexReference;
210 var recordsInvertedIndex;
211 var directLoginsInvertedIndex;
212
213 recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex());
214 directLoginsInvertedIndex= Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex());
215
216 this._records = {};
217
218 for (indexReference in someData['records']) {
219 varrecord;
220 var reference;
221 var updateDate;
222
223 reference = recordsInvertedIndex[indexReference];
224
225 if (typeof(someData['recordsStats'][reference]) != 'undefined') {
226 updateDate = someData['recordsStats'][reference]['updateDate'];
227
228 record = new Clipperz.PM.DataModel.Record({
229 'reference': reference,
230 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
231 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
232
233 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
234 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
235 'updateDate': updateDate,
236
237 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
238 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
239 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
240
241 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
242 });
243
244 this._records[reference] = record;
245 } else {
246Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference]));
247 //# skip the record, as it seems it is not present in the DB
248 //updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
249 }
250 }
251
252 for (indexReference in someData['directLogins']) {
253 // vardirectLogin;
254 var reference;
255 var record;
256
257 reference = directLoginsInvertedIndex[indexReference];
258 record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]];
259
260 if (record != null) {
261 // directLogin = new Clipperz.PM.DataModel.DirectLogin({
262 new Clipperz.PM.DataModel.DirectLogin({
263 'reference': reference,
264 'record': record
265 });
266 } else {
267Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!");
268//console.log("direct login data", someData['directLogins']);
269//console.log("current direct login data", someData['directLogins'][indexReference])
270//console.log("reference", reference);
271//console.log("record index", this.recordsIndex());
272//console.log("record inverted index", recordsInvertedIndex);
273 }
274 }
275
276 return this._records;
277 }, this));
278 innerDeferredResult.callback();
279 } else {
280 innerDeferredResult = MochiKit.Async.succeed(this._records);
281 }
282
283 return innerDeferredResult;
284 }, this));
285 deferredResult.releaseLock(this.lock());
286 deferredResult.callback();
287
288 return deferredResult;
289 },
290
291 //-------------------------------------------------------------------------
292
293 'updateRecordIndexForNewRecord': function (aNewRecord) {
294 var newRecordIndex;
295 var recordReference;
296
297 recordReference = aNewRecord.reference();
298 newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + '';
299 this.recordsIndex()[recordReference] = newRecordIndex;
300
301 this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex);
302 this.transientState().setValue('newlyCreatedRecordsReferences'+ '.' + recordReference, aNewRecord);
303 },
304
305 //.........................................................................
306
307 'createNewRecord': function () {
308 var deferredResult;
309 var newRecord;
310
311//console.log("#### new Clipperz.PM.DataModel.Record [4]");
312 newRecord = new Clipperz.PM.DataModel.Record({
313 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
314 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
315
316 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
317 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
318 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
319
320 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
321 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
322 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
323
324 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
325 });
326
327 this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord);
328 this.updateRecordIndexForNewRecord(newRecord);
329
330 deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [
331 MochiKit.Base.method(this, 'records'),
332 MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord),
333 MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()),
334 MochiKit.Base.method(newRecord, 'setLabel', ''),
335 MochiKit.Base.partial(MochiKit.Async.succeed, newRecord)
336 ], {trace:false});
337
338
339 return deferredResult;
340 },
341
342 //-------------------------------------------------------------------------
343
344 'deleteRecord': function (aRecord) {
345 var deferredResult;
346 var recordReference;
347
348 recordReference = aRecord.reference();
349
350 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false});
351
352 deferredResult.addMethod(aRecord, 'directLogins');
353 deferredResult.addCallback(MochiKit.Base.values);
354 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin'));
355
356 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
357 deferredResult.addCallback(MochiKit.Base.bind(function () {
358 this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]);
359 delete this.recordsIndex()[recordReference];
360 }, this));
361
362 deferredResult.addMethod(this, 'records');
363 deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference));
364 deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference);
365
366 deferredResult.addMethod(this, 'records');
367 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
368 delete someRecords[recordReference];
369 }, this));
370 deferredResult.callback();
371
372 return deferredResult;
373 },
374
375 //=========================================================================
376
377 'removeDirectLogin': function (aDirectLogin) {
378 this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]);
379 },
380
381 //-------------------------------------------------------------------------
382
383 'createNewDirectLogin': function (aRecord) {
384 var newDirectLogin;
385 varnewDirectLoginIndexValue;
386
387 newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord});
388 newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1;
389
390 this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
391
392//console.log("UserHeaderRecordIndex.createNewDirectLogin [1]", newDirectLogin.reference(), newDirectLoginIndexValue);
393 this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
394//console.log("UserHeaderRecordIndex.createNewDirectLogin [2]", newDirectLogin.reference(), this.directLoginsIndex()[newDirectLogin.reference()]);
395 this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
396
397 return newDirectLogin;
398 },
399
400 //=========================================================================
401
402 'deleteAllCleanTextData': function () {
403 return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [
404 // MochiKit.Base.method(this, 'records'),
405 // MochiKit.Base.values,
406 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
407
408 MochiKit.Base.method(this, 'recordsData'),
409 MochiKit.Base.methodcaller('deleteAllCleanTextData'),
410 MochiKit.Base.method(this, 'directLoginsData'),
411 MochiKit.Base.methodcaller('deleteAllCleanTextData')
412 ], {trace:false});
413 },
414
415 //-------------------------------------------------------------------------
416
417 'hasAnyCleanTextData': function () {
418 var deferredResult;
419
420 deferredResult = new Clipperz.Async.Deferred({trace:false});
421 deferredResult.collectResults({
422 'recordsData': [
423 MochiKit.Base.method(this, 'recordsData'),
424 MochiKit.Base.methodcaller('hasAnyCleanTextData')
425 ],
426 'directLoginsData':[
427 MochiKit.Base.method(this, 'directLoginsData'),
428 MochiKit.Base.methodcaller('hasAnyCleanTextData')
429 ],
430 // 'records': [
431 // MochiKit.Base.method(this, 'records'),
432 // MochiKit.Base.values,
433 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
434 // Clipperz.Async.collectAll
435 // ]
436 });
437//deferredResult.addCallback(function (aValue) { console.log("USER.Header.RecordIndex.hasAnyCleanTextData", aValue); return aValue});
438
439 // deferredResult.addCallback(MochiKit.Base.values);
440 // deferredResult.addCallback(MochiKit.Base.flattenArguments);
441 // deferredResult.addCallback(function(someValues) {
442 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
443 // });
444 deferredResult.addCallback(Clipperz.Async.or);
445
446 deferredResult.callback();
447
448 return deferredResult;
449 },
450
451 //-------------------------------------------------------------------------
452
453 'hasPendingChanges': function () {
454 vardeferredResult;
455
456 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.hasPendingChanges", {trace:false});
457 deferredResult.collectResults({
458 'recordsData': [
459 MochiKit.Base.method(this, 'recordsData'),
460 MochiKit.Base.methodcaller('hasPendingChanges')
461 ],
462 'directLoginsData': [
463 MochiKit.Base.method(this, 'directLoginsData'),
464 MochiKit.Base.methodcaller('hasPendingChanges')
465 ]
466 });
467//deferredResult.addCallback(function (aValue) { console.log("UserHeaderIndex.hasPendingResults", aValue); return aValue; });
468 deferredResult.addCallback(Clipperz.Async.or);
469 // deferredResult.addCallback(MochiKit.Base.values);
470 // deferredResult.addCallback(MochiKit.Base.flattenArguments);
471 // deferredResult.addCallback(function(someValues) {
472 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
473 // });
474 deferredResult.callback();
475
476 return deferredResult;
477 },
478
479 //-------------------------------------------------------------------------
480
481 'commitTransientState': function () {
482 var deferredResult;
483
484 deferredResut = Clipperz.Async.callbacks("User.Header.RecordIndex.commitTransientState", [
485 MochiKit.Base.method(this, 'recordsData'),
486 MochiKit.Base.methodcaller('commitTransientState'),
487
488 MochiKit.Base.method(this, 'directLoginsData'),
489 MochiKit.Base.methodcaller('commitTransientState'),
490
491 MochiKit.Base.method(this, 'resetTransientState', true)
492 ], {trace:false});
493
494 return deferredResult;
495 },
496
497 //-------------------------------------------------------------------------
498
499 'revertChanges': function () {
500 return Clipperz.Async.callbacks("User.Header.RecordIndex.revertChanges", [
501 MochiKit.Base.method(this, 'recordsData'),
502 MochiKit.Base.methodcaller('revertChanges'),
503
504 // MochiKit.Base.method(this, 'directLoginsData'),
505 // MochiKit.Base.methodcaller('revertChanges'),
506
507 MochiKit.Base.method(this, 'records'),
508 MochiKit.Base.bind(function (someRecords) {
509 varrecordReference;
510
511 for (recordReference in this.transientState().getValue('deleteRecordsReferences')) {
512 this.recordsIndex()[recordReference] = this.transientState().getValue('deleteRecordsIndex' + '.' + recordReference);
513 someRecords[recordReference] = this.transientState().getValue('deleteRecordsReferences' + '.' + recordReference);
514 }
515
516 for (recordReference in this.transientState().getValue('newRecordsReferences')) {
517 delete this.recordsIndex()[recordReference];
518 delete someRecords[recordReference];
519 }
520 }, this),
521
522 // MochiKit.Base.method(this, 'directLogins'),
523 MochiKit.Base.bind(function () {
524 vardirectLoginReference;
525
526 //this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
527//
528 //this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
529 //this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
530
531
532 // for (directLoginReference in this.transientState().getValue('deleteDirectLoginReferences')) {
533 // someDirectLogins[directLoginReference] = this.transientState().getValue('deleteDirectLoginReferences' + '.' + recordReference);
534 // }
535
536 for (directLoginReference in this.transientState().getValue('newDirectLoginReferences')) {
537 // this.directLoginsData().removeValue(this.directLoginsIndex()[directLoginReference]);
538 delete this.directLoginsIndex()[directLoginReference];
539 }
540 }, this),
541
542 MochiKit.Base.method(this, 'directLoginsData'),
543 MochiKit.Base.methodcaller('revertChanges'),
544
545 MochiKit.Base.method(this, 'resetTransientState', false)
546 ], {trace:false});
547 },
548
549 //-------------------------------------------------------------------------
550
551 'prepareRemoteDataWithKey': function (aKey) {
552 // "records": {
553 // "index": {
554 // "eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5": "0",
555 // "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551": "1",
556 // ...
557 // "465a067a0bd2b470fa834de5397e38494de0c7707938262fae3427932e219744": "18",
558 // "4fd1dc2ca860b7fb47cef10a84edb3270da05510b0a30a6b0b083898712d4b9e": "19"
559 // },
560 // "data": "n+AzGEEQXaSRSY4d ... BDypotrXgPo94uHfoXvGFzwCn8w="
561 // },
562 // "directLogins": {
563 // "index": {
564 // "61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0",
565 // "989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1",
566 // ...
567 // "cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17",
568 // "7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18"
569 // },
570 // "data":"5YG9KKU/OZ5guUgFlms6k1 ... ZG/5Fn0uN+LoAsNfHm+EE62x"
571 // },
572
573 var deferredResult;
574 var result;
575
576//console.log("recordsIndex", this.recordsIndex());
577 result = {};
578
579 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataWithKey", {trace:false});
580 deferredResult.collectResults({
581 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.recordsIndex()),
582 'data': [
583 MochiKit.Base.method(this.recordsData(), 'prepareRemoteDataWithKey', aKey),
584 MochiKit.Base.itemgetter('data')
585 ]
586 });
587 deferredResult.addCallback(Clipperz.Async.setItem, result, 'records');
588
589 deferredResult.collectResults({
590 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.directLoginsIndex()),
591 'data': [
592 MochiKit.Base.method(this.directLoginsData(), 'prepareRemoteDataWithKey', aKey),
593 MochiKit.Base.itemgetter('data')
594 ]
595 });
596 deferredResult.addCallback(Clipperz.Async.setItem, result, 'directLogins');
597
598 deferredResult.addCallback(MochiKit.Async.succeed, result);
599
600 deferredResult.callback();
601
602 return deferredResult;
603 },
604
605 //-------------------------------------------------------------------------
606
607 'updateRecordKeyAndPrepareRemoteData': function (aRecord) {
608 varnewRecordKey;
609 var deferredResult;
610
611 newRecordKey = Clipperz.PM.Crypto.randomKey();
612
613 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.updateRecordKeyAndPrepareRemoteData", {trace:false});
614 deferredResult.addCallback(MochiKit.Base.method(aRecord, 'prepareRemoteDataWithKey', newRecordKey));
615 deferredResult.addCallbackPass(MochiKit.Base.method(this, 'setRecordKey', aRecord.reference(), newRecordKey));
616 deferredResult.callback();
617
618 return deferredResult;
619 },
620
621 //.........................................................................
622
623 'removeNewRecordWithNoChanges': function (aRecord) {
624 var deferredResult;
625 var recordReference;
626
627 recordReference = aRecord.reference();
628
629 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.removeNewRecordWithNoChanges", {trace:false});
630
631 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
632 deferredResult.addCallback(MochiKit.Base.bind(function () {
633 delete this.recordsIndex()[recordReference];
634 }, this));
635
636 deferredResult.addMethod(this, 'records');
637 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
638 delete someRecords[recordReference];
639 }, this));
640 deferredResult.callback();
641
642 return deferredResult;
643 },
644
645 //.........................................................................
646
647 'prepareRemoteDataForChangedRecords': function () {
648 vardeferredResult;
649 varresult;
650
651 result = {};
652
653 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataForChangedRecords", {trace:false});
654
655 deferredResult.addMethod(this, 'records');
656 deferredResult.addCallback(MochiKit.Base.values);
657 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('isBrandNewWithNoPendingChanges'));
658 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeNewRecordWithNoChanges'));
659
660 deferredResult.addMethod(this, 'records');
661 deferredResult.addCallback(MochiKit.Base.values);
662 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('hasPendingChanges'));
663 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordKeyAndPrepareRemoteData'));
664 deferredResult.addCallback(Clipperz.Async.collectAll);
665
666 deferredResult.addCallback(Clipperz.Async.deferredIf("updated records != null", [
667 MochiKit.Base.operator.identity
668 ], [
669 MochiKit.Base.partial(MochiKit.Async.succeed, [])
670 ]));
671 deferredResult.addCallback(Clipperz.Async.setItem, result, 'updated');
672
673 deferredResult.addMethod(this.transientState(), 'getValue', 'deleteRecordsReferences');
674 deferredResult.addCallback(MochiKit.Base.keys);
675 deferredResult.addCallback(Clipperz.Async.deferredIf("deleted records != null", [
676 MochiKit.Base.operator.identity
677 ], [
678 MochiKit.Base.partial(MochiKit.Async.succeed, [])
679 ]));
680 deferredResult.addCallback(Clipperz.Async.setItem, result, 'deleted');
681
682 deferredResult.addCallback(MochiKit.Async.succeed, result);
683 deferredResult.callback();
684
685 return deferredResult;
686 },
687
688 //-------------------------------------------------------------------------
689 __syntaxFix__: "syntax fix"
690});
691
692
693
694Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex = function (anIndex) {
695 var result;
696 var key;
697
698 result = {};
699
700 for (key in anIndex) {
701 result[anIndex[key]] = key;
702 }
703
704 return result;
705}; \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
new file mode 100644
index 0000000..e8afa97
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
@@ -0,0 +1,817 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32
33
34//#############################################################################
35
36Clipperz.PM.DataModel.User = function (args) {
37 args = args || {};
38
39 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments);
40
41 this._username = args.username || null;
42 this._getPassphraseFunction = args.getPassphraseFunction || null;
43
44 this._data = null;
45
46 this._connection = null;
47 this._connectionVersion = 'current';
48
49 this._serverData = null;
50 this._serverLockValue = null;
51 this._transientState = null;
52
53 this._deferredLocks = {
54 'passphrase': new MochiKit.Async.DeferredLock(),
55 'serverData': new MochiKit.Async.DeferredLock(),
56 // 'recordsIndex': new MochiKit.Async.DeferredLock(),
57 // 'directLoginsIndex':new MochiKit.Async.DeferredLock()
58 // 'preferences': new MochiKit.Async.DeferredLock()
59 // 'oneTimePasswords': new MochiKit.Async.DeferredLock()
60 '__syntaxFix__': 'syntax fix'
61 };
62
63 return this;
64}
65
66Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
67
68 'toString': function () {
69 return "Clipperz.PM.DataModel.User - " + this.username();
70 },
71
72 //-------------------------------------------------------------------------
73
74 'username': function () {
75 return this._username;
76 },
77
78 'setUsername': function (aValue) {
79 this._username = aValue;
80 },
81
82 //-------------------------------------------------------------------------
83
84 'displayName': function() {
85 return "" + this.username() + "";
86 },
87
88 //-------------------------------------------------------------------------
89
90 'data': function () {
91 if (this._data == null) {
92 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/);
93 };
94
95 return this._data;
96 },
97
98 //-------------------------------------------------------------------------
99
100 'serverLockValue': function () {
101 return this._serverLockValue;
102 },
103
104 'setServerLockValue': function (aValue) {
105 this._serverLockValue = aValue;
106 },
107
108 //-------------------------------------------------------------------------
109
110 'transientState': function () {
111 if (this._transientState == null) {
112 this._transientState = {}
113 }
114
115 return this._transientState;
116 },
117
118 'resetTransientState': function (isCommitting) {
119 this._transientState = null;
120 },
121
122 //-------------------------------------------------------------------------
123
124 'deferredLockForSection': function(aSectionName) {
125 return this._deferredLocks[aSectionName];
126 },
127
128 //-------------------------------------------------------------------------
129
130 'getPassphrase': function() {
131 var deferredResult;
132
133 deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false});
134 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
135 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction());
136 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
137 deferredResult.callback();
138
139 return deferredResult;
140 },
141
142 'getPassphraseFunction': function () {
143 return this._getPassphraseFunction;
144 },
145
146 //-------------------------------------------------------------------------
147
148 'getCredentials': function () {
149 return Clipperz.Async.collectResults("User; get username and passphrase", {
150 'username': MochiKit.Base.method(this, 'username'),
151 'password': MochiKit.Base.method(this, 'getPassphrase')
152 }, {trace:false})();
153 },
154
155 //-------------------------------------------------------------------------
156
157 'changePassphrase': function (aNewValue) {
158 return this.updateCredentials(this.username(), aNewValue);
159 },
160
161 //.........................................................................
162
163 'updateCredentials': function (aUsername, aPassphrase) {
164 vardeferredResult;
165
166 deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false});
167 // deferredResult.addMethod(this, 'getPassphrase');
168 // deferredResult.setValue('currentPassphrase');
169 deferredResult.addMethod(this.connection(), 'ping');
170 deferredResult.addMethod(this, 'setUsername', aUsername)
171 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
172 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase);
173 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
174 // deferredResult.getValue('currentPassphrase');
175 deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase);
176 deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase);
177 deferredResult.callback();
178
179 return deferredResult;
180 },
181
182 //-------------------------------------------------------------------------
183
184 'initialSetupWithNoData': function () {
185 this._serverData = {
186 'version': '0.1',
187 'statistics': "",
188 'header': {
189 'data': null,
190 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
191
192 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({
193 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
194 'recordsData': {'data':null, 'index':{}},
195 'recordsStats': null,
196 'directLoginsData': {'data':null, 'index':{}},
197 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
198 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
199 }),
200 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({
201 'name':'preferences',
202 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
203 }),
204 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
205 'name':'preferences',
206 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
207 })
208 }
209 };
210
211 // this._serverLockValue = Clipperz.PM.Crypto.randomKey();
212 },
213
214 //.........................................................................
215
216 'registerAsNewAccount': function () {
217 var deferredResult;
218
219 deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false});
220 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
221 deferredResult.addMethod(this, 'initialSetupWithNoData')
222 deferredResult.addMethod(this, 'getPassphrase');
223 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
224 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
225 deferredResult.addMethod(this.connection(), 'register');
226 deferredResult.addCallback(MochiKit.Base.itemgetter('lock'));
227 deferredResult.addMethod(this, 'setServerLockValue');
228 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered');
229
230 // deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure'));
231
232 deferredResult.callback();
233
234 return deferredResult;
235 },
236
237 //-------------------------------------------------------------------------
238
239 'login': function () {
240 var deferredResult;
241
242 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false});
243 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
244 deferredResult.addMethod(this, 'getPassphrase');
245 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue);
246 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [
247 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}),
248 MochiKit.Base.method(this, 'getCredentials'),
249 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'),
250 MochiKit.Base.method(this.data(), 'setValue', 'passphrase')
251 ], []));
252 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase'));
253 deferredResult.addMethod(this.connection(), 'login');
254 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn');
255 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback'));
256
257 deferredResult.callback();
258
259 return deferredResult;
260 },
261
262 //.........................................................................
263
264 'handleConnectionFallback': function(aValue) {
265 var result;
266
267 if (aValue instanceof MochiKit.Async.CancelledError) {
268 result = aValue;
269 } else {
270 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]);
271
272 if (this.connectionVersion() != null) {
273 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry");
274
275 result.addMethod(this, 'login');
276 result.callback();
277 } else {
278 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [
279 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'),
280 MochiKit.Base.method(this, 'setConnectionVersion', 'current'),
281 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'),
282 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed)
283 ], {trace:false});
284 }
285 }
286
287 return result;
288 },
289
290 //-------------------------------------------------------------------------
291
292 'lock': function () {
293 return Clipperz.Async.callbacks("User.lock", [
294 MochiKit.Base.method(this, 'deleteAllCleanTextData')
295 ], {trace:false});
296 },
297
298 //-------------------------------------------------------------------------
299
300 'logout': function () {
301 return Clipperz.Async.callbacks("User.logout", [
302 MochiKit.Base.method(this, 'deleteAllCleanTextData'),
303 MochiKit.Base.method(this.connection(), 'logout')
304 ], {trace:false});
305 },
306
307 //-------------------------------------------------------------------------
308
309 'headerFormatVersion': function(anHeader) {
310 var result;
311
312 if (anHeader.charAt(0) == '{') {
313 varheaderData;
314
315 headerData = Clipperz.Base.evalJSON(anHeader);
316 result = headerData['version'];
317 } else {
318 result = 'LEGACY';
319 }
320
321 return result;
322 },
323
324 //-------------------------------------------------------------------------
325
326 'unpackServerData': function (someServerData) {
327 var unpackedData;
328 var headerVersion;
329
330 varrecordsIndex;
331 var preferences;
332 var oneTimePasswords;
333
334//console.log(">>> ***************** user.unpackServerData", someServerData);
335 this.setServerLockValue(someServerData['lock']);
336
337 headerVersion = this.headerFormatVersion(someServerData['header']);
338
339 switch (headerVersion) {
340 case 'LEGACY':
341 varlegacyHeader;
342
343 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({
344 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
345 'remoteData': {
346 'data': someServerData['header'],
347 'version': someServerData['version'],
348 'recordsStats': someServerData['recordsStats']
349 },
350 // 'encryptedDataKeypath': 'data',
351 // 'encryptedVersionKeypath': 'version',
352 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
353 });
354
355 recordsIndex = legacyHeader;
356 preferences = legacyHeader;
357 oneTimePasswords= legacyHeader;
358 break;
359 case '0.1':
360 varheaderData;
361
362 headerData = Clipperz.Base.evalJSON(someServerData['header']);
363
364 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({
365 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
366 'recordsData': headerData['records'],
367 'recordsStats': someServerData['recordsStats'],
368 'directLoginsData': headerData['directLogins'],
369 'encryptedDataVersion': someServerData['version'],
370 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
371 });
372
373 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing
374 if (typeof(headerData['preferences']) != 'undefined') {
375 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
376 'name':'preferences',
377 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
378 'remoteData': {
379 'data': headerData['preferences']['data'],
380 'version': someServerData['version']
381 }
382 });
383 } else {
384 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
385 'name':'preferences',
386 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
387 });
388 }
389
390 if (typeof(headerData['oneTimePasswords']) != 'undefined') {
391 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
392 'name':'preferences',
393 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
394 'remoteData': {
395 'data': headerData['oneTimePasswords']['data'],
396 'version': someServerData['version']
397 }
398 });
399 } else {
400 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
401 'name':'preferences',
402 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
403 });
404 }
405
406 break;
407 }
408
409 unpackedData = {
410 'version': someServerData['version'],
411 'statistics': someServerData['statistics'],
412 'header': {
413 'data': someServerData['header'],
414 'version': headerVersion,
415
416 'recordsIndex': recordsIndex,
417 'preferences': preferences,
418 'oneTimePasswords': oneTimePasswords
419 }
420 };
421
422 this._serverData = unpackedData;
423//console.log("<<< ***************** user.unpackServerData", this._serverData);
424
425 return this._serverData;
426 },
427
428 //-------------------------------------------------------------------------
429
430 'getServerData': function() {
431 var deferredResult;
432
433 deferredResult = new Clipperz.Async.Deferred("User.getServerData", {trace:false});
434 deferredResult.acquireLock(this.deferredLockForSection('serverData'));
435 deferredResult.addCallback(MochiKit.Base.bind(function(aResult) {
436 var innerDeferredResult;
437
438 innerDeferredResult = new Clipperz.Async.Deferred("User.getUserDetails.innerDeferred", {trace:false});
439 if (this._serverData == null) {
440 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadingUserDetails');
441 innerDeferredResult.addMethod(this.connection(), 'message', 'getUserDetails');
442 innerDeferredResult.addMethod(this, 'unpackServerData');
443 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadedUserDetails');
444 }
445
446 innerDeferredResult.addCallback(MochiKit.Base.bind(function () {
447 return this._serverData;
448 },this));
449 innerDeferredResult.callback();
450
451 return innerDeferredResult;
452 }, this));
453 deferredResult.releaseLock(this.deferredLockForSection('serverData'));
454 deferredResult.callback();
455
456 return deferredResult;
457 },
458
459 //-------------------------------------------------------------------------
460
461 'connectionVersion': function() {
462 return this._connectionVersion;
463 },
464
465 'setConnectionVersion': function(aValue) {
466 if (this._connectionVersion != aValue) {
467 this.resetConnection();
468 }
469 this._connectionVersion = aValue;
470 },
471
472 //-------------------------------------------------------------------------
473
474 'connection': function() {
475 if ((this._connection == null) && (this.connectionVersion() != null) ){
476 this._connection = new Clipperz.PM.Connection.communicationProtocol.versions[this.connectionVersion()]({
477 getCredentialsFunction: MochiKit.Base.method(this, 'getCredentials')
478 });
479 }
480
481 return this._connection;
482 },
483
484 'resetConnection': function(aValue) {
485 if (this._connection != null) {
486 this._connection.reset();
487 }
488
489 this._connection = null;
490 },
491
492 //=========================================================================
493
494 'getHeaderIndex': function (aKey) {
495 return Clipperz.Async.callbacks("User.getHeaderIndex", [
496 MochiKit.Base.method(this, 'getServerData'),
497 MochiKit.Base.itemgetter('header'),
498 MochiKit.Base.itemgetter(aKey)
499 ], {trace:false})
500 },
501
502 //=========================================================================
503
504 'getRecords': function () {
505 return Clipperz.Async.callbacks("User.getRecords", [
506 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
507 MochiKit.Base.methodcaller('records'),
508 MochiKit.Base.values
509 ], {trace:false});
510 },
511
512 'recordWithLabel': function (aLabel) {
513 return Clipperz.Async.callbacks("User.recordWithLabel", [
514 MochiKit.Base.method(this, 'getRecords'),
515 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aRecord) {
516 return Clipperz.Async.callbacks("User.recordWithLabel - check record label", [
517 MochiKit.Base.methodcaller('label'),
518 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
519 ], {trace:false}, aRecord);
520 }),
521 function (someFilteredResults) {
522 var result;
523
524 switch (someFilteredResults.length) {
525 case 0:
526 result = null;
527 break;
528 case 1:
529 result = someFilteredResults[0];
530 break;
531 default:
532 WTF = TODO;
533 break;
534 }
535
536 return result;
537 }
538 ], {trace:false});
539 },
540
541 //-------------------------------------------------------------------------
542
543 'getRecord': function (aRecordReference) {
544 return Clipperz.Async.callbacks("User.getRecord", [
545 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
546 MochiKit.Base.methodcaller('records'),
547 MochiKit.Base.itemgetter(aRecordReference),
548
549 Clipperz.Async.deferredIf("record != null", [
550 MochiKit.Base.operator.identity
551 ], [
552 function () { throw "Record does not exists"}
553 ])
554 ], {trace:false});
555 },
556
557 //-------------------------------------------------------------------------
558
559 'getRecordDetail': function (aRecordReference) {
560 return this.connection().message('getRecordDetail', {reference: aRecordReference});
561 },
562
563 //-------------------------------------------------------------------------
564
565 'deleteRecord': function (aRecord) {
566 return Clipperz.Async.callbacks("User.deleteRecord", [
567 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
568 MochiKit.Base.methodcaller('deleteRecord', aRecord)
569 ], {trace:false});
570 },
571
572 //-------------------------------------------------------------------------
573
574 'createNewRecord': function () {
575 return Clipperz.Async.callbacks("User.createNewRecord", [
576 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
577 MochiKit.Base.methodcaller('createNewRecord')
578 ], {trace:false});
579 },
580
581 //=========================================================================
582
583 'getDirectLogins': function() {
584 var deferredResult;
585
586 deferredResult = new Clipperz.Async.Deferred("User.getDirectLogins", {trace:false});
587 deferredResult.addMethod(this, 'getRecords');
588 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.compose(MochiKit.Base.values, MochiKit.Base.methodcaller('directLogins')));
589 deferredResult.addCallback(MochiKit.Base.flattenArray);
590 deferredResult.callback();
591
592 return deferredResult;
593 },
594
595 //=========================================================================
596
597 'getOneTimePasswords': function () {
598 return Clipperz.Async.callbacks("User.getOneTimePasswords", [
599 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
600 MochiKit.Base.methodcaller('oneTimePasswords'),
601 MochiKit.Base.values
602 ], {trace:false});
603 },
604
605 //=========================================================================
606
607 'invokeMethodNamedOnHeader': function (aMethodName, aValue) {
608 return Clipperz.Async.collectResults("User.invokeMethodNamedOnHeader [" + aMethodName + "]", {
609 'recordIndex': [
610 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
611 MochiKit.Base.methodcaller(aMethodName, aValue)
612 ],
613 'preferences': [
614 MochiKit.Base.method(this, 'getHeaderIndex', 'preferences'),
615 MochiKit.Base.methodcaller(aMethodName, aValue)
616 ],
617 'oneTimePasswords': [
618 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
619 MochiKit.Base.methodcaller(aMethodName, aValue)
620 ]//,
621 // 'statistics': [
622 // MochiKit.Base.method(this, 'getStatistics'),
623 // MochiKit.Base.methodcaller(aMethodName, aValue)
624 // ]
625 }, {trace:false})();
626 },
627
628 //-------------------------------------------------------------------------
629
630 'invokeMethodNamedOnRecords': function (aMethodName, aValue) {
631 return Clipperz.Async.callbacks("User.invokeMethodNamedOnRecords[" + aMethodName + "]", [
632 MochiKit.Base.method(this, 'getRecords'),
633 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller(aMethodName, aValue)),
634 Clipperz.Async.collectAll
635 ], {trace:false});
636 },
637
638 //=========================================================================
639
640 'hasPendingChanges': function () {
641 vardeferredResult;
642
643 deferredResult = new Clipperz.Async.Deferred("User.hasPendingChanges", {trace:false});
644 deferredResult.collectResults({
645 'header': [
646 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasPendingChanges'),
647 MochiKit.Base.values
648 ],
649 'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasPendingChanges')
650 });
651 deferredResult.addCallback(Clipperz.Async.or);
652 deferredResult.callback();
653 // recordsIndex = legacyHeader;
654 // preferences = legacyHeader;
655 // oneTimePasswords= legacyHeader;
656
657 return deferredResult;
658 },
659
660 //=========================================================================
661
662 'commitTransientState': function () {
663 return Clipperz.Async.callbacks("User.commitTransientState", [
664 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'commitTransientState'),
665 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'commitTransientState'),
666
667 MochiKit.Base.method(this, 'transientState'),
668 MochiKit.Base.itemgetter('lock'),
669 MochiKit.Base.method(this, 'setServerLockValue'),
670 MochiKit.Base.method(this, 'resetTransientState', true)
671 ], {trace:false});
672 },
673
674 //-------------------------------------------------------------------------
675
676 'revertChanges': function () {
677 return Clipperz.Async.callbacks("User.revertChanges", [
678 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'revertChanges'),
679 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'revertChanges'),
680 MochiKit.Base.method(this, 'resetTransientState', false)
681 ], {trace:false});
682 },
683
684 //=========================================================================
685
686 'deleteAllCleanTextData': function () {
687 return Clipperz.Async.callbacks("User.deleteAllCleanTextData", [
688 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'deleteAllCleanTextData'),
689 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'deleteAllCleanTextData'),
690
691 MochiKit.Base.method(this.data(), 'removeAllData'),
692 MochiKit.Base.method(this, 'resetTransientState', false)
693 ], {trace:false});
694 },
695
696 //-------------------------------------------------------------------------
697
698 'hasAnyCleanTextData': function () {
699 vardeferredResult;
700
701 deferredResult = new Clipperz.Async.Deferred("User.hasAnyCleanTextData", {trace:false});
702 deferredResult.collectResults({
703 'header':[
704 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasAnyCleanTextData'),
705 MochiKit.Base.values
706 ],
707 'records':MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasAnyCleanTextData'),
708 'data': MochiKit.Base.bind(function () {
709 return MochiKit.Async.succeed(! this.data().isEmpty());
710 }, this),
711 'transientState':MochiKit.Base.bind(function () {
712 return MochiKit.Async.succeed(MochiKit.Base.keys(this.transientState()).length != 0);
713 }, this)
714 });
715 deferredResult.addCallback(Clipperz.Async.or);
716 deferredResult.callback();
717
718 return deferredResult;
719 },
720
721 //=========================================================================
722
723 'prepareRemoteDataWithKey': function (aKey /*, aCurrentKey*/) {
724 var deferredResult;
725 varresult;
726
727 result = {};
728 deferredResult = new Clipperz.Async.Deferred("User.prepareRemoteDataWithKey", {trace:false});
729 deferredResult.addMethod(this, 'invokeMethodNamedOnHeader', 'prepareRemoteDataWithKey', aKey /*, aCurrentKey*/);
730 deferredResult.addCallback(MochiKit.Base.bind(function (aResult, someHeaderPackedData) {
731 var header;
732
733 header = {};
734 header['records'] = someHeaderPackedData['recordIndex']['records'];
735 header['directLogins'] = someHeaderPackedData['recordIndex']['directLogins'];
736 header['preferences'] = {'data': someHeaderPackedData['preferences']['data']}; // this._serverData['header']['preferences']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['preferences']; //???????????
737 header['oneTimePasswords'] = {'data': someHeaderPackedData['oneTimePasswords']['data']}; // this._serverData['header']['oneTimePasswords']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['oneTimePasswords']; //???????????
738 header['version'] = '0.1';
739
740 aResult['header'] = Clipperz.Base.serializeJSON(header);
741 aResult['statistics'] = this._serverData['statistics']; //"someHeaderPackedData['statistics']['data']";
742
743 return aResult;
744 }, this), result);
745 deferredResult.addCallback(Clipperz.Async.setItem, result, 'version', Clipperz.PM.Crypto.encryptingFunctions.currentVersion);
746 deferredResult.addCallback(Clipperz.Async.setItem, result, 'lock', this.serverLockValue());
747 deferredResult.callback();
748
749 return deferredResult;
750 },
751
752 //=========================================================================
753
754 'saveChanges': function () {
755 vardeferredResult;
756 var messageParameters;
757
758 messageParameters = {};
759
760 deferredResult = new Clipperz.Async.Deferred("User.saveChangaes", {trace:false});
761
762 deferredResult.addMethod(this, 'getHeaderIndex', 'recordsIndex');
763 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
764 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'records');
765 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
766
767 deferredResult.addMethod(this, 'getPassphrase');
768 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
769 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'user');
770 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
771
772 deferredResult.addCallback(MochiKit.Async.succeed, messageParameters);
773 deferredResult.addMethod(this.connection(), 'message', 'saveChanges');
774 deferredResult.addCallback(MochiKit.Base.update, this.transientState())
775 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
776
777 deferredResult.addMethod(this, 'commitTransientState');
778 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
779 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved');
780
781 deferredResult.addErrbackPass(MochiKit.Base.method(this, 'revertChanges'));
782 deferredResult.addErrbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'failureWhileSavingUserData');
783
784 deferredResult.callback();
785
786 return deferredResult;
787 },
788
789 //=========================================================================
790 __syntaxFix__: "syntax fix"
791});
792
793//-----------------------------------------------------------------------------
794
795Clipperz.PM.DataModel.User.registerNewAccount = function (anUsername, aPassphraseFunction) {
796 vardeferredResult;
797 var user;
798
799 user = new Clipperz.PM.DataModel.User({'username':anUsername, 'getPassphraseFunction':aPassphraseFunction});
800
801 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.User.registerNewAccount", {trace:false});
802 deferredResult.addMethod(user, 'registerAsNewAccount');
803 deferredResult.addMethod(user, 'login');
804 deferredResult.addCallback(MochiKit.Async.succeed, user);
805 deferredResult.callback();
806
807 return deferredResult;
808}
809
810//-----------------------------------------------------------------------------
811
812Clipperz.PM.DataModel.User.exception = {
813 LoginFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.LoginFailed"),
814 CredentialUpgradeFailed:new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed")
815};
816
817//-----------------------------------------------------------------------------
diff --git a/frontend/gamma/js/Clipperz/PM/Date.js b/frontend/gamma/js/Clipperz/PM/Date.js
new file mode 100644
index 0000000..a131357
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Date.js
@@ -0,0 +1,201 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; }
32
33Clipperz.PM.Date.VERSION = "0.1";
34Clipperz.PM.Date.NAME = "Clipperz.PM.Date";
35
36MochiKit.Base.update(Clipperz.PM.Date, {
37
38 '__repr__': function () {
39 return "[" + this.NAME + " " + this.VERSION + "]";
40 },
41
42 //-------------------------------------------------------------------------
43
44 'toString': function () {
45 return this.__repr__();
46 },
47
48 //-------------------------------------------------------------------------
49
50 'locale': function() {
51 return {
52 'amDesignation':Clipperz.PM.Strings.getValue('calendarStrings.amDesignation'),
53 'pmDesignation':Clipperz.PM.Strings.getValue('calendarStrings.pmDesignation'),
54 'days': Clipperz.PM.Strings.getValue('calendarStrings.days'),
55 'shortDays': Clipperz.PM.Strings.getValue('calendarStrings.shortDays'),
56 'shortMonths': Clipperz.PM.Strings.getValue('calendarStrings.shortMonths'),
57 'months': Clipperz.PM.Strings.getValue('calendarStrings.months')
58 }
59 },
60
61 //=========================================================================
62/*
63 'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) {
64 return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
65 },
66
67 'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) {
68 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
69 },
70
71 //=========================================================================
72
73 'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) {
74 return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
75 },
76
77 'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) {
78 return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
79 },
80*/
81 //=========================================================================
82
83 'formatWithTemplate': function (aTemplate, aDate) {
84 return Clipperz.PM.Date.formatDateWithTemplate(aDate, aTemplate);
85 },
86
87 'formatDateWithTemplate': function(aDate, aTemplate) {
88 var result;
89
90 if (aDate == null) {
91 result = ""
92 } else {
93 result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
94 };
95
96 return result;
97 },
98
99 'parseDateWithTemplate': function(aValue, aTemplate) {
100 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale());
101 },
102
103 //=========================================================================
104
105 'formatDateWithUTCFormat': function(aDate) {
106 return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale());
107 },
108
109 'parseDateWithUTCFormat': function(aValue) {
110 var result;
111
112 if (aValue == null) {
113 result = null;
114 } else {
115 result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale());
116 }
117
118 return result;
119 },
120
121 //=========================================================================
122
123 'getElapsedTimeDescription': function(aDate) {
124 var result;
125
126 result = ""
127
128 if (aDate != null) {
129 var now;
130 var elapsedTime;
131
132 var millisencondsInAMinute;
133 var millisencondsInAnHour;
134 var millisencondsInADay;
135 var millisencondsInAWeek;
136 var millisencondsInAMonth;
137
138 now = new Date();
139 elapsedTime = now.getTime() - aDate.getTime();
140
141 millisencondsInAMinute = 60 * 1000;
142 millisencondsInAnHour = millisencondsInAMinute * 60;
143 millisencondsInADay = millisencondsInAnHour * 24;
144 millisencondsInAWeek = millisencondsInADay * 7;
145 millisencondsInAMonth = millisencondsInAWeek * 5;
146
147 if ((elapsedTime / millisencondsInAMonth) > 1) {
148 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_MONTH_AGO');
149 } else if ((elapsedTime / millisencondsInAWeek) > 1) {
150 var elapsedWeeks;
151
152 elapsedWeeks = Math.floor((elapsedTime / millisencondsInAWeek));
153 if (elapsedWeeks == 1) {
154 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_WEEK_AGO');
155 } else {
156 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_*_WEEKS_AGO').replace(/__elapsed__/, elapsedWeeks);
157 }
158 } else if ((elapsedTime / millisencondsInADay) > 1) {
159 var elapsedDays;
160
161 elapsedDays = Math.floor((elapsedTime / millisencondsInADay));
162 if (elapsedDays == 1) {
163 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.YESTERDAY');
164 } else {
165 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_DAYS_AGO').replace(/__elapsed__/, elapsedDays);
166 }
167 } else if ((elapsedTime / millisencondsInAnHour) > 1) {
168 var elapsedHours;
169
170 elapsedHours = Math.floor((elapsedTime / millisencondsInAnHour));
171 if (elapsedHours == 1) {
172 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_AN_HOUR_AGO');
173 } else {
174 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_HOURS_AGO').replace(/__elapsed__/, elapsedHours);
175 }
176 } else {
177 var elapsed10Minutes;
178
179 elapsed10Minutes = (Math.floor((elapsedTime / millisencondsInAMinute) / 10)) * 10;
180 if (elapsed10Minutes == 0) {
181 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.JUST_A_FEW_MINUTES_AGO');
182 } else {
183 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_*_MINUTES_AGO').replace(/__elapsed__/, elapsed10Minutes+"");
184 }
185 }
186 }
187
188 return result;
189 },
190
191 //-------------------------------------------------------------------------
192
193 'parse': function (aValue) {
194 return Clipperz.PM.Date.parseDateWithUTCFormat(aValue);
195 },
196
197 //-------------------------------------------------------------------------
198 __syntaxFix__: "syntax fix"
199
200});
201
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy.js b/frontend/gamma/js/Clipperz/PM/Proxy.js
new file mode 100644
index 0000000..d90bcb7
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Proxy.js
@@ -0,0 +1,172 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31
32//=============================================================================
33
34Clipperz.PM.Proxy = function(args) {
35 args = args || {};
36
37 this._shouldPayTolls = args.shouldPayTolls || false;
38
39 this._tolls = {
40 'CONNECT':[],
41 'REGISTER':[],
42 'MESSAGE':[]
43 };
44
45 if (args.isDefault === true) {
46 Clipperz.PM.Proxy.defaultProxy = this;
47 }
48
49 return this;
50}
51
52Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, {
53
54 'toString': function() {
55 return "Clipperz.PM.Proxy";
56 },
57
58 //=========================================================================
59
60 'shouldPayTolls': function() {
61 return this._shouldPayTolls;
62 },
63
64 //-------------------------------------------------------------------------
65
66 'tolls': function() {
67 return this._tolls;
68 },
69
70 //-------------------------------------------------------------------------
71
72 'payToll': function(aRequestType, someParameters) {
73 vardeferredResult;
74
75//console.log(">>> Proxy.payToll", aRequestType, someParameters);
76 if (this.shouldPayTolls()) {
77 deferredResult = new Clipperz.Async.Deferred("Proxy.payToll", {trace:false});
78
79 if (this.tolls()[aRequestType].length == 0) {
80 deferredResult.addMethod(this, 'sendMessage', 'knock', {requestType:aRequestType});
81 deferredResult.addMethod(this, 'setTollCallback');
82 }
83 deferredResult.addMethod(this.tolls()[aRequestType], 'pop');
84 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay'));
85 deferredResult.addCallback(function(aToll) {
86 var result;
87
88 result = {
89 parameters: someParameters,
90 toll: aToll
91 }
92
93 return result;
94 });
95
96 deferredResult.callback();
97 } else {
98 deferredResult = MochiKit.Async.succeed({parameters:someParameters});
99 }
100//console.log("<<< Proxy.payToll");
101
102 return deferredResult;
103 },
104
105 //-------------------------------------------------------------------------
106
107 'addToll': function(aToll) {
108//console.log(">>> Proxy.addToll", aToll);
109 this.tolls()[aToll.requestType()].push(aToll);
110//console.log("<<< Proxy.addToll");
111 },
112
113 //=========================================================================
114
115 'setTollCallback': function(someParameters) {
116//console.log(">>> Proxy.setTollCallback", someParameters);
117 if (typeof(someParameters['toll']) != 'undefined') {
118//console.log("added a new toll", someParameters['toll']);
119 this.addToll(new Clipperz.PM.Toll(someParameters['toll']));
120 }
121//console.log("<<< Proxy.setTallCallback", someParameters['result']);
122 return someParameters['result'];
123 },
124
125 //=========================================================================
126
127 'registration': function (someParameters) {
128 return this.processMessage('registration', someParameters, 'REGISTER');
129 },
130
131 'handshake': function (someParameters) {
132 return this.processMessage('handshake', someParameters, 'CONNECT');
133 },
134
135 'message': function (someParameters) {
136 return this.processMessage('message', someParameters, 'MESSAGE');
137 },
138
139 'logout': function (someParameters) {
140 return this.processMessage('logout', someParameters, 'MESSAGE');
141 },
142
143 //=========================================================================
144
145 'processMessage': function (aFunctionName, someParameters, aRequestType) {
146 vardeferredResult;
147
148 deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false});
149 deferredResult.addMethod(this, 'payToll', aRequestType);
150 deferredResult.addMethod(this, 'sendMessage', aFunctionName);
151 deferredResult.addMethod(this, 'setTollCallback');
152 deferredResult.callback(someParameters);
153
154 return deferredResult;
155 },
156
157 //=========================================================================
158
159 'sendMessage': function () {
160 throw Clipperz.Base.exception.AbstractMethod;
161 },
162
163 //=========================================================================
164
165 'isReadOnly': function () {
166 return false;
167 },
168
169 //=========================================================================
170 __syntaxFix__: "syntax fix"
171
172});
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
new file mode 100755
index 0000000..65b46de
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
@@ -0,0 +1,94 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31
32//=============================================================================
33
34Clipperz.PM.Proxy.JSON = function(args) {
35 Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args);
36
37 this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter');
38
39 return this;
40}
41
42Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
43
44 'toString': function() {
45 return "Clipperz.PM.Proxy.JSON";
46 },
47
48 //=========================================================================
49
50 'url': function () {
51 return this._url;
52 },
53
54 //=========================================================================
55
56 'sendMessage': function(aFunctionName, someParameters) {
57 vardeferredResult;
58 var parameters;
59
60 parameters = {
61 method: aFunctionName,
62 // version: someParameters['version'],
63 // message: someParameters['message'],
64 parameters: Clipperz.Base.serializeJSON(someParameters)
65 };
66
67 deferredResult = new Clipperz.Async.Deferred("Proxy.JSON.sendMessage", {trace:false});
68 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent');
69 deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), {
70 method:'POST',
71 sendContent:MochiKit.Base.queryString(parameters),
72 headers:{"Content-Type":"application/x-www-form-urlencoded"}
73 });
74 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived');
75 // deferredResult.addCallback(MochiKit.Async.evalJSONRequest);
76 deferredResult.addCallback(MochiKit.Base.itemgetter('responseText'));
77 deferredResult.addCallback(Clipperz.Base.evalJSON);
78 deferredResult.addCallback(function (someValues) {
79 if (someValues['result'] == 'EXCEPTION') {
80 throw someValues['message'];
81 }
82
83 return someValues;
84 })
85 // return MochiKit.Base.evalJSON(req.responseText);
86 deferredResult.callback();
87
88 return deferredResult;
89 },
90
91 //=========================================================================
92 __syntaxFix__: "syntax fix"
93
94});
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
new file mode 100644
index 0000000..de8e7f6
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
@@ -0,0 +1,811 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!";
31}
32
33//=============================================================================
34
35Clipperz.PM.Proxy.Offline.DataStore = function(args) {
36 args = args || {};
37
38 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
39 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
40 this._shouldPayTolls = args.shouldPayTolls || false;
41
42 this._tolls = {};
43 this._currentStaticConnection = null;
44
45 return this;
46}
47
48Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
49
50 //-------------------------------------------------------------------------
51
52 'isReadOnly': function () {
53 return this._isReadOnly;
54 },
55
56 //-------------------------------------------------------------------------
57
58 'shouldPayTolls': function() {
59 return this._shouldPayTolls;
60 },
61
62 //-------------------------------------------------------------------------
63
64 'data': function () {
65 return this._data;
66 },
67
68 //-------------------------------------------------------------------------
69
70 'tolls': function () {
71 return this._tolls;
72 },
73
74 //=========================================================================
75
76 'resetData': function() {
77 this._data = {
78 'users': {
79 'catchAllUser': {
80 __masterkey_test_value__: 'masterkey',
81 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
82 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
83 }
84 }
85 };
86 },
87
88 //-------------------------------------------------------------------------
89
90 'setupWithEncryptedData': function(someData) {
91 this._data = Clipperz.Base.deepClone(someData);
92 },
93
94 //-------------------------------------------------------------------------
95
96 'setupWithData': function(someData) {
97 var deferredResult;
98 var resultData;
99 var i, c;
100
101//Clipperz.log(">>> Proxy.Test.setupWithData");
102 resultData = this._data;
103
104 deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false});
105 c = someData['users'].length;
106
107 for (i=0; i<c; i++) {
108 varnewConnection;
109 varrecordConfiguration;
110
111 deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]);
112 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) {
113//console.log("SERIALIZED USER", aUserSerializationContext);
114 resultData['users'][aUserSerializationContext['credentials']['C']] = {
115 's': aUserSerializationContext['credentials']['s'],
116 'v': aUserSerializationContext['credentials']['v'],
117 'version': aUserSerializationContext['data']['connectionVersion'],
118 'userDetails': aUserSerializationContext['encryptedData']['user']['header'],
119 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'],
120 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'],
121 'lock': aUserSerializationContext['encryptedData']['user']['lock'],
122 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records'])
123 }
124 }, this));
125 }
126
127 deferredResult.addCallback(MochiKit.Base.bind(function() {
128//console.log("this._data", resultData);
129 this._data = resultData;
130 }, this));
131
132 deferredResult.callback();
133//Clipperz.log("<<< Proxy.Test.setupWithData");
134
135 return deferredResult;
136 },
137
138 //=========================================================================
139
140 'getTollForRequestType': function (aRequestType) {
141 varresult;
142 vartargetValue;
143 var cost;
144
145 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
146 switch (aRequestType) {
147 case 'REGISTER':
148 cost = 5;
149 break;
150 case 'CONNECT':
151 cost = 5;
152 break;
153 case 'MESSAGE':
154 cost = 2;
155 break;
156 }
157
158 result = {
159 requestType: aRequestType,
160 targetValue: targetValue,
161 cost: cost
162 }
163
164 if (this.shouldPayTolls()) {
165 this.tolls()[targetValue] = result;
166 }
167
168 return result;
169 },
170
171 //-------------------------------------------------------------------------
172
173 'checkToll': function (aFunctionName, someParameters) {
174 if (this.shouldPayTolls()) {
175 var localToll;
176 vartollParameters;
177
178 tollParameters = someParameters['toll'];
179 localToll = this.tolls()[tollParameters['targetValue']];
180
181 if (localToll != null) {
182 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) {
183 throw "Toll value too low.";
184 };
185 } else {
186 throw "Missing toll";
187 }
188 }
189 },
190
191 //=========================================================================
192
193 'currentStaticConnection': function () {
194 if (this._currentStaticConnection == null) {
195 this._currentStaticConnection = {};
196 }
197
198 return this._currentStaticConnection;
199 },
200
201 //-------------------------------------------------------------------------
202
203 'getConnectionForRequest': function (aFunctionName, someParameters) {
204 varresult;
205
206 if (this.shouldPayTolls()) {
207 if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) {
208 result = this.tolls()[someParameters['toll']['targetValue']]['connection'];
209 if (typeof(result) == 'undefined') {
210 result = {};
211 }
212 } else {
213 result = {};
214 }
215 } else {
216 result = this.currentStaticConnection();
217 }
218
219 return result;
220 },
221
222 //-------------------------------------------------------------------------
223
224 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) {
225 if (this.shouldPayTolls()) {
226 if ((typeof(aResponse['toll']) != 'undefined')
227 &&(typeof(aResponse['toll']['targetValue']) != 'undefined')
228 &&(typeof(this.tolls()[aResponse['toll']['targetValue']]) != 'undefined')
229 ) {
230 this.tolls()[aResponse['toll']['targetValue']]['connection'] = aConnection;
231 }
232 }
233 },
234
235 //=========================================================================
236
237 'processMessage': function (aFunctionName, someParameters) {
238 var result;
239 varconnection;
240
241 connection = this.getConnectionForRequest(aFunctionName, someParameters);
242
243 switch(aFunctionName) {
244 case 'knock':
245 result = this._knock(connection, someParameters);
246 break;
247 case 'registration':
248 this.checkToll(aFunctionName, someParameters);
249 result = this._registration(connection, someParameters.parameters);
250 break;
251 case 'handshake':
252 this.checkToll(aFunctionName, someParameters);
253 result = this._handshake(connection, someParameters.parameters);
254 break;
255 case 'message':
256 this.checkToll(aFunctionName, someParameters);
257 result = this._message(connection, someParameters.parameters);
258 break;
259 case 'logout':
260 this._currentStaticConnection = null;
261 result = this._logout(connection, someParameters.parameters);
262 break;
263 }
264
265 this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result);
266
267 return MochiKit.Async.succeed(result);
268 },
269
270 //=========================================================================
271
272 '_knock': function(aConnection, someParameters) {
273 var result;
274
275 result = {
276 toll: this.getTollForRequestType(someParameters['requestType'])
277 }
278
279 return result;
280 },
281
282 //-------------------------------------------------------------------------
283
284 '_registration': function(aConnection, someParameters) {
285 if (this.isReadOnly() == false) {
286 if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') {
287 this.data()['users'][someParameters['credentials']['C']] = {
288 's': someParameters['credentials']['s'],
289 'v': someParameters['credentials']['v'],
290 'version':someParameters['credentials']['version'],
291 'lock': Clipperz.Crypto.Base.generateRandomSeed(),
292 'userDetails': someParameters['user']['header'],
293 'statistics': someParameters['user']['statistics'],
294 'userDetailsVersion':someParameters['user']['version'],
295 'records':{}
296 }
297 } else {
298 throw "user already exists";
299 }
300 } else {
301 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
302 }
303
304 result = {
305 result: {
306 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'],
307 'result':'done'
308 },
309 toll: this.getTollForRequestType('CONNECT')
310 }
311
312 return result;
313 },
314
315 //-------------------------------------------------------------------------
316
317 '_handshake': function(aConnection, someParameters) {
318 var result;
319 varnextTollRequestType;
320
321 result = {};
322 if (someParameters.message == "connect") {
323 var userData;
324 var randomBytes;
325 var v;
326
327 userData = this.data()['users'][someParameters.parameters.C];
328
329 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
330 aConnection['userData'] = userData;
331 aConnection['C'] = someParameters.parameters.C;
332 } else {
333 aConnection['userData'] = this.data()['users']['catchAllUser'];
334 }
335
336 randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
337 aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16);
338 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
339 aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()));
340
341 aConnection['A'] = someParameters.parameters.A;
342
343 result['s'] = aConnection['userData']['s'];
344 result['B'] = aConnection['B'].asString(16);
345
346 nextTollRequestType = 'CONNECT';
347 } else if (someParameters.message == "credentialCheck") {
348 var v, u, S, A, K, M1;
349
350 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
351 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16);
352 A = new Clipperz.Crypto.BigInt(aConnection['A'], 16);
353 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n());
354
355 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2);
356
357 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2);
358 if (someParameters.parameters.M1 == M1) {
359 var M2;
360
361 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2);
362 result['M2'] = M2;
363 } else {
364 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
365 }
366
367 nextTollRequestType = 'MESSAGE';
368 } else if (someParameters.message == "oneTimePassword") {
369 var otpData;
370
371 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
372
373 try {
374 if (typeof(otpData) != 'undefined') {
375 if (otpData['status'] == 'ACTIVE') {
376 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
377 result = {
378 'data': otpData['data'],
379 'version':otpData['version']
380 }
381
382 otpData['status'] = 'REQUESTED';
383 } else {
384 otpData['status'] = 'DISABLED';
385 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
386 }
387 } else {
388 throw "The requested One Time Password was not active";
389 }
390 } else {
391 throw "The requested One Time Password has not been found"
392 }
393 } catch (exception) {
394 result = {
395 'data': Clipperz.PM.Crypto.randomKey(),
396 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion
397 }
398 }
399 nextTollRequestType = 'CONNECT';
400 } else {
401 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
402 }
403
404 result = {
405 result: result,
406 toll: this.getTollForRequestType(nextTollRequestType)
407 }
408
409 return result;
410 },
411
412 //-------------------------------------------------------------------------
413
414 '_message': function(aConnection, someParameters) {
415 var result;
416
417 result = {};
418
419 //=====================================================================
420 //
421 // R E A D - O N L Y M e t h o d s
422 //
423 //=====================================================================
424 if (someParameters.message == 'getUserDetails') {
425 var recordsStats;
426 var recordReference;
427
428 recordsStats = {};
429 for (recordReference in aConnection['userData']['records']) {
430 recordsStats[recordReference] = {
431 'updateDate': aConnection['userData']['records'][recordReference]['updateDate']
432 }
433 }
434
435 result['header'] = this.userDetails(aConnection);
436 result['statistics'] = this.statistics(aConnection);
437 result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords'];
438 result['version'] = aConnection['userData']['userDetailsVersion'];
439 result['recordsStats'] = recordsStats;
440
441 if (this.isReadOnly() == false) {
442 varlock;
443
444 if (typeof(aConnection['userData']['lock']) == 'undefined') {
445 aConnection['userData']['lock'] = "<<LOCK>>";
446 }
447
448 result['lock'] = aConnection['userData']['lock'];
449 }
450
451 //=====================================================================
452 } else if (someParameters.message == 'getRecordDetail') {
453/*
454 varrecordData;
455 var currentVersionData;
456
457 recordData = this.userData()['records'][someParameters['parameters']['reference']];
458 result['reference'] = someParameters['parameters']['reference'];
459 result['data'] = recordData['data'];
460 result['version'] = recordData['version'];
461 result['creationData'] = recordData['creationDate'];
462 result['updateDate'] = recordData['updateDate'];
463 result['accessDate'] = recordData['accessDate'];
464
465 currentVersionData = recordData['versions'][recordData['currentVersion']];
466
467 result['currentVersion'] = {};
468 result['currentVersion']['reference'] = recordData['currentVersion'];
469 result['currentVersion']['version'] = currentVersionData['version'];
470 result['currentVersion']['header'] = currentVersionData['header'];
471 result['currentVersion']['data'] = currentVersionData['data'];
472 result['currentVersion']['creationData'] = currentVersionData['creationDate'];
473 result['currentVersion']['updateDate'] = currentVersionData['updateDate'];
474 result['currentVersion']['accessDate'] = currentVersionData['accessDate'];
475 if (typeof(currentVersionData['previousVersion']) != 'undefined') {
476 result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey'];
477 result['currentVersion']['previousVersion'] = currentVersionData['previousVersion'];
478 }
479*/
480 MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]);
481 result['reference'] = someParameters['parameters']['reference'];
482
483 //=====================================================================
484 //
485 // R E A D - W R I T E M e t h o d s
486 //
487 //=====================================================================
488 } else if (someParameters.message == 'upgradeUserCredentials') {
489 if (this.isReadOnly() == false) {
490 var parameters;
491 var credentials;
492
493 parameters = someParameters['parameters'];
494 credentials = parameters['credentials'];
495
496 if ((credentials['C'] == null)
497 ||(credentials['s'] == null)
498 ||(credentials['v'] == null)
499 ||(credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion)
500 ) {
501 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
502 } else {
503 varoldCValue;
504 oldCValue = aConnection['C'];
505
506 this.data()['users'][credentials['C']] = aConnection['userData'];
507 aConnection['C'] = credentials['C'];
508
509 aConnection['userData']['s'] = credentials['s'];
510 aConnection['userData']['v'] = credentials['v'];
511 aConnection['userData']['version'] = credentials['version'];
512
513 aConnection['userData']['userDetails'] = parameters['user']['header'];
514 aConnection['userData']['userDetailsVersion'] = parameters['user']['version'];
515 aConnection['userData']['statistics'] = parameters['user']['statistics'];
516
517 aConnection['userData']['lock'] = parameters['user']['lock'];
518
519 delete this.data()['users'][oldCValue];
520
521 result = {result:"done", parameters:parameters};
522 }
523 } else {
524 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
525 }
526 //=====================================================================
527 /* } else if (someParameters.message == 'updateData') {
528 if (this.isReadOnly() == false) {
529 var i, c;
530
531//console.log("###===============================================================");
532//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
533//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
534 if (this.userData()['lock']!= someParameters['parameters']['user']['lock']) {
535 throw "the lock attribute is not processed correctly"
536 }
537
538 this.userData()['userDetails'] = someParameters['parameters']['user']['header'];
539 this.userData()['statistics'] = someParameters['parameters']['user']['statistics'];
540 this.userData()['userDetailsVersions']= someParameters['parameters']['user']['version'];
541
542 c = someParameters['parameters']['records'].length;
543 for (i=0; i<c; i++) {
544 var currentRecord;
545 var currentRecordData;
546
547 currentRecordData = someParameters['parameters']['records'][i];
548 currentRecord = this.userData()['records'][currentRecordData['record']['reference']];
549
550 if (currentRecord == null) {
551 }
552
553 currentRecord['data'] = currentRecordData['record']['data'];
554 currentRecord['version'] = currentRecordData['record']['version'];
555 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
556
557 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
558 'data': currentRecordData['currentRecordVersion']['data'],
559 'version': currentRecordData['currentRecordVersion']['version'],
560 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
561 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey']
562 }
563 }
564
565 this.userData()['lock'] = Clipperz.PM.Crypto.randomKey();
566 result['lock'] = this.userData()['lock'];
567 result['result'] = 'done';
568//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
569 } else {
570 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
571 }
572 */ //=====================================================================
573 } else if (someParameters.message == 'saveChanges') {
574 if (this.isReadOnly() == false) {
575 var i, c;
576
577//console.log("###===============================================================");
578//console.log("###>>>", someParameters);
579//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
580//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
581//console.log("###===============================================================");
582//console.log("--- userData.lock ", this.userData()['lock']);
583//console.log("--- parameters.lock", someParameters['parameters']['user']['lock']);
584 if (aConnection['userData']['lock']!= someParameters['parameters']['user']['lock']) {
585 throw "the lock attribute is not processed correctly"
586 }
587
588 aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header'];
589 aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics'];
590 aConnection['userData']['userDetailsVersions']= someParameters['parameters']['user']['version'];
591
592 c = someParameters['parameters']['records']['updated'].length;
593 for (i=0; i<c; i++) {
594 var currentRecord;
595 var currentRecordData;
596
597 currentRecordData = someParameters['parameters']['records']['updated'][i];
598 currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']];
599
600 if (
601 (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined')
602 &&
603 (typeof(currentRecordData['currentRecordVersion']) == 'undefined')
604 ) {
605//console.log("######## SHIT HAPPENS");
606 throw "Record added without a recordVersion";
607 }
608
609 if (currentRecord == null) {
610 currentRecord = {};
611 currentRecord['versions'] = {};
612 currentRecord['creationDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
613 currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
614
615 aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord;
616 }
617
618 currentRecord['data'] = currentRecordData['record']['data'];
619 currentRecord['version']= currentRecordData['record']['version'];
620 currentRecord['updateDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
621
622 if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') {
623 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
624 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
625 'data': currentRecordData['currentRecordVersion']['data'],
626 'version': currentRecordData['currentRecordVersion']['version'],
627 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
628 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'],
629 'creationDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
630 'updateDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
631 'accessDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
632 }
633 }
634 }
635
636 c = someParameters['parameters']['records']['deleted'].length;
637 for (i=0; i<c; i++) {
638 var currentRecordReference;
639
640 currentRecordReference = someParameters['parameters']['records']['deleted'][i];
641//console.log("DELETING records", currentRecordReference);
642 delete aConnection['userData']['records'][currentRecordReference];
643 }
644
645 aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey();
646 result['lock'] = aConnection['userData']['lock'];
647 result['result'] = 'done';
648//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
649 } else {
650 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
651 }
652
653 //=====================================================================
654 //
655 // U N H A N D L E D M e t h o d
656 //
657 //=====================================================================
658 } else {
659 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message);
660 }
661
662 result = {
663 result: result,
664 toll: this.getTollForRequestType('MESSAGE')
665 }
666
667 // return MochiKit.Async.succeed(result);
668 return result;
669 },
670
671 //-------------------------------------------------------------------------
672
673 '_logout': function(someParameters) {
674 // return MochiKit.Async.succeed({result: 'done'});
675 return {result: 'done'};
676 },
677
678 //=========================================================================
679 //#########################################################################
680
681 'isTestData': function(aConnection) {
682 return (typeof(aConnection['userData']['__masterkey_test_value__']) != 'undefined');
683 },
684
685 'userDetails': function(aConnection) {
686 var result;
687
688 if (this.isTestData(aConnection)) {
689 var serializedHeader;
690 var version;
691
692//MochiKit.Logging.logDebug("### test data");
693 version = aConnection['userData']['userDetailsVersion'];
694 serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']);
695 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader);
696 } else {
697//MochiKit.Logging.logDebug("### NOT test data");
698 result = aConnection['userData']['userDetails'];
699 }
700
701 return result;
702 },
703
704 'statistics': function(aConnection) {
705 var result;
706
707 if (aConnection['userData']['statistics'] != null) {
708 if (this.isTestData(aConnection)) {
709 var serializedStatistics;
710 var version;
711
712 version = aConnection['userData']['userDetailsVersion'];
713 serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']);
714 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics);
715 } else {
716 result = aConnection['userData']['statistics'];
717 }
718 } else {
719 result = null;
720 }
721
722 return result;
723 },
724
725/*
726 'userSerializedEncryptedData': function(someData) {
727 var deferredResult;
728 var deferredContext;
729
730 deferredContext = { 'data': someData };
731
732 deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false});
733 deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) {
734 aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']);
735 return aDeferredContext;
736 }, this));
737 deferredResult.addCallback(function(aDeferredContext) {
738 // return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']);
739 return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
740 });
741 deferredResult.addCallback(function(aUserEncryptedData) {
742 deferredContext['encryptedData'] = aUserEncryptedData;
743 return deferredContext;
744 });
745 deferredResult.addCallback(function(aDeferredContext) {
746 var connection;
747
748 connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]()
749 aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase());
750
751 return aDeferredContext;
752 });
753
754 // deferredResult.addCallback(function(aDeferredContext) {
755//console.log("#-#-#-#-#", aDeferredContext);
756 // return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
757 // }, deferredContext);
758 // deferredResult.addCallback(function(aUserSerializedData) {
759//console.log("USER SERIALIZED DATA", aUserSerializedData);
760 // });
761//
762 // deferredResult.addCallback(MochiKit.Async.succeed, deferredContext);
763 deferredResult.callback(deferredContext);
764
765 return deferredResult;
766 },
767
768 'createUserUsingConfigurationData': function(someData) {
769 var result;
770 var user;
771 var recordLabel;
772
773 user = new Clipperz.PM.DataModel.User();
774 user.initForTests();
775 user.setUsername(someData['username']);
776 user.setPassphrase(someData['passphrase']);
777
778 for (recordLabel in someData['records']) {
779 var recordData;
780 var record;
781 var i, c;
782
783 recordData = someData['records'][recordLabel];
784 record = new Clipperz.PM.DataModel.Record({user:user, label:recordLabel});
785 record.setNotes(recordData['notes']);
786
787 c = recordData['fields'].length;
788 for (i=0; i<c; i++) {
789 var recordField;
790
791 recordField = new Clipperz.PM.DataModel.RecordField();
792 recordField.setLabel(recordData['fields'][i]['name']);
793 recordField.setValue(recordData['fields'][i]['value']);
794 recordField.setType(recordData['fields'][i]['type']);
795 record.addField(recordField);
796 }
797 user.addRecord(record, true);
798 }
799
800 result = user;
801
802 return result;
803 },
804*/
805 //=========================================================================
806 __syntaxFix__: "syntax fix"
807});
808
809Clipperz.PM.Proxy.Offline.DataStore['exception'] = {
810 'ReadOnly': new MochiKit.Base.NamedError("Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly")
811}; \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
new file mode 100644
index 0000000..a15b223
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
@@ -0,0 +1,67 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31
32//=============================================================================
33
34Clipperz.PM.Proxy.Offline = function(args) {
35 args = args || {};
36
37 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args);
38
39 this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args);
40
41 return this;
42}
43
44Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, {
45
46 'toString': function () {
47 return "Clipperz.PM.Proxy.Offline";
48 },
49
50 //-------------------------------------------------------------------------
51
52 'dataStore': function () {
53 return this._dataStore;
54 },
55
56 //-------------------------------------------------------------------------
57
58 'sendMessage': function(aFunctionName, someParameters) {
59 return this.dataStore().processMessage(aFunctionName, someParameters);
60 },
61
62 //-------------------------------------------------------------------------
63
64 __syntaxFix__: "syntax fix"
65
66});
67
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
new file mode 100644
index 0000000..be1c337
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
@@ -0,0 +1,167 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; }
32
33//=============================================================================
34
35Clipperz.PM.Proxy.Test = function(args) {
36 Clipperz.PM.Proxy.Test.superclass.constructor.call(this, args);
37
38 args = args || {};
39
40 this._expectedRequests = (args.shouldCheckExpectedRequests === true) ? [] : null;
41 this._isExpectingRequests = true;
42 this._unexpectedRequests = [];
43
44 this.dataStore().resetData();
45
46 return this;
47}
48
49Clipperz.Base.extend(Clipperz.PM.Proxy.Test, Clipperz.PM.Proxy.Offline, {
50
51 'toString': function() {
52 return "Clipperz.PM.Proxy.Test";
53 },
54
55 //=========================================================================
56
57 'expectedRequests': function () {
58 return this._expectedRequests;
59 },
60
61 //-------------------------------------------------------------------------
62
63 'shouldCheckExpectedRequests': function () {
64 return (this._expectedRequests != null);
65 },
66
67 'setShouldCheckExpectedRequests': function(aValue) {
68 if (aValue) {
69 this._expectedRequests = aValue;
70 } else {
71 this._expectedRequests = null;
72 }
73 },
74
75 //-------------------------------------------------------------------------
76
77 'shouldNotReceiveAnyFurtherRequest': function () {
78 this._isExpectingRequests = false;
79 },
80
81 'mayReceiveMoreRequests': function () {
82 this._isExpectingRequests = true;
83 this.resetUnexpectedRequests();
84 },
85
86 'isExpectingRequests': function () {
87 return this._isExpectingRequests;
88 },
89
90 //-------------------------------------------------------------------------
91
92 'unexpectedRequests': function () {
93 return this._unexpectedRequests;
94 },
95
96 'resetUnexpectedRequests': function () {
97 this._unexpectedRequests = [];
98 },
99
100 //-------------------------------------------------------------------------
101
102 'testExpectedRequestParameters': function (aPath, anActualRequest, anExpectedRequest) {
103 var aKey;
104//console.log(">>> Proxy.testExpectedRequestParameters [" + aPath + "]", anActualRequest, anExpectedRequest);
105 for (aKey in anExpectedRequest) {
106 if (typeof(anActualRequest[aKey]) == 'undefined') {
107 throw "the expected paramter [" + aKey + "] is missing from the actual request";
108 }
109 if (typeof(anExpectedRequest[aKey]) == 'object') {
110 this.testExpectedRequestParameters(aPath + "." + aKey, anActualRequest[aKey], anExpectedRequest[aKey])
111 } else {
112 if (! anExpectedRequest[aKey](anActualRequest[aKey])) {
113 throw "wrong value for paramter [" + aKey + "]; got '" + anActualRequest[aKey] + "'";
114 }
115 }
116 }
117//console.log("<<< Proxy.testExpectedRequestParameters");
118 },
119
120 //-------------------------------------------------------------------------
121
122 'checkRequest': function(aFunctionName, someParameters) {
123 if (this.shouldCheckExpectedRequests()) {
124 var expectedRequest;
125
126//console.log(">>> Proxy.Test.checkRequest - " + aFunctionName, someParameters);
127 expectedRequest = this.expectedRequests().pop();
128//console.log("--- Proxy.Test.checkRequest - expectedRequest", expectedRequest);
129 if (expectedRequest == null) {
130 throw "Proxy.Test.sentMessage: no expected result specified. Got request '" + aFunctionName + "': " + someParameters;
131 }
132
133 try {
134 if (aFunctionName != expectedRequest.functionName) {
135 throw "wrong function name. Got '" + aFunctionName + "', expected '" + expectedRequest.request.functionName + "'";
136 }
137
138 this.testExpectedRequestParameters("parameters", someParameters, expectedRequest.parameters);
139 } catch(exception) {
140//console.log("EXCEPTION: Proxy.Test.sentMessage[" + expectedRequest.name + "]", exception)
141 throw "Proxy.Test.sentMessage[" + expectedRequest.name + "]: " + exception;
142 }
143 }
144//console.log("<<< Proxy.Test.checkRequest");
145 },
146
147 //=========================================================================
148
149 'sendMessage': function(aFunctionName, someParameters) {
150 var result;
151
152 if (this.isExpectingRequests() == false) {
153 // throw Clipperz.PM.Connection.exception.UnexpectedRequest;
154Clipperz.log("UNEXPECTED REQUEST " + aFunctionName /* + ": " + Clipperz.Base.serializeJSON(someParameters) */);
155 this.unexpectedRequests().push({'functionName':aFunctionName, 'someParameters': someParameters});
156 };
157 this.checkRequest(aFunctionName, someParameters);
158 result = Clipperz.PM.Proxy.Test.superclass.sendMessage.call(this, aFunctionName, someParameters);
159
160 return result;
161 },
162
163 //=========================================================================
164 __syntaxFix__: "syntax fix"
165
166});
167
diff --git a/frontend/gamma/js/Clipperz/PM/Strings.js b/frontend/gamma/js/Clipperz/PM/Strings.js
new file mode 100644
index 0000000..43ef21f
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Strings.js
@@ -0,0 +1,295 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
32if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
33
34//-----------------------------------------------------------------------------
35/*
36Clipperz.PM.Strings.standardStrings = {
37 'loginPanelSwitchLanguageSelectOptions':[
38/ *
39 {tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true},
40 {tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true},
41 {tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true},
42 {tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true},
43 {tag:'option', html:"Català", value:'ca-ES', disabled:true},
44 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true},
45 {tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true},
46 {tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true},
47 {tag:'option', html:"Dansk", value:'da-DK', disabled:true},
48 {tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /},
49 {tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /},
50 {tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /},
51 {tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /},
52 {tag:'option', html:"Español", value:'es-ES', disabled:true},
53 {tag:'option', html:"Eesti", value:'et-EE', disabled:true},
54 {tag:'option', html:"Français", value:'fr-FR', disabled:true},
55 {tag:'option', html:"Galego", value:'gl-ES', disabled:true},
56 {tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true},
57 {tag:'option', html:"Íslenska", value:'is-IS', disabled:true},
58 {tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /},
59 {tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true},
60 {tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true},
61 {tag:'option', html:"Latviešu", value:'lv-LV', disabled:true},
62 {tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true},
63 {tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true},
64 {tag:'option', html:"Magyar", value:'hu-HU', disabled:true},
65 {tag:'option', html:"Nederlands", value:'nl-NL', disabled:true},
66 {tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true},
67 {tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true},
68 {tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true},
69 {tag:'option', html:"Polski", value:'pl-PL', disabled:true},
70 {tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /},
71 {tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /},
72 {tag:'option', html:"Românä", value:'ro-RO', disabled:true},
73 {tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true},
74 {tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true},
75 {tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true},
76 {tag:'option', html:"Suomi", value:'fi-FI', disabled:true},
77 {tag:'option', html:"Svenska", value:'sv-SE', disabled:true},
78 {tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true},
79 {tag:'option', html:"Türkçe", value:'tr-TR', disabled:true},
80 {tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true}
81* /
82 {tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'},
83 // {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true},
84 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'},
85 {tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'},
86 {tag:'option', html:"English", value:"en-US"},
87 {tag:'option', html:"French (Français)", value:"fr-FR"},
88 {tag:'option', html:"German (Deutsch)", value:"de-DE", disabled:true, cls:'disabledOption'},
89 {tag:'option', html:"Greek (Ελληνικά)", value:"el-GR", disabled:true, cls:'disabledOption'},
90 {tag:'option', html:"Hebrew (עברית)", value:"he-IL", disabled:true, cls:'disabledOption'},
91 {tag:'option', html:"Italian (Italiano)", value:"it-IT"},
92 {tag:'option', html:"Japanese (日本語)", value:"ja-JP"},
93 {tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'},
94 {tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'},
95 {tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'},
96 {tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'},
97 {tag:'option', html:"Portuguese (Português)", value:"pt-BR"},
98 {tag:'option', html:"Russian (Русский)", value:"ru-RU", disabled:true, cls:'disabledOption'},
99 {tag:'option', html:"Spanish (Español)", value:"es-ES"},
100 {tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'},
101 {tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'},
102 {tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'}
103 ]
104}
105*/
106
107Clipperz.PM.Strings.GeneralSettings = {
108 'defaults': {
109 // 'loginFormAarghThatsBadUrl':"http://www.clipperz.com/support/faq/account_faq",
110 // 'loginFormVerifyTheCodeUrl':"http://www.clipperz.com/learn_more/reviewing_the_code",
111
112 // 'donateHeaderLinkUrl': "http://www.clipperz.com/donations",
113 // 'creditsHeaderLinkUrl': "http://www.clipperz.com/credits",
114 // 'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact",
115 // 'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide",
116 // 'forumHeaderLinkUrl': "http://www.clipperz.com/forum",
117
118 // 'httpAuthBookmarkletConfiguration':{tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" +
119 // "{ \"page\":{\"title\":\"HTTP authentication\"}," + "\n" +
120 // " \"form\":{\"attributes\": {" + "\n" +
121 // " \"action\":\"\"," + "\n" +
122 // " \"type\":\"http_auth\"" + "\n" +
123 // " }, \"inputs\": [" + "\n" +
124 // " {\"type\":\"text\",\"name\":\"url\",\"value\":\"\"}," + "\n" +
125 // " {\"type\":\"text\",\"name\":\"username\",\"value\":\"\"}," + "\n" +
126 // " {\"type\":\"password\",\"name\":\"password\",\"value\":\"\"}" + "\n" +
127 // " ]}, \"version\":\"0.2.3\"}"
128 // },
129
130 'directLoginJumpPageUrl':"",
131 'defaultFaviconUrl': "data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=",
132 'defaultFaviconUrl_IE': "https://www.clipperz.com/images/icons/misc/favicon.ico",
133
134 // 'icons_baseUrl':"https://www.clipperz.com/images/icons",
135
136 // 'passwordGeneratorLowercaseCharset':"abcdefghijklmnopqrstuvwxyz",
137 // 'passwordGeneratorUppercaseCharset':"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
138 // 'passwordGeneratorNumberCharset': "0123456789",
139 // 'passwordGeneratorSymbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
140
141 // 'passwordGenerator': {
142 // 'lowercaseCharset':"abcdefghijklmnopqrstuvwxyz",
143 // 'uppercaseCharset':"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
144 // 'numberCharset':"0123456789",
145 // 'symbolCharset':"!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
146 // },
147
148 '_': ""
149 }
150}
151
152Clipperz.PM.Strings.defaultLanguages = {
153 'default':"en-us",
154
155 // 'de':"de-de",
156 // 'el':"el-gr",
157 // 'he':"he-il",
158 // 'ru':"ru-ru",
159
160 'fr':"fr-fr",
161 'es':"es-es",
162 'zh':"zh-cn",
163 'ja':"ja-jp",
164 'pt':"pt-br",
165 'it':"it-it",
166 'en': "en-us"
167}
168
169Clipperz.PM.Strings.inputTypeToRecordFieldType = {
170 'text': 'TXT',
171 'password': 'PWD',
172 'checkbox': 'CHECK',
173 'radio': 'RADIO',
174 'select': 'SELECT'
175};
176
177//-----------------------------------------------------------------------------
178
179Clipperz.PM.Strings.translateBookmarklet = function (aBookmarkletString) {
180 var result;
181
182 result = aBookmarkletString;
183
184 result = result.replace(/@BOOKMARKLET_NO_EXCEPTION_MESSAGE@/,Clipperz.PM.Strings.getValue('bookmarkletCopy.noExceptionMessage'));
185 result = result.replace(/@BOOKMARKLET_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.exceptionMessage'));
186 result = result.replace(/@BOOKMARKLET_COPY@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.copy'));
187 result = result.replace(/@BOOKMARKLET_SUCCESSFUL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.successfulMessage'));
188 result = result.replace(/@BOOKMARKLET_FAIL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.failMessage'));
189
190 return result;
191}
192
193//-----------------------------------------------------------------------------
194
195Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) {
196 var language;
197 varselectedLanguage;
198
199 language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase();
200 if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') {
201 language = Clipperz.PM.Strings.defaultLanguages[language];
202 }
203
204 if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') {
205 selectedLanguage = language;
206 } else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') {
207 selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)];
208 } else {
209 selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default'];
210 }
211
212 if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) {
213 vartranslations;
214
215 Clipperz.PM.Strings.selectedLanguage = selectedLanguage;
216
217 translations = {};
218 // MochiKit.Base.update(translations, Clipperz.PM.Strings.standardStrings)
219
220 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages['defaults']);
221 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings['defaults']);
222
223 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]);
224 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]);
225
226 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[selectedLanguage]);
227 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]);
228
229 Clipperz.PM.Strings.stringsObjectStore = new Clipperz.KeyValueObjectStore(/*{'name':'String.stringsObjectStore [1]'}*/);
230 Clipperz.PM.Strings.stringsObjectStore.initWithValues(translations);
231
232 if (typeof(bookmarklet) != 'undefined') {
233 Clipperz.PM.Strings.stringsObjectStore.setValue('bookmarklet', Clipperz.PM.Strings.translateBookmarklet(bookmarklet));
234 }
235
236 MochiKit.Signal.signal(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage);
237 }
238}
239
240//-----------------------------------------------------------------------------
241
242Clipperz.PM.Strings.getValue = function (aKeyPath, someKeyValues) {
243 varresult;
244
245 result = Clipperz.PM.Strings.stringsObjectStore.getValue(aKeyPath);
246
247//try {
248 if (typeof(result) == 'string') {
249 if (typeof (someKeyValues) != 'undefined') {
250 varkey;
251
252 for (key in someKeyValues) {
253 result = result.replace( new RegExp(key), someKeyValues[key]);
254 // result.replace(, '');
255 }
256 }
257
258 result = result.replace(new RegExp('\n'), '<br>');
259 }
260//} catch (exception) {
261 //console.log("####", result, aKeyPath, someKeyValues, exception);
262//}
263
264 return result;
265}
266
267Clipperz.PM.Strings.errorDescriptionForException = function (anException) {
268 var result;
269
270 result = Clipperz.PM.Strings.getValue('exceptionsMessages' + '.' + anException.name);
271
272 if (result == null) {
273 result = anException.message;
274 }
275
276 return result;
277},
278
279//-----------------------------------------------------------------------------
280
281Clipperz.PM.Strings.Languages.initSetup = function() {
282 varlanguage;
283 varlanguageParser;
284
285 language = navigator.language || navigator.userLanguage; //en, en-US, .... "de", "nb-no"
286 languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i");
287 if (languageParser.test(window.location.search)) {
288 language = RegExp.$1;
289 }
290
291 Clipperz.PM.Strings.preferredLanguage = language.toLowerCase();
292 Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage);
293}
294
295//-----------------------------------------------------------------------------
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js b/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
new file mode 100644
index 0000000..446e96c
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
@@ -0,0 +1,389 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
32
33Clipperz.PM.Strings.messagePanelConfigurations = {
34
35
36 //-------------------------------------------------------------------------
37 //
38 // Registration - connection
39 //
40 'registration_verify': function() {
41 return {
42 'title': null,
43 'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText']
44 }
45 },
46
47 'registration_sendingCredentials': function() {
48 return {
49 'title': null,
50 'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText']
51 }
52 },
53
54 //-------------------------------------------------------------------------
55 //
56 // One Time Password login message panel
57 //
58
59 'OTP_login_start': function() {
60 return {
61 'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'],
62 'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'],
63 'steps': '+3',
64 'buttons': {}
65 }
66 },
67
68 'OTP_login_loadingOTP': function() {
69 return {
70 'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'],
71 'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText']
72 }
73 },
74
75 'OTP_login_extractingPassphrase': function() {
76 return {
77 'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'],
78 'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText']
79 }
80 },
81
82
83 //-------------------------------------------------------------------------
84 //
85 // Login message panel
86 //
87 'login_start': function() {
88 return {
89 'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'],
90 'text': Clipperz.PM.Strings['loginMessagePanelInitialText'],
91 'steps': '+7',
92 'buttons': {
93 'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel']
94 }
95 }
96 },
97
98 'login_connected': function() {
99 return {
100 'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'],
101 'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'],
102 'buttons': {}
103 }
104 },
105
106 'login_failed':function() {
107 return {
108 'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'],
109 'text': Clipperz.PM.Strings['loginMessagePanelFailureText'],
110 'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel']
111 }
112 },
113
114 //-------------------------------------------------------------------------
115 //
116 // Login message panel - connection
117 //
118 'connection_sendingCredentials': function() {
119 return {
120 'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'],
121 'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText']
122 }
123 },
124
125 'connection_credentialVerification': function() {
126 return {
127 'title': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageTitle'],
128 'text': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageText']
129 }
130 },
131
132 'connection_loggedIn': function() {
133 return {
134 'title': Clipperz.PM.Strings['connectionLoginDoneMessageTitle'],
135 'text': Clipperz.PM.Strings['connectionLoginDoneMessageText']
136 }
137 },
138
139 //-------------------------------------------------------------------------
140 //
141 //Login message panel - user
142 //
143 'connection_upgrading': function() {
144 return {
145 'title': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageTitle'],
146 'text': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageText'],
147 'steps': '+1'
148 }
149 },
150
151 'connection_done': function() {
152 return {
153 'title': Clipperz.PM.Strings['userLoginPanelConnectedMessageTitle'],
154 'text': Clipperz.PM.Strings['userLoginPanelConnectedMessageText']
155 }
156 },
157
158 'connection_tryOlderSchema': function() {
159 return {
160 'title': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageTitle'],
161 'text': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageText'],
162 'steps': '+4'
163 }
164 },
165
166 'connection_loadingUserData': function() {
167 return {
168 'title': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageTitle'],
169 'text': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageText']
170 }
171 },
172
173 'connection_decryptingUserData': function() {
174 return {
175 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageTitle'],
176 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageText'],
177 'steps': '+1'
178 }
179 },
180
181 'connection_decryptingUserStatistics': function() {
182 return {
183 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageTitle'],
184 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageText']
185 }
186 },
187
188 'collectingEntropy': function() {
189 return {
190 'text': Clipperz.PM.Strings['panelCollectingEntryopyMessageText'],
191 'steps': '+1'
192 }
193 },
194
195 //-------------------------------------------------------------------------
196 //
197 // Cards block - delete card panel
198 //
199 'deleteRecord_collectData': function() {
200 return {
201 'title': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageTitle'],
202 'text': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageText']
203 }
204 },
205
206 'deleteRecord_encryptData': function() {
207 return {
208 'title': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageTitle'],
209 'text': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageText']
210 }
211 },
212
213 'deleteRecord_sendingData': function() {
214 return {
215 'title': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageTitle'],
216 'text': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageText']
217 }
218 },
219
220 'deleteRecord_updatingInterface': function() {
221 return {
222 'title': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageTitle'],
223 'text': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageText']
224 }
225 },
226
227
228 //-------------------------------------------------------------------------
229 //
230 //Cards block - save card panel
231 //
232 'saveCard_collectRecordInfo': function() {
233 return {
234 'title': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageTitle'],
235 'text': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageText']
236 }
237 },
238
239 'saveCard_encryptUserData': function() {
240 return {
241 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageTitle'],
242 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageText']
243 }
244 },
245
246 'saveCard_encryptRecordData': function() {
247 return {
248 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageTitle'],
249 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageText']
250 }
251 },
252
253 'saveCard_encryptRecordVersions': function() {
254 return {
255 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageTitle'],
256 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageText']
257 }
258 },
259
260 'saveCard_sendingData': function() {
261 return {
262 'title': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageTitle'],
263 'text': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageText']
264 }
265 },
266
267 'saveCard_updatingInterface': function() {
268 return {
269 'title': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageTitle'],
270 'text': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageText']
271 }
272 },
273
274 //-------------------------------------------------------------------------
275 //
276 //Account panel - user preferences
277 //
278 'account_savingPreferences_1': function() {
279 return {
280 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step1'],
281 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step1'],
282 'steps': '+3'
283 }
284 },
285
286 'account_savingPreferences_2': function() {
287 return {
288 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step2'],
289 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step2']
290 }
291 },
292
293
294 //-------------------------------------------------------------------------
295 //
296 //Account panel - change credentials
297 //
298 'changeCredentials_encryptingData': function() {
299 return {
300 'title': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageTitle'],
301 'text': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageText']
302 }
303 },
304
305 'changeCredentials_creatingNewCredentials': function() {
306 return {
307 'title': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageTitle'],
308 'text': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageText']
309 }
310 },
311
312 'changeCredentials_sendingCredentials': function() {
313 return {
314 'title': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle'],
315 'text': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageText']
316 }
317 },
318
319 'changeCredentials_done': function() {
320 return {
321 'title': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageTitle'],
322 'text': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageText']
323 }
324 },
325
326
327 //-------------------------------------------------------------------------
328 //
329 //Account panel - change credentials
330 //
331 'saveOTP_encryptUserData': function() {
332 return {
333 'title': Clipperz.PM.Strings['saveOTP_encryptUserDataTitle'],
334 'text': Clipperz.PM.Strings['saveOTP_encryptUserDataText'],
335 'steps': '+4'
336 }
337 },
338
339 'saveOTP_encryptOTPData': function() {
340 return {
341 'title': Clipperz.PM.Strings['saveOTP_encryptOTPDataTitle'],
342 'text': Clipperz.PM.Strings['saveOTP_encryptOTPDataText']
343 }
344 },
345
346 'saveOTP_sendingData': function() {
347 return {
348 'title': Clipperz.PM.Strings['saveOTP_sendingDataTitle'],
349 'text': Clipperz.PM.Strings['saveOTP_sendingDataText']
350 }
351 },
352
353 'saveOTP_updatingInterface': function() {
354 return {
355 'title': Clipperz.PM.Strings['saveOTP_updatingInterfaceTitle'],
356 'text': Clipperz.PM.Strings['saveOTP_updatingInterfaceText']
357 }
358 },
359
360
361 //-------------------------------------------------------------------------
362 //
363 //Data panel - processingImportData
364 //
365 'parseImportData': function() {
366 return {
367 'title': Clipperz.PM.Strings['importData_parsingDataTitle'],
368 'text': Clipperz.PM.Strings['importData_parsingDataText']
369 }
370 },
371
372 'previewImportData': function() {
373 return {
374 'title': Clipperz.PM.Strings['importData_previewingDataTitle'],
375 'text': Clipperz.PM.Strings['importData_previewingDataText']
376 }
377 },
378
379 'processingImportData': function() {
380 return {
381 'title': Clipperz.PM.Strings['importData_processingDataTitle'],
382 'text': Clipperz.PM.Strings['importData_processingDataText']
383 }
384 },
385
386 //-------------------------------------------------------------------------
387 __syntaxFix__: "syntax fix"
388
389}
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js b/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
new file mode 100644
index 0000000..1ad2696
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
@@ -0,0 +1,390 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
32if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
33
34//=============================================================================
35//
36 // D E F A U L T S ( defaults )
37//
38//=============================================================================
39
40Clipperz.PM.Strings.Languages['defaults'] = {
41
42'elapsedTimeDescriptions': {
43 'MORE_THAN_A_MONTH_AGO': "more than a month ago",
44 'MORE_THAN_A_WEEK_AGO': "more than a week ago",
45 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago",
46 'YESTERDAY': "yesterday",
47 '*_DAYS_AGO': "__elapsed__ days ago",
48 'ABOUT_AN_HOUR_AGO': "about an hour ago",
49 '*_HOURS_AGO': "__elapsed__ hours ago",
50 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago",
51 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago"
52},
53/*
54 'unknown_ip': "unknown",
55
56'countries': {
57 '--': "unknown",
58 'AD': "Andorra",
59 'AE': "United Arab Emirates",
60 'AF': "Afghanistan",
61 'AG': "Antigua and Barbuda",
62 'AI': "Anguilla",
63 'AL': "Albania",
64 'AM': "Armenia",
65 'AN': "Netherlands Antilles",
66 'AO': "Angola",
67 'AP': "Non-Spec Asia Pas Location",
68 'AR': "Argentina",
69 'AS': "American Samoa",
70 'AT': "Austria",
71 'AU': "Australia",
72 'AW': "Aruba",
73 'AX': "Aland Islands",
74 'AZ': "Azerbaijan",
75 'BA': "Bosnia and Herzegowina",
76 'BB': "Barbados",
77 'BD': "Bangladesh",
78 'BE': "Belgium",
79 'BF': "Burkina Faso",
80 'BG': "Bulgaria",
81 'BH': "Bahrain",
82 'BI': "Burundi",
83 'BJ': "Benin",
84 'BM': "Bermuda",
85 'BN': "Brunei Darussalam",
86 'BO': "Bolivia",
87 'BR': "Brazil",
88 'BS': "Bahamas",
89 'BT': "Bhutan",
90 'BW': "Botswana",
91 'BY': "Belarus",
92 'BZ': "Belize",
93 'CA': "Canada",
94 'CD': "Congo the Democratic Republic of the",
95 'CF': "Central African Republic",
96 'CH': "Switzerland",
97 'CI': "Cote D'ivoire",
98 'CK': "Cook Islands",
99 'CL': "Chile",
100 'CM': "Cameroon",
101 'CN': "China",
102 'CO': "Colombia",
103 'CR': "Costa Rica",
104 'CS': "Serbia and Montenegro",
105 'CU': "Cuba",
106 'CY': "Cyprus",
107 'CZ': "Czech Republic",
108 'DE': "Germany",
109 'DJ': "Djibouti",
110 'DK': "Denmark",
111 'DO': "Dominican Republic",
112 'DZ': "Algeria",
113 'EC': "Ecuador",
114 'EE': "Estonia",
115 'EG': "Egypt",
116 'ER': "Eritrea",
117 'ES': "Spain",
118 'ET': "Ethiopia",
119 'EU': "European Union",
120 'FI': "Finland",
121 'FJ': "Fiji",
122 'FM': "Micronesia Federated States of",
123 'FO': "Faroe Islands",
124 'FR': "France",
125 'GA': "Gabon",
126 'GB': "United Kingdom",
127 'GD': "Grenada",
128 'GE': "Georgia",
129 'GF': "French Guiana",
130 'GG': "Guernsey",
131 'GH': "Ghana",
132 'GI': "Gibraltar",
133 'GL': "Greenland",
134 'GM': "Gambia",
135 'GP': "Guadeloupe",
136 'GR': "Greece",
137 'GT': "Guatemala",
138 'GU': "Guam",
139 'GW': "Guinea-Bissau",
140 'GY': "Guyana",
141 'HK': "Hong Kong",
142 'HN': "Honduras",
143 'HR': "Croatia (Local Name: Hrvatska)",
144 'HT': "Haiti",
145 'HU': "Hungary",
146 'ID': "Indonesia",
147 'IE': "Ireland",
148 'IL': "Israel",
149 'IM': "Isle of Man",
150 'IN': "India",
151 'IO': "British Indian Ocean Territory",
152 'IQ': "Iraq",
153 'IR': "Iran (Islamic Republic of)",
154 'IS': "Iceland",
155 'IT': "Italy",
156 'JE': "Jersey",
157 'JM': "Jamaica",
158 'JO': "Jordan",
159 'JP': "Japan",
160 'KE': "Kenya",
161 'KG': "Kyrgyzstan",
162 'KH': "Cambodia",
163 'KI': "Kiribati",
164 'KN': "Saint Kitts and Nevis",
165 'KR': "Korea Republic of",
166 'KW': "Kuwait",
167 'KY': "Cayman Islands",
168 'KZ': "Kazakhstan",
169 'LA': "Lao People's Democratic Republic",
170 'LB': "Lebanon",
171 'LC': "Saint Lucia",
172 'LI': "Liechtenstein",
173 'LK': "Sri Lanka",
174 'LR': "Liberia",
175 'LS': "Lesotho",
176 'LT': "Lithuania",
177 'LU': "Luxembourg",
178 'LV': "Latvia",
179 'LY': "Libyan Arab Jamahiriya",
180 'MA': "Morocco",
181 'MC': "Monaco",
182 'MD': "Moldova Republic of",
183 'MG': "Madagascar",
184 'MH': "Marshall Islands",
185 'MK': "Macedonia the Former Yugoslav Republic of",
186 'ML': "Mali",
187 'MM': "Myanmar",
188 'MN': "Mongolia",
189 'MO': "Macau",
190 'MP': "Northern Mariana Islands",
191 'MR': "Mauritania",
192 'MS': "Montserrat",
193 'MT': "Malta",
194 'MU': "Mauritius",
195 'MV': "Maldives",
196 'MW': "Malawi",
197 'MX': "Mexico",
198 'MY': "Malaysia",
199 'MZ': "Mozambique",
200 'NA': "Namibia",
201 'NC': "New Caledonia",
202 'NF': "Norfolk Island",
203 'NG': "Nigeria",
204 'NI': "Nicaragua",
205 'NL': "Netherlands",
206 'NO': "Norway",
207 'NP': "Nepal",
208 'NR': "Nauru",
209 'NU': "Niue",
210 'NZ': "New Zealand",
211 'OM': "Oman",
212 'PA': "Panama",
213 'PE': "Peru",
214 'PF': "French Polynesia",
215 'PG': "Papua New Guinea",
216 'PH': "Philippines",
217 'PK': "Pakistan",
218 'PL': "Poland",
219 'PR': "Puerto Rico",
220 'PS': "Palestinian Territory Occupied",
221 'PT': "Portugal",
222 'PW': "Palau",
223 'PY': "Paraguay",
224 'QA': "Qatar",
225 'RO': "Romania",
226 'RS': "Serbia",
227 'RU': "Russian Federation",
228 'RW': "Rwanda",
229 'SA': "Saudi Arabia",
230 'SB': "Solomon Islands",
231 'SC': "Seychelles",
232 'SD': "Sudan",
233 'SE': "Sweden",
234 'SG': "Singapore",
235 'SI': "Slovenia",
236 'SK': "Slovakia (Slovak Republic)",
237 'SL': "Sierra Leone",
238 'SM': "San Marino",
239 'SN': "Senegal",
240 'SR': "Suriname",
241 'SV': "El Salvador",
242 'SY': "Syrian Arab Republic",
243 'SZ': "Swaziland",
244 'TC': "Turks and Caicos Islands",
245 'TG': "Togo",
246 'TH': "Thailand",
247 'TJ': "Tajikistan",
248 'TM': "Turkmenistan",
249 'TN': "Tunisia",
250 'TO': "Tonga",
251 'TR': "Turkey",
252 'TT': "Trinidad and Tobago",
253 'TV': "Tuvalu",
254 'TW': "Taiwan Province of China",
255 'TZ': "Tanzania United Republic of",
256 'UA': "Ukraine",
257 'UG': "Uganda",
258 'US': "United States",
259 'UY': "Uruguay",
260 'UZ': "Uzbekistan",
261 'VA': "Holy See (Vatican City State)",
262 'VE': "Venezuela",
263 'VG': "Virgin Islands (British)",
264 'VI': "Virgin Islands (U.S.)",
265 'VN': "Viet Nam",
266 'VU': "Vanuatu",
267 'WF': "Wallis and Futuna Islands",
268 'WS': "Samoa",
269 'YE': "Yemen",
270 'ZA': "South Africa",
271 'ZM': "Zambia",
272 'ZW': "Zimbabwe",
273 'ZZ': "Reserved"
274},
275
276'browsers': {
277 'UNKNOWN': "Unknown",
278 'MSIE': "Internet Explorer",
279 'FIREFOX': "Firefox",
280 'OPERA': "Opera",
281 'SAFARI': "Safari",
282 'OMNIWEB': "OmniWeb",
283 'CAMINO': "Camino",
284 'CHROME': "Chrome"
285},
286
287'operatingSystems': {
288 'UNKNOWN': "Unknown",
289 'WINDOWS': "Windows",
290 'MAC': "Mac",
291 'LINUX': "Linux",
292 'IPHONE': "iPhone",
293 'MOBILE': "Mobile",
294 'OPENBSD': "OpenBSD",
295 'FREEBSD': "FreeBSD",
296 'NETBSD': "NetBSD"
297},
298*/
299
300 //Calendar texts
301'calendarStrings': {
302 'months': {
303 '0':"January",
304 '1':"February",
305 '2':"March",
306 '3':"April",
307 '4':"May",
308 '5':"June",
309 '6':"July",
310 '7':"August",
311 '8':"September",
312 '9':"October",
313 '10':"November",
314 '11':"December"
315 },
316 'shortMonths':{
317 '0':"Jan",
318 '1':"Feb",
319 '2':"Mar",
320 '3':"Apr",
321 '4':"May",
322 '5':"Jun",
323 '6':"Jul",
324 '7':"Aug",
325 '8':"Sep",
326 '9':"Oct",
327 '10':"Nov",
328 '11':"Dec"
329 },
330
331 'days':{
332 '0':"Sunday",
333 '1':"Monday",
334 '2':"Tuesday",
335 '3':"Wednesday",
336 '4':"Thursday",
337 '5':"Friday",
338 '6':"Saturday"
339 },
340
341 'shortDays':{
342 '0':"Sun",
343 '1':"Mon",
344 '2':"Tue",
345 '3':"Wed",
346 '4':"Thu",
347 '5':"Fri",
348 '6':"Sat"
349 },
350
351 'veryShortDays':{
352 '0':"Su",
353 '1':"Mo",
354 '2':"Tu",
355 '3':"We",
356 '4':"Th",
357 '5':"Fr",
358 '6':"Sa"
359 },
360
361 'amDesignation':"am",
362 'pmDesignation':"pm"
363
364},
365
366// Date format
367 'fullDate_format':"l, F d, Y H:i:s",
368
369//################################################################################
370
371'pageHeader': {
372 'donation':"donate",
373 'forum':"forum",
374 'credits':"credits",
375 'feedback':"feedback",
376 'help': "help"
377},
378
379'bookmarkletCopy': {
380 'noExceptionMessage':"The direct login configuration has been collected.",
381 'exceptionMessage': "Sorry! There was an error while processing the page.",
382 'copy': "copy",
383 'successfulMessage':"DONE!",
384 'failMessage': "Failed! :("
385},
386
387//################################################################################
388
389__syntaxFix__: "syntax fix"
390}
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
new file mode 100644
index 0000000..eebdb16
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
@@ -0,0 +1,1341 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//=============================================================================
30//
31 // E N G L I S H A M E R I C A N ( en_US )
32//
33//=============================================================================
34
35Clipperz.PM.Strings.Languages['en-us'] = {
36/*
37 //Login page - description
38'clipperzServiceDescription': "\
39 <!-- FIX CSS DONE -->\
40 <h2>Keep it to yourself!</h2>\
41 <ul>\
42 <li>\
43 <h3>Clipperz is:</h3>\
44 <ul>\
45 <li><p>a secure and simple password manager</p></li>\
46 <li><p>an effective single sign-on solution</p></li>\
47 <li><p>a digital vault for your personal data</p></li>\
48 </ul>\
49 </li>\
50 <li>\
51 <h3>With Clipperz you can:</h3>\
52 <ul>\
53 <li><p>store and manage your passwords and online credentials</p></li>\
54 <li><p>login to your web services without entering any username or password</p></li>\
55 <li><p>protect all your sensitive data: codes for burglar alarms, PINs, credit card numbers, …</p></li>\
56 <li><p>share secrets with family members and associates (coming soon)</p></li>\
57 </ul>\
58 </li>\
59 <li>\
60 <h3>Clipperz benefits:</h3>\
61 <ul>\
62 <li><p>free and completely anonymous</p></li>\
63 <li><p>access it any time from any computer</p></li>\
64 <li><p>no software to download and nothing to install</p></li>\
65 <li><p>avoid keeping secrets on your PC or on paper</p></li>\
66 </ul>\
67 </li>\
68 <li>\
69 <h3>Clipperz security:</h3>\
70 <ul>\
71 <li><p>your secrets are locally encrypted by your browser before being uploaded to Clipperz</p></li>\
72 <li><p>the encryption key is a passphrase known only to you</p></li>\
73 <li><p>Clipperz hosts your sensitive data in encrypted form and could never actually access the data in its plain form</p></li>\
74 <li><p>Clipperz is built upon standard encryption schemes, nothing fancies or homemade</p></li>\
75 <li><p>you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!</p></li>\
76 </ul>\
77 </li>\
78 <li>\
79 <a href=\"http://www.clipperz.com\" target=\"_blank\">Learn more</a>\
80 </li>\
81 </ul>",
82
83
84 'loginFormTitle': "login with your Clipperz account",
85 'loginFormUsernameLabel': "username",
86 'loginFormPassphraseLabel': "passphrase",
87 'loginFormDontHaveAnAccountLabel': "don\'t have an account?",
88 'loginFormCreateOneLabel': "create one",
89 'loginFormForgotYourCredentialsLabel': "forgot your credentials?",
90 'loginFormAarghThatsBadLabel': "aargh! that\'s bad!",
91 'loginFormAfraidOfMaliciousScriptsLabel': "afraid of malicious scripts?",
92 'loginFormVerifyTheCodeLabel': "verify the code",
93 'loginFormButtonLabel': "Login",
94 'loginFormOneTimePasswordCheckboxLabel': "use a one-time passphrase",
95'loginFormOneTimePasswordCheckboxDescription': "",
96
97// Login page - language selection
98 'loginPanelSwithLanguageDescription': "<h5>Switch to your preferred language</h5>",
99
100// Login page - browser compatibility
101 'browserCompatibilityDescription': "<p>Have a better and safer Clipperz experience with Firefox. However Clipperz works just fine also with Opera, Safari and MS Internet Explorer!</p>",
102
103// Login with OTP - message panel
104 'OTPloginMessagePanelInitialTitle': "Logging in using a one-time passphrase",
105 'OTPloginMessagePanelInitialText': "Sending OTP credentials …",
106 'OTPloginMessagePanelLoadingTitle': "Logging in using a one-time passphrase",
107 'OTPloginMessagePanelLoadingText': "Fetching encrypted authentication data from the server …",
108 'OTPloginMessagePanelProcessingTitle': "Logging in using a one-time passphrase",
109 'OTPloginMessagePanelProcessingText': "Local decryption of authentication data",
110
111// Regular login - message panel
112 'loginMessagePanelInitialTitle': "Logging in …",
113 'loginMessagePanelInitialText': "---",
114 'loginMessagePanelInitialButtonLabel': "Cancel",
115 'loginMessagePanelConnectedTitle': "Connected",
116 'loginMessagePanelConnectedText': "Done",
117 'loginMessagePanelFailureTitle': "Error",
118 'loginMessagePanelFailureText': "Login failed",
119 'loginMessagePanelFailureButtonLabel': "Close",
120
121// Regular login - message panel - connection
122 'connectionLoginSendingCredentialsMessageTitle': "Verifying credentials",
123 'connectionLoginSendingCredentialsMessageText': "Sending credentials",
124 'connectionLoginCredentialsVerificationMessageTitle':"Verifying credentials",
125 'connectionLoginCredentialsVerificationMessageText':"Performing SRP authentication",
126 'connectionLoginDoneMessageTitle': "Verifying credentials",
127 'connectionLoginDoneMessageText': "Connected",
128
129 //Regular login - message panel - user
130 'userLoginPanelUpgradingUserCredentialsMessageTitle': "Verifying credentials",
131 'userLoginPanelUpgradingUserCredentialsMessageText': "Upgrading your credentials to a new authentication schema",
132 'userLoginPanelConnectedMessageTitle': "User authenticated",
133 'userLoginPanelConnectedMessageText': "Successfully logged in",
134 'userLoginPanelTryingAnOlderConnectionSchemaMessageTitle': "Verifying credentials",
135 'userLoginPanelTryingAnOlderConnectionSchemaMessageText': "Trying an older authentication schema",
136 'userLoginPanelLoadingUserDataMessageTitle': "User authenticated",
137 'userLoginPanelLoadingUserDataMessageText': "Downloading encrypted card headers from Clipperz",
138 'userLoginPanelDecryptingUserDataMessageTitle': "User authenticated",
139 'userLoginPanelDecryptingUserDataMessageText': "Local decryption of card headers",
140 'userLoginPanelDecryptingUserStatisticsMessageTitle': "User authenticated",
141 'userLoginPanelDecryptingUserStatisticsMessageText': "Local decryption of usage statistics",
142
143 //Registration page - splash alert
144 'splashAlertTitle':"Welcome to Clipperz!",
145'splashAlertText': "\
146 <!-- FIX CSS DONE! -->\
147 <p>Some security advice</p>\
148 <ul>\
149 <li><p>Storing your data at Clipperz is as secure as the passphrase you choose to protect them. Nobody can access them unless they know your passphrase.</p></li>\
150 <li><p>If you are going to use Clipperz for safeguarding sensitive and critical information please make sure to use a strong passphrase. The longer the better!</p></li>\
151 <li><p>Clipperz will not be able to recover a lost passphrase!</p></li>\
152 </ul>\
153 <p>For any further information, please refer to <a href=\"http://www.clipperz.com\" target=\"_blank\">Clipperz</a> website.</p>",
154 'splashAlertCloseButtonLabel':"Ok",
155
156 // Registration page - form
157 'registrationFormTitle': "create your account",
158 'registrationFormUsernameLabel': "username",
159 'registrationFormPassphraseLabel': "passphrase",
160 'registrationFormRetypePassphraseLabel': "re-enter passphrase",
161 'registrationFormSafetyCheckLabel': "I understand that Clipperz will not be able to recover a lost passphrase.",
162 'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>.",
163 'registrationFormDoYouAlreadyHaveAnAccountLabel': "do you already have an account?",
164 'registrationFormSimplyLoginLabel': "simply login",
165 'registrationFormButtonLabel': "Register",
166
167// Registration page - warning messages
168 'registrationFormWarningMessageNotMatchingPassphrases':"Your passphrases don't match, please re-type them.",
169 'registrationFormWarningMessageSafetyCheckNotSelected':"Please read and check all the boxes below.",
170 'registrationFormWarningMessageTermsOfServiceCheckNotSelected':"You need to agree to the Terms of Service.",
171
172 // Registration page - message panel
173 'registrationMessagePanelInitialTitle': "Creating account …",
174 'registrationMessagePanelInitialText': "---",
175 'registrationMessagePanelInitialButtonLabel': "Cancel",
176 'registrationMessagePanelRegistrationDoneTitle': "Registration",
177 'registrationMessagePanelRegistrationDoneText': "Done",
178 'registrationMessagePanelFailureTitle': "Registration failed",
179 'registrationMessagePanelFailureButtonLabel': "Close",
180
181// Registration page - message panel - connection
182 'connectionRegistrationSendingRequestMessageText': "Verifying credentials",
183 'connectionRegistrationSendingCredentialsMessageText':"Sending credentials",
184
185// Registration page - splash panel
186 'registrationSplashPanelTitle': "Security advice",
187 'registrationSplashPanelDescription': "<p>These are your Clipperz credentials, take good care of them. Clipperz will never display your username and passphrase a second time!</p>",
188 'registrationSplashPanelUsernameLabel': "username",
189 'registrationSplashPanelPassphraseLabel':"passphrase",
190
191 'registrationSplashPanelShowPassphraseButtonLabel':"show passphrase",
192
193 //Header links
194 'donateHeaderLinkLabel': "donate",
195 'creditsHeaderLinkLabel': "credits",
196 'feedbackHeaderLinkLabel': "feedback",
197 'helpHeaderLinkLabel': "help",
198 'forumHeaderLinkLabel': "forum",
199
200 //Menu labels
201 'recordMenuLabel': "cards",
202 'accountMenuLabel': "account",
203 'dataMenuLabel': "data",
204 'contactsMenuLabel': "contacts",
205 'toolsMenuLabel': "tools",
206 'logoutMenuLabel': "logout",
207 'lockMenuLabel': "lock",
208
209 //Lock dialog
210 'lockTitle': "The account is locked",
211 'lockDescription': "<p>To unlock your account, please enter your passphrase.</p>",
212 'unlockButtonLabel': "Unlock",
213
214 //Account panel - change passphrase
215 'changePasswordTabLabel': "Change your passphrase",
216 'changePasswordTabTitle': "Change your passphrase",
217
218 'changePasswordFormUsernameLabel': "username",
219 'changePasswordFormOldPassphraseLabel': "old passphrase",
220 'changePasswordFormNewPassphraseLabel': "new passphrase",
221 'changePasswordFormRetypePassphraseLabel':"re-enter new passphrase",
222 'changePasswordFormSafetyCheckboxLabel':"I understand that Clipperz will not be able to recover a lost passphrase.",
223 'changePasswordFormSubmitLabel': "Change passphrase",
224
225 //Account panel - change passphrase - warning messages
226 'changePasswordFormWrongUsernameWarning': "Wrong username",
227 'changePasswordFormWrongPassphraseWarning': "Wrong passphrase",
228 'changePasswordFormWrongRetypePassphraseWarning':"Your passphrases don't match, please re-type them.",
229 'changePasswordFormSafetyCheckWarning': "Please read and check the box below.",
230
231 //Account panel - change passphrase - progress dialog
232 'changePasswordFormProgressDialogTitle': "Changing user credentials",
233 'changePasswordFormProgressDialogEmptyText': "---",
234 'changePasswordFormProgressDialogConnectedMessageTitle': "Connected",
235 'changePasswordFormProgressDialogConnectedMessageText': "Done",
236 'changePasswordFormProgressDialogErrorMessageTitle': "Error",
237 'changePasswordFormProgressDialogErrorMessageText': "Credentials change failed!",
238
239 'changeCredentialsPanelEncryptingDataMessageTitle': "Changing your passphrase",
240 'changeCredentialsPanelEncryptingDataMessageText': "Local encryption of card headers",
241 'changeCredentialsPanelCreatingNewCredentialsMessageTitle': "Changing your passphrase",
242 'changeCredentialsPanelCreatingNewCredentialsMessageText': "Updating your credentials",
243 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle':"Changing your passphrase",
244 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageText':"Uploading your encrypted credentials to Clipperz",
245 'changeCredentialsPanelDoneMessageTitle': "Changing your passphrase",
246 'changeCredentialsPanelDoneMessageText': "Done",
247
248 //Account panel - OTP
249 'manageOTPTabLabel': "Manage your one-time passphrases",
250 'manageOTPTabTitle': "Manage your one-time passphrases",
251
252 'manageOTPTabDescription':"\
253 <p>A one-time passphrase works like your regular passphrase, but can be used only once.</p>\
254 <p>If the same passphrase is used again at a later stage in a login attempt it will be rejected and the login process will fail.</p>\
255 <p>Immediately after a successful login, your one-time passphrase will be deleted preventing any fraudulent access.</p>\
256 <p>One-time passphrases are an excellent choice if one is concerned about keyloggers or spyware infections that may be collecting data from compromised machines.</p>\
257 <p><b>It's strongly advisable to use one-time passphrases when accessing Clipperz from public terminals, such as Internet cafes and libraries.</b></p>",
258
259 //Account panel - OTP - OTP table
260'oneTimePasswordReadOnlyMessage': "\
261 <h6>Sorry!</h6>\
262 <p>You cannot manage your one-time passphrases when using the offline version of Clipperz.</p>",
263
264 'oneTimePasswordLoadingMessage':"\
265 <h6>Loading data</h6>\
266 <p>Please wait …</p>",
267
268 'oneTimePasswordNoPasswordAvailable':"\
269 <h6>No one-time passphrase available</h6>\
270 <p>Click the “New” button above to add one-time passphrases to your account.</p>",
271
272 'createNewOTPButtonLabel': "New",
273 'deleteOTPButtonLabel': "Delete",
274 'printOTPButtonLabel': "Print",
275
276 'disabledOneTimePassword_warning': "disabled",
277
278 'oneTimePasswordSelectionLink_selectLabel':"Select:",
279 'oneTimePasswordSelectionLink_all': "all",
280 'oneTimePasswordSelectionLink_none': "none",
281 'oneTimePasswordSelectionLink_used': "used",
282 'oneTimePasswordSelectionLink_unused': "unused",
283
284//Account panel - OTP - saving new OTP dialog
285 'saveOTP_encryptUserDataTitle': "Saving one-time passphrase",
286 'saveOTP_encryptUserDataText': "Processing new OTP credentials …",
287 'saveOTP_encryptOTPDataTitle': "Saving one-time passphrase",
288 'saveOTP_encryptOTPDataText': "Local encryption of authentication data …",
289 'saveOTP_sendingDataTitle': "Saving one-time passphrase",
290 'saveOTP_sendingDataText': "Sending authentication data to the server …",
291 'saveOTP_updatingInterfaceTitle': "Saving one-time passphrase",
292 'saveOTP_updatingInterfaceText': "Updating interface",
293
294// Account panel - preferences
295 'accountPreferencesLabel': "Preferences",
296 'accountPreferencesTabTitle': "Preferences",
297
298 'accountPreferencesLanguageTitle': "Language",
299 'accountPreferencesLanguageDescription':"<p>Choose your preferred language from the list below.</p>",
300
301 'showDonationReminderPanelTitle': "Donation reminders",
302 'showDonationReminderPanelDescription': "<p>Show donation reminders</p>",
303
304 'saveUserPreferencesFormSubmitLabel': "Save",
305 'cancelUserPreferencesFormSubmitLabel': "Cancel",
306
307// Account panel - preferences - saving dialog
308 'accountPreferencesSavingPanelTitle_Step1': "Saving preferences",
309 'accountPreferencesSavingPanelText_Step1': "Local encryption of your preferences",
310 'accountPreferencesSavingPanelTitle_Step2': "Saving preferences",
311 'accountPreferencesSavingPanelText_Step2': "Sending encrypted preferences to Clipperz",
312
313 //Account panel - login history
314 'accountLoginHistoryLabel': "Login history",
315 'loginHistoryTabTitle': "Login history",
316
317 'loginHistoryReadOnlyMessage': "\
318 <h6>Sorry!</h6>\
319 <p>The login history is not available while using the offline version of Clipperz.</p>",
320
321 'loginHistoryLoadingMessage': "\
322 <h6>Loading data</h6>\
323 <p>Please wait …</p>",
324
325 'loginHistoryLoadedMessage': "\
326 <h6>Your latest 10 logins</h6>\
327 <p></p>",
328
329 'loginHistoryIPLabel': "IP",
330 'loginHistoryTimeLabel': "date",
331 'loginHistoryCurrentSessionText': "current session",
332 'loginHistoryReloadButtonLabel': "Reload login history",
333
334 //Account panel - delete account
335 'deleteAccountTabLabel': "Delete your account",
336 'deleteAccountTabTitle': "Delete your account",
337
338 'deleteAccountFormUsernameLabel': "username",
339 'deleteAccountFormPassphraseLabel': "passphrase",
340 'deleteAccountFormSafetyCheckboxLabel': "I understand that all my data will be deleted and that this action is irreversible.",
341 'deleteAccountFormSubmitLabel': "Delete my account",
342
343//Account panel - delete account - warnings
344 'deleteAccountFormWrongUsernameWarning':"Wrong username",
345 'deleteAccountFormWrongPassphraseWarning':"Wrong passphrase",
346 'deleteAccountFormSafetyCheckWarning': "Please read and check the box below.",
347
348//Account panel - delete account - confirmation
349 'accountPanelDeletingAccountPanelConfirmationTitle':"ATTENTION",
350 'accountPanelDeleteAccountPanelConfirmationText': "Are your sure you want to delete your account?",
351 'accountPanelDeleteAccountPanelConfirmButtonLabel': "Yes",
352 'accountPanelDeleteAccountPanelDenyButtonLabel': "No",
353
354//Account panel - delete account - confirmation
355 'accountPanelDeletingAccountPanelProgressTitle': "Deleting the account data",
356 'accountPanelDeletingAccountPanelProgressText': "The operation could take long, please be patient.",
357
358//Data panel - offline copy
359 'offlineCopyTabLabel': "Offline copy",
360 'offlineCopyTabTitle': "Offline copy",
361
362'offlineCopyTabDescription': "\
363 <!-- FIX CSS DONE! -->\
364 <p>With just one click you can dump all your encrypted data from Clipperz servers to your hard disk and create a read-only offline version of Clipperz to be used when you are not connected to the Internet.</p>\
365 <p>The read-only version is as secure as the read-and-write one and will not expose your data to higher risks since they both share the same code and security architecture.</p>\
366 <ol>\
367 <li><p>Click the link below to start the download.</p></li>\
368 <li><p>The browser will ask you what to do with the “Clipperz_YYYYMMDD.html” file. Save it on your hard disk.</p></li>\
369 <li><p>Double click on the downloaded file to launch the offline version in your browser.</p></li>\
370 <li><p>Enter the usual username and passphrase.</p></li>\
371 </ol>",
372
373 'offlineCopyDownloadLinkLabel': "Download",
374
375 //Data panel - offline copy - not updated
376 'offlineCopyDownloadWarning': "\
377 <!-- FIX CSS DONE! -->\
378 <h4><a href=\"#\" id=\"offlineCopyDownloadWarningLink\">Update your “offline copy”!</a></h4>\
379 <p>You have recently created or modified one or more cards, it would be wise to download a new copy of the offline version.</p>",
380
381 'offlineCopyDownloadOk': "",
382
383 //Data panel - sharing
384 'sharingTabLabel': "Sharing",
385 'sharingTabTitle': "Sharing",
386
387 'sharingTabDescription': "\
388 <p>Quite often a confidential piece of information needs to be shared with one or more persons.</p>\
389 <p>This could be as simple as giving your colleague the access code of your voice mailbox when you are out of the office, or as complicated as enabling the entitled heirs to access your safe deposit box at the local bank when you pass on.</p>\
390 <p>Clipperz can make sharing your secrets a secure and straightforward process.</p>\
391 <p></p>\
392 <p><b>Coming soon …</b></p>",
393
394 // Data panel - import
395 'importTabLabel': "Import",
396 'importTabTitle': "Import",
397
398 'importTabDescription': "<p>You can bulk import data to your Clipperz account from several file formats.</p>",
399
400 //Data panel - export
401 'printingTabLabel': "Export",
402 'printingTabTitle': "Export",
403
404 'printingTabDescription': "\
405 <h5>Printing</h5>\
406 <p>Click on the link below to open a new window displaying all your cards in a printable format.</p>\
407 <p>If you are going to print for backup purposes, please consider the safer option provided by the “offline copy”.</p>",
408
409 'printingLinkLabel': "Printable version",
410
411 'exportTabDescription': "\
412 <h5>Exporting to JSON</h5>\
413 <p>JSON enables a “lossless” export of your cards. All the information will be preserved, including direct login configurations.</p>\
414 <p>This custom format it’s quite convenient if you need to move some of all of your cards to a different Clipperz account. Or if you want to restore a card that has been accidentally deleted.</p>\
415 <p>Click on the link below to start the export process.</p>",
416
417 'exportLinkLabel': "Export to JSON",
418
419 'exportDataInProgressDescription':"<h4>Exporting, please wait while your data are being processed …</h4>",
420
421 'exportDataDescription': "\
422 <h4>Instructions</h4>\
423 <p>Copy the text below to your favorite editor and save it. (e.g. “clipperz_export_20071217.json”)</p>",
424
425 //Contacts panel
426 'contactsTabLabel': "Contacts",
427 'contactsTabTitle': "Contacts",
428
429//Tools panel - password generator
430 'passwordGeneratorTabLabel': "Password generator",
431 'bookmarkletTabLabel': "Bookmarklet",
432 'compactTabLabel': "Compact edition",
433 'httpAuthTabLabel': "HTTP authentication",
434
435 'passwordGeneratorTabTitle': "Password generator",
436 'bookmarkletTabTitle': "Bookmarklet",
437 'compactTabTitle': "Compact edition",
438 'httpAuthTabTitle': "HTTP authentication",
439
440
441 //Tools panel - password generator - description
442 'paswordGeneratorTabDescription':"<p></p>",
443 'passwordGeneratorTabButtonLabel':"Generate password",
444
445 //Tools panel - bookmarklet
446 'bookmarkletTabLabel': "Bookmarklet",
447 'bookmarkletTabTitle': "Bookmarklet",
448
449 'bookmarkletTabDescription': "\
450 <!-- FIX CSS DONE! -->\
451 <p>A bookmarklet is a simple “one-click” tool that can perform very useful tasks. It can be saved and used like a normal web page bookmark.</p>\
452 <p>The Clipperz bookmarklet will help you to quickly create new cards and new “direct logins” within existing cards.</p>\
453 <p><b>Please note that the bookmarklet does not include any information related to your account (e.g. your username or passphrase), the bookmarklet is a general tool containing the same code for every Clipperz user.</b></p>\
454 <h3>How to install the bookmarklet</h3>\
455 <h>Firefox, Camino, Opera, Safari</h5>\
456 <ol>\
457 <li><p>Make sure that the “Bookmarks Bar” is displayed by selecting “View > Toolbars > Bookmarks”, or similar menu items, from the browser menu.</p></li>\
458 <li><p>Drag and drop the “Add to Clipperz” link below to the bookmark bar.</p></li>\
459 </ol>\
460 \
461 <h5>Internet Explorer</h5>\
462 <ol>\
463 <li><p>Make sure that the “Links” toolbar is displayed by selecting “View > Toolbars > Links” from the browser menu.</p></li>\
464 <li><p>Right-click on the “Add to Clipperz” link below.</p></li>\
465 <li><p>Select “Add to favorites” from the contextual menu.</p></li>\
466 <li><p>Click “Yes” for any security message that pops up.</p></li>\
467 <li><p>Open the “Links” folder and click “OK”</p></li>\
468 </ol>",
469
470 'bookmarkletTabBookmarkletTitle':"Add to Clipperz",
471
472 //Tools panel - bookmarklet - instructions
473 'bookmarkletTabInstructions': "\
474 <!-- FIX CSS DONE! -->\
475 <h3>How to create a new card inclusive of a “direct login” link to an online service</h3>\
476 <ol>\
477 <li><p>Open the web page where the login form is hosted. (this is the page where you usually enter your sign-in credentials)</p></li>\
478 <li><p>Launch the bookmarklet by clicking on it: a pop-up window will appear over the web page.</p></li>\
479 <li><p>Copy to the clipboard the content of the large text area within the pop-up. (ctrl-C)</p></li>\
480 <li><p>Enter your Clipperz account and click on the <b>Add new card</b> button.</p></li>\
481 <li><p>Select the “Direct login” template and paste the content of the clipboard to the large text area in the form. (ctrl-V)</p></li>\
482 <li><p>Press the <b>Create</b> button, complete and review the details, then click <b>Save</b>.</p></li>\
483 </ol>\
484 \
485 <h3>How to add a “direct login” link to an existing card</h3>\
486 <ol>\
487 <li><p>Same as above.</p></li>\
488 <li><p>Same as above.</p></li>\
489 <li><p>Same as above.</p></li>\
490 <li><p>Enter your Clipperz account and select the card containing the credentials for the web service you just visited and click the <b>Edit</b> button.</p></li>\
491 <li><p>Paste the content of the clipboard to the large text area in the “Direct logins” section. (ctrl-V)</p></li>\
492 <li><p>Press the <b>Add direct login</b> button, review the details and then click <b>Save</b>.</p></li>\
493 </ol>\
494 \
495 <p></p>\
496 <p>Further information about the bookmarklet are <a href=\"http://www.clipperz.com/support/user_guide/bookmarklet\" target=\"_blank\">available here</a>.</p>",
497
498 //Tools panel - Compact - instructions
499 'compactTabDescription': "\
500 <!-- FIX CSS DONE! -->\
501 <p>Clipperz Compact is a special version of Clipperz designed to be opened in the Firefox sidebar.</p>\
502 <p>Its purpose is to keep your collection of “direct logins” always at hand. Read more <a href=\"http://www.clipperz.com/support/user_guide/clipperz_compact\", target=\"blank\">here</a></p>\
503 \
504 <h3>How to launch Clipperz Compact in the sidebar</h3>\
505 <ol>\
506 <li><p>Get Firefox! Sidebars are only available in Firefox and you need to switch to Firefox in order to enjoy the convenience of Clipperz Compact.</p></li>\
507 <li>\
508 <p>Add the following URL to Firefox bookmarks, or even better, drag it to the bookmark bar.</p>\
509 <div id=\"compactLinkBox\"><a href=\"https://www.clipperz.com/beta/index.html?compact\" target=\"_search\">Clipperz Compact</a></div>\
510 </li>\
511 <li><p>Change the properties of the bookmark so that “load this bookmark in the sidebar” is checked.</p></li>\
512 </ol>\
513 \
514 <h5>Added bonus: Clipperz Compact works also in Opera’s panel.</h5>",
515
516 //Tools panel - HTTP authentication - instructions
517 'httpAuthTabDescription': "\
518 <!-- FIX CSS DONE! -->\
519 <p>HTTP authentication is a method designed to allow a web browser to provide credentials – in the form of a username and password – including them in a website address (HTTP or HTTPS URL).</p>\
520 <p>Nowadays it is rarely used, but it can still be found on small, private websites. You can tell that a website is protected by HTTP authentication when the browser displays a pop-up window to enter username and password.</p>\
521 <p>Unfortunately the Clipperz bookmarklet does not work on websites that use HTTP authentication. However you can still create a “direct login”.</p>\
522 \
523 <h3>How to create a “direct login” for a website that uses HTTP authentication</h3>\
524 <ol>\
525 <li><p>Store website URL, username and password in a new card.</p></li>\
526 <li><p>Copy the configuration below and paste it to the large text area in the “Direct logins” section of the new card.</p></li>\
527 <li><p>Press the <b>Add direct login</b> button, bind URL, username and password fields and then click <b>Save</b>.</p></li>\
528 </ol>\
529 \
530 <h5><a href=\"http://support.microsoft.com/kb/834489\" target=\"_blank\">Warning: Internet Explorer does not support HTTP authentication.</a></h5>",
531
532// Direct logins block
533 'mainPanelDirectLoginBlockLabel': "Direct logins",
534 'directLinkReferenceShowButtonLabel': "show",
535
536// Direct logins - blank slate
537 'mainPanelDirectLoginBlockDescription': "\
538 <!-- FIX CSS DONE! -->\
539 <p>Add “direct logins” to sign in to your web accounts without typing usernames and passwords!</p>\
540 <p>“Direct logins” greatly enhance your password security since you can:</p>\
541 <ul>\
542 <li><p>conveniently adopt and enter complex passwords;</p></li>\
543 <li><p>never re-use the same and easy-to-guess password.</p></li>\
544 </ul>\
545 <p>Simple and quick configuration with the <b>Clipperz bookmarklet</b>.</p>\
546 <a href=\"http://www.clipperz.com/support/user_guide/direct_logins\" target=\"_blank\">Learn more about “direct logins”</a>",
547
548 // Cards block
549 'mainPanelRecordsBlockLabel': "Cards",
550 'mainPanelAddRecordButtonLabel': "Add new card",
551 'mainPanelRemoveRecordButtonLabel': "Delete card",
552
553// Cards block - filter tabs
554 'mainPanelRecordFilterBlockAllLabel': "all",
555 'mainPanelRecordFilterBlockTagsLabel': "tags",
556 'mainPanelRecordFilterBlockSearchLabel':"search",
557
558// Cards block - blank slate
559 'recordDetailNoRecordAtAllTitle': "Welcome to Clipperz!",
560 'recordDetailNoRecordAtAllDescription': "\
561 <h5>Get started by adding cards to your account.</h5>\
562 <p>Cards are simple and flexible forms where you can store your passwords and any other confidential data.</p>\
563 <p>Cards could contain credentials for accessing a web site, the combination of your bicycle lock, details of your credit card, …</p>\
564 \
565 <h5>Don't forget the Clipperz bookmarklet!</h5>\
566 <p>Before you start, install the “Add to Clipperz” bookmarklet: it will make creating cards easier and more fun.</p>\
567 <p>Go to the “Tools” tab to discover how to install it and how it use it.</p>\
568 <p></p>\
569 <p>Then simply click the <b>\"Add new card\"</b> button and enjoy your Clipperz account.</p>\
570 <p></p>\
571 <a href=\"http://www.clipperz.com/support/user_guide/managing_cards\" target=\"_blank\">Learn more about creating and managing cards</a>",
572
573// Cards block - new card wizard - bookmarklet configuration
574 'newRecordWizardTitleBox': "\
575 <h5>Please select a template</h5>\
576 <p>Cards are simple and flexible forms where you can store passwords or any other confidential data.</p>\
577 <p>Start choosing one of the templates below. You can always customize your cards later by adding or removing fields.</p>",
578
579 'newRecordWizardBookmarkletConfigurationTitle': "Direct login",
580 'newRecordWizardBookmarkletConfigurationDescription':"\
581 <p>Paste below the configuration code generated by the Clipperz bookmarklet.</p>\
582 <p>A new card complete with a direct login to your web account will be created.</p>",
583
584 'newRecordWizardCreateButtonLabel': "Create",
585 'newRecordWizardCancelButtonLabel': "Cancel",
586
587 //Create new card - Donation splash
588 'donateSplashPanelTitle': "Support Clipperz, make a donation today!",
589 'donateSplashPanelDescription': "\
590 <!-- FIX CSS DONE! -->\
591 <p>A few good reasons to make a donation:</p>\
592 <ul>\
593 <li><p>support the development of new features</p></li>\
594 <li><p>keep Clipperz free</p></li>\
595 <li><p>show appreciation for our hard work</p></li>\
596 </ul>\
597 <p>For any further information, please visit our <a href=\"http://www.clipperz.com/donations\" target=\"_blank\">Donations page</a>.</p>\
598 <p><b>Ready to donate?</b></p>",
599
600 'donateCloseButtonLabel': "Not yet",
601 'donateDonateButtonLabel': "Yes",
602
603// Card templates
604'recordTemplates': {
605
606//Web password
607 'WebAccount': {
608 'title': "Web password",
609 'description':"<p>A simple card to store login credentials for your online services.</p>",
610 'fields': [
611 {label:"Web address", type:'URL'},
612 {label:"Username or email", type:'TXT'},
613 {label:"Password", type:'PWD'}
614 ]
615 },
616
617 //Bank account
618 'BankAccount': {
619 'title': "Bank account",
620 'description':"<p>Safely store your bank account number and online banking credentials.</p>",
621 'fields': [
622 {label:"Bank", type:'TXT'},
623 {label:"Account number", type:'TXT'},
624 {label:"Bank website", type:'URL'},
625 {label:"Online banking ID", type:'TXT'},
626 {label:"Online banking password", type:'PWD'}
627 ]
628 },
629
630 // Credit card
631 'CreditCard': {
632 'title': "Credit card",
633 'description':"<p>Card number, expire date, CVV2 and PIN always at hand with Clipperz.</p>",
634 'fields': [
635 {label:"Type (Visa, AmEx, …)", type:'TXT'},
636 {label:"Number", type:'TXT'},
637 {label:"Owner name", type:'TXT'},
638 {label:"Expiry date", type:'TXT'},
639 {label:"CVV2", type:'TXT'},
640 {label:"PIN", type:'PWD'},
641 {label:"Card website", type:'URL'},
642 {label:"Username", type:'TXT'},
643 {label:"Password", type:'PWD'}
644 ]
645 },
646
647 // Address book entry
648 'AddressBookEntry': {
649 'title': "Address book entry",
650 'description':"<p>Clipperz could also work as your new private address book. Use this template to easily add a new entry.</p>",
651 'fields': [
652 {label:"Name", type:'TXT'},
653 {label:"Email", type:'TXT'},
654 {label:"Phone", type:'TXT'},
655 {label:"Mobile", type:'TXT'},
656 {label:"Address", type:'ADDR'}
657 ]
658 },
659
660//Custom card
661 'Custom': {
662 'title': "Custom card",
663 'description':"<p>No matter which kind of confidential data you need to protect, create a custom card to match your needs.</p>",
664 'fields': [
665 {label:"Label 1", type:'TXT'},
666 {label:"Label 2", type:'TXT'},
667 {label:"Label 3", type:'TXT'}
668 ]
669 }
670},
671
672
673'recordFieldTypologies': {
674 'TXT': {
675 description: "simple text field",
676 shortDescription: "text"
677 },
678 'PWD': {
679 description: "simple text field, with default status set to hidden",
680 shortDescription: "password"
681 },
682 'URL': {
683 description: "simple text field in edit mode, that became an active url in view mode",
684 shortDescription: "web address"
685 },
686 'DATE': {
687 description: "a value set with a calendar helper",
688 shortDescription: "date"
689 },
690 'ADDR': {
691 description: "just like the URL, but the active link points to Google Maps (or similar service) passing the address value as argument",
692 shortDescription: "street address"
693 },
694 'CHECK': {
695 description: "check description",
696 shortDescription: "check"
697 },
698 'RADIO': {
699 description: "radio description",
700 shortDescription: "radio"
701 },
702 'SELECT': {
703 description: "select description",
704 shortDescription: "select"
705 }
706},
707
708// Cards block - new card - warnings
709 'newRecordPanelGeneralExceptionTitle': "Error",
710 'newRecordPanelGeneralExceptionMessage': "The configuration text is not valid. Make sure to get your text from the bookmarklet pop-up and retry.",
711 'newRecordPanelWrongBookmarkletVersionExceptionTitle': "Error",
712 'newRecordPanelWrongBookmarkletVersionExceptionMessage':"The configuration text has been generated by an old version of the bookmarklet. Please update your bookmarklet and retry.",
713 'newRecordPanelExceptionPanelCloseButtonLabel': "Cancel",
714
715// Cards block - delete card
716 'mainPanelDeletingRecordPanelConfirmationTitle': "Deleting selected card",
717 'mainPanelDeleteRecordPanelConfirmationText': "Do your really want to delete the selected card?",
718 'mainPanelDeleteRecordPanelConfirmButtonLabel': "Yes",
719 'mainPanelDeleteRecordPanelDenyButtonLabel': "No",
720 'mainPanelDeletingRecordPanelInitialTitle': "Deleting selected card",
721 'mainPanelDeletingRecordPanelInitialText': "---",
722 'mainPanelDeletingRecordPanelCompletedText': "Done",
723
724// Cards block - delete card panel
725 'deleteRecordPanelCollectRecordDataMessageTitle': "Delete card",
726 'deleteRecordPanelCollectRecordDataMessageText': "Updating card list",
727 'deleteRecordPanelEncryptUserDataMessageTitle': "Delete card",
728 'deleteRecordPanelEncryptUserDataMessageText': "Local encryption of card headers",
729 'deleteRecordPanelSendingDataToTheServerMessageTitle': "Delete card",
730 'deleteRecordPanelSendingDataToTheServerMessageText': "Uploading encrypted card headers to Clipperz",
731 'deleteRecordPanelUpdatingTheInterfaceMessageTitle': "Delete card",
732 'deleteRecordPanelUpdatingTheInterfaceMessageText': "Updating the interface",
733
734// Cards block - no record selected
735 'recordDetailNoRecordSelectedTitle': "No card selected",
736 'recordDetailNoRecordSelectedDescription': "<p>Please select a card from the list on the left.</p>",
737
738 // Cards block - loading messages
739 'recordDetailLoadingRecordMessage': "Downloading encrypted card from Clipperz",
740 'recordDetailDecryptingRecordMessage': "Local decryption of card\'s data",
741 'recordDetailLoadingRecordVersionMessage': "Downloading latest card version",
742 'recordDetailDecryptingRecordVersionMessage': "Local decryption of latest version",
743 'recordDetailLoadingErrorMessageTitle': "Error while downloading the card",
744
745// Cards block - card details
746 'recordDetailNotesLabel': "Notes",
747 'recordDetailLabelFieldColumnLabel': "Field label",
748 'recordDetailDataFieldColumnLabel': "Field data",
749 'recordDetailTypeFieldColumnLabel': "Type",
750
751 'recordDetailSavingChangesMessagePanelInitialTitle': "Saving card",
752 'recordDetailSavingChangesMessagePanelInitialText': "---",
753
754 'recordDetailRemoveFieldButtonLabel': "-",
755 'recordDetailAddFieldButtonLabel': "Add new field",
756 'recordDetailPasswordFieldHelpLabel': "click the stars to select the password and then Ctrl-C to copy",
757
758 'recordDetailPasswordFieldScrambleLabel': "scramble",
759 'recordDetailPasswordFieldUnscrambleLabel': "unscramble",
760
761 'recordDetailDirectLoginBlockTitle': "Direct logins",
762 'recordDetailNewDirectLoginDescription': "<p>Direct login configuration</p>",
763
764 'recordDetailDirectLoginBlockNoDirectLoginConfiguredDescription':"\
765 <p>Does this card contain credentials to access an online service?</p>\
766 <p>Use the bookmarklet to configure a “direct login” from Clipperz with just one click!</p>",
767
768 'recordDetailDeleteDirectLoginButtonLabel': "-",
769 'recordDetailAddNewDirectLoginButtonLabel': "Add new direct login",
770
771 'recordDetailEditButtonLabel': "Edit",
772 'recordDetailSaveButtonLabel': "Save",
773 'recordDetailCancelButtonLabel': "Cancel",
774
775 'newRecordTitleLabel': "_new card_",
776 'newDirectLoginLabelSuffix': "",
777
778// Cards block - save card panel
779 'recordSaveChangesPanelCollectRecordInfoMessageTitle': "Save card",
780 'recordSaveChangesPanelCollectRecordInfoMessageText': "Updating card headers",
781 'recordSaveChangesPanelEncryptUserDataMessageTitle': "Save card",
782 'recordSaveChangesPanelEncryptUserDataMessageText': "Local encryption of card headers",
783 'recordSaveChangesPanelEncryptRecordDataMessageTitle': "Save card",
784 'recordSaveChangesPanelEncryptRecordDataMessageText': "Local encryption of card's data",
785 'recordSaveChangesPanelEncryptRecordVersionDataMessageTitle':"Save card",
786 'recordSaveChangesPanelEncryptRecordVersionDataMessageText':"Local encryption of card's version data",
787 'recordSaveChangesPanelSendingDataToTheServerMessageTitle': "Save card",
788 'recordSaveChangesPanelSendingDataToTheServerMessageText': "Uploading encrypted card's header to Clipperz",
789 'recordSaveChangesPanelUpdatingTheInterfaceMessageTitle': "Save card",
790 'recordSaveChangesPanelUpdatingTheInterfaceMessageText': "Updating the interface",
791
792 //Password Generator strings
793 'passwordGeneratorPanelTitle': "Password generator",
794 'passwordGeneratorPanelOkLabel': "Ok",
795 'passwordGeneratorPanelCancelLabel': "Cancel",
796
797 'passwordGeneratorLowercaseLabel': "abc",
798 'passwordGeneratorUppercaseLabel': "ABC",
799 'passwordGeneratorNumberLabel': "012",
800 'passwordGeneratorSymbolLabel': "@#$",
801
802 'passwordGeneratorLengthLabel': "length:",
803
804
805 //Miscellaneous strings
806
807 'comingSoon': "coming soon …",
808 'panelCollectingEntryopyMessageText': "Collecting entropy",
809 'directLoginConfigurationCheckBoxFieldSelectedValue': "Yes",
810 'directLoginConfigurationCheckBoxFieldNotSelectedValue': "No",
811
812
813
814// NEW - Import panel
815 'importFormats':{
816 'CSV': {
817 'label': "CSV",
818 'description':"<p>A widely recognized file format that stores tabular data. Several password managers can export data to this format.</p>"
819 },
820 'Excel': {
821 'label': "Excel",
822 'description':"<p>The popular spreadsheet from Microsoft. Storing passwords in Excel files is very common but not advisable.</p>"
823 },
824 'KeePass': {
825 'label': "KeePass",
826 'description':"<p>The custom TXT file created by KeePass password manager.</p>"
827 },
828 'PasswordPlus': {
829 'label': "Password Plus",
830 'description':"<p>The custom CSV format produced by Password Plus, a password manager mostly used on mobile devices.</p>"
831 },
832 'Roboform': {
833 'label': "RoboForm",
834 'description':"<p>The special HTML file created by Roboform password manager when displaying Passcard and Safenotes for printing.</p>"
835 },
836 'ClipperzExport': {
837 'label': "JSON",
838 'description':"<p>The file created by Clipperz itself in JSON format. It preserves all information contained in your cards, even direct login configurations.</p>"
839 }
840},
841
842 //JSON
843 'Clipperz_ImportWizard_Title': "JSON import",
844 'importOptions_clipperz_description': "<p>Open the JSON file exported from Clipperz in a text editor. Then copy and paste its content to the text area below.</p>",
845
846 //CSV
847 'CSV_ImportWizard_Title': "CSV import",
848 'importOptions_csv_description_': "\
849 <p>Open the CSV file in a text editor. Then copy and paste its content to the text area below.</p>\
850 <p>Please select the special characters used within your file.</p>",
851
852 //Excel
853 'Excel_ImportWizard_Title': "Excel import",
854 'importOptions_excel_description_': "<p>Open the Excel file and select the cells you want to import. Then copy and paste them to the text area below.</p>",
855
856 //KeePass
857 'KeePass_ImportWizard_Title': "KeePass import",
858 'importOptions_keePass_description_': "<p>Open the TXT file created by Keepass in a text editor. Then copy and paste its content to the text area below.</p>",
859
860 //PasswordPlus
861 'PasswordPlus_ImportWizard_Title': "Password Plus import",
862 'importOptions_passwordPlus_description':"<p>Open the CSV file created by PasswordPlus in a text editor. Then copy and paste its content to the text area below.</p>",
863
864 //RoboForm
865 'RoboForm_ImportWizard_Title': "RoboForm import",
866 'importOptions_roboForm_description': "<p>Open the HTML file created by RoboForm in a text editor. Then copy and paste its content to the text area below.</p>",
867
868
869 'importData_parsingDataTitle': "Import",
870 'importData_parsingDataText': "Parsing data …",
871
872 'importData_previewingDataTitle': "Import",
873 'importData_previewingDataText': "Processing data …",
874
875 'importData_processingDataTitle': "Import",
876 'importData_processingDataText': "Creating new cards …",
877
878'ImportWizard': {
879 'EDIT': "edit",
880 'PREVIEW': "preview",
881 'IMPORT': "import",
882
883 'KEEPASS_SETTINGS': "settings",
884
885 'CSV_EDIT': "paste",
886 'CSV_COLUMNS': "columns",
887 'CSV_HEADER': "labels",
888 'CSV_TITLE': "titles",
889 'CSV_NOTES': "notes",
890 'CSV_FIELDS': "types",
891
892 'EXCEL_EDIT': "edit"
893},
894
895 'CSV_ImportWizard_Columns': "<p>Select the columns you want to import.</p>",
896 'CSV_ImportWizard_Header': "<p>If the first row of the CSV file contains field labels, tick off the checkbox below.</p>",
897 'CSV_ImportWizard_Header_Settings_firstRowHeaderLabel':"Use the first row as labels?",
898 'CSV_ImportWizard_Title': "<p>Select the column that contains titles of the cards you are importing. (mandatory)</p>",
899 'CSV_ImportWizard_Notes': "<p>Select the column that represents a \"notes\" field. (optional)</p>",
900 'CSV_ImportWizard_Notes_Settings_noSelectionLabel': "\"notes\" field not present",
901 'CSV_ImportWizard_Fields': "<p>Select the correct type for each column from the drop down lists.</p>",
902 'CSV_ImportWizard_Fields_MissingLabelWarning': "Missing label",
903
904 'importData_importConfirmation_title': "Import",
905 'importData_importConfirmation_text': "Do you want to import __numberOfRecords__ cards?",
906
907
908 //Vulnerability warning
909 'VulnerabilityWarning_Panel_title': "Vulnerability warning",
910 'VulnerabilityWarning_Panel_message': "The action as been aborted due to a catched vulnerability",
911 'VulnerabilityWarning_Panel_buttonLabel':"Close",
912
913
914
915 //All the loginInfo panel infos
916
917 'WELCOME_BACK': "Welcome back!",
918
919 'currentConnectionText': "You are connected from ip&nbsp;__ip__, apparently from __country__, using __browser__ on __operatingSystem__.",
920 'latestConnectionText': "Your latest connection was __elapsedTimeDescription__ (__time__) from ip&nbsp;__ip__, apparently from __country__, using __browser__ on __operatingSystem__.",
921
922 'fullLoginHistoryLinkLabel': "show login history",
923
924'elapsedTimeDescriptions': {
925 'MORE_THAN_A_MONTH_AGO': "more than a month ago",
926 'MORE_THAN_A_WEEK_AGO': "more than a week ago",
927 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago",
928 'YESTERDAY': "yesterday",
929 '*_DAYS_AGO': "__elapsed__ days ago",
930 'ABOUT_AN_HOUR_AGO': "about an hour ago",
931 '*_HOURS_AGO': "__elapsed__ hours ago",
932 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago",
933 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago"
934},
935
936 'unknown_ip': "unknown",
937
938'countries': {
939 '--': "unknown",
940 'AD': "Andorra",
941 'AE': "United Arab Emirates",
942 'AF': "Afghanistan",
943 'AG': "Antigua and Barbuda",
944 'AI': "Anguilla",
945 'AL': "Albania",
946 'AM': "Armenia",
947 'AN': "Netherlands Antilles",
948 'AO': "Angola",
949 'AP': "Non-Spec Asia Pas Location",
950 'AR': "Argentina",
951 'AS': "American Samoa",
952 'AT': "Austria",
953 'AU': "Australia",
954 'AW': "Aruba",
955 'AX': "Aland Islands",
956 'AZ': "Azerbaijan",
957 'BA': "Bosnia and Herzegowina",
958 'BB': "Barbados",
959 'BD': "Bangladesh",
960 'BE': "Belgium",
961 'BF': "Burkina Faso",
962 'BG': "Bulgaria",
963 'BH': "Bahrain",
964 'BI': "Burundi",
965 'BJ': "Benin",
966 'BM': "Bermuda",
967 'BN': "Brunei Darussalam",
968 'BO': "Bolivia",
969 'BR': "Brazil",
970 'BS': "Bahamas",
971 'BT': "Bhutan",
972 'BW': "Botswana",
973 'BY': "Belarus",
974 'BZ': "Belize",
975 'CA': "Canada",
976 'CD': "Congo the Democratic Republic of the",
977 'CF': "Central African Republic",
978 'CH': "Switzerland",
979 'CI': "Cote D'ivoire",
980 'CK': "Cook Islands",
981 'CL': "Chile",
982 'CM': "Cameroon",
983 'CN': "China",
984 'CO': "Colombia",
985 'CR': "Costa Rica",
986 'CS': "Serbia and Montenegro",
987 'CU': "Cuba",
988 'CY': "Cyprus",
989 'CZ': "Czech Republic",
990 'DE': "Germany",
991 'DJ': "Djibouti",
992 'DK': "Denmark",
993 'DO': "Dominican Republic",
994 'DZ': "Algeria",
995 'EC': "Ecuador",
996 'EE': "Estonia",
997 'EG': "Egypt",
998 'ER': "Eritrea",
999 'ES': "Spain",
1000 'ET': "Ethiopia",
1001 'EU': "European Union",
1002 'FI': "Finland",
1003 'FJ': "Fiji",
1004 'FM': "Micronesia Federated States of",
1005 'FO': "Faroe Islands",
1006 'FR': "France",
1007 'GA': "Gabon",
1008 'GB': "United Kingdom",
1009 'GD': "Grenada",
1010 'GE': "Georgia",
1011 'GF': "French Guiana",
1012 'GG': "Guernsey",
1013 'GH': "Ghana",
1014 'GI': "Gibraltar",
1015 'GL': "Greenland",
1016 'GM': "Gambia",
1017 'GP': "Guadeloupe",
1018 'GR': "Greece",
1019 'GT': "Guatemala",
1020 'GU': "Guam",
1021 'GW': "Guinea-Bissau",
1022 'GY': "Guyana",
1023 'HK': "Hong Kong",
1024 'HN': "Honduras",
1025 'HR': "Croatia (Local Name: Hrvatska)",
1026 'HT': "Haiti",
1027 'HU': "Hungary",
1028 'ID': "Indonesia",
1029 'IE': "Ireland",
1030 'IL': "Israel",
1031 'IM': "Isle of Man",
1032 'IN': "India",
1033 'IO': "British Indian Ocean Territory",
1034 'IQ': "Iraq",
1035 'IR': "Iran (Islamic Republic of)",
1036 'IS': "Iceland",
1037 'IT': "Italy",
1038 'JE': "Jersey",
1039 'JM': "Jamaica",
1040 'JO': "Jordan",
1041 'JP': "Japan",
1042 'KE': "Kenya",
1043 'KG': "Kyrgyzstan",
1044 'KH': "Cambodia",
1045 'KI': "Kiribati",
1046 'KN': "Saint Kitts and Nevis",
1047 'KR': "Korea Republic of",
1048 'KW': "Kuwait",
1049 'KY': "Cayman Islands",
1050 'KZ': "Kazakhstan",
1051 'LA': "Lao People's Democratic Republic",
1052 'LB': "Lebanon",
1053 'LC': "Saint Lucia",
1054 'LI': "Liechtenstein",
1055 'LK': "Sri Lanka",
1056 'LR': "Liberia",
1057 'LS': "Lesotho",
1058 'LT': "Lithuania",
1059 'LU': "Luxembourg",
1060 'LV': "Latvia",
1061 'LY': "Libyan Arab Jamahiriya",
1062 'MA': "Morocco",
1063 'MC': "Monaco",
1064 'MD': "Moldova Republic of",
1065 'MG': "Madagascar",
1066 'MH': "Marshall Islands",
1067 'MK': "Macedonia the Former Yugoslav Republic of",
1068 'ML': "Mali",
1069 'MM': "Myanmar",
1070 'MN': "Mongolia",
1071 'MO': "Macau",
1072 'MP': "Northern Mariana Islands",
1073 'MR': "Mauritania",
1074 'MS': "Montserrat",
1075 'MT': "Malta",
1076 'MU': "Mauritius",
1077 'MV': "Maldives",
1078 'MW': "Malawi",
1079 'MX': "Mexico",
1080 'MY': "Malaysia",
1081 'MZ': "Mozambique",
1082 'NA': "Namibia",
1083 'NC': "New Caledonia",
1084 'NF': "Norfolk Island",
1085 'NG': "Nigeria",
1086 'NI': "Nicaragua",
1087 'NL': "Netherlands",
1088 'NO': "Norway",
1089 'NP': "Nepal",
1090 'NR': "Nauru",
1091 'NU': "Niue",
1092 'NZ': "New Zealand",
1093 'OM': "Oman",
1094 'PA': "Panama",
1095 'PE': "Peru",
1096 'PF': "French Polynesia",
1097 'PG': "Papua New Guinea",
1098 'PH': "Philippines",
1099 'PK': "Pakistan",
1100 'PL': "Poland",
1101 'PR': "Puerto Rico",
1102 'PS': "Palestinian Territory Occupied",
1103 'PT': "Portugal",
1104 'PW': "Palau",
1105 'PY': "Paraguay",
1106 'QA': "Qatar",
1107 'RO': "Romania",
1108 'RS': "Serbia",
1109 'RU': "Russian Federation",
1110 'RW': "Rwanda",
1111 'SA': "Saudi Arabia",
1112 'SB': "Solomon Islands",
1113 'SC': "Seychelles",
1114 'SD': "Sudan",
1115 'SE': "Sweden",
1116 'SG': "Singapore",
1117 'SI': "Slovenia",
1118 'SK': "Slovakia (Slovak Republic)",
1119 'SL': "Sierra Leone",
1120 'SM': "San Marino",
1121 'SN': "Senegal",
1122 'SR': "Suriname",
1123 'SV': "El Salvador",
1124 'SY': "Syrian Arab Republic",
1125 'SZ': "Swaziland",
1126 'TC': "Turks and Caicos Islands",
1127 'TG': "Togo",
1128 'TH': "Thailand",
1129 'TJ': "Tajikistan",
1130 'TM': "Turkmenistan",
1131 'TN': "Tunisia",
1132 'TO': "Tonga",
1133 'TR': "Turkey",
1134 'TT': "Trinidad and Tobago",
1135 'TV': "Tuvalu",
1136 'TW': "Taiwan Province of China",
1137 'TZ': "Tanzania United Republic of",
1138 'UA': "Ukraine",
1139 'UG': "Uganda",
1140 'US': "United States",
1141 'UY': "Uruguay",
1142 'UZ': "Uzbekistan",
1143 'VA': "Holy See (Vatican City State)",
1144 'VE': "Venezuela",
1145 'VG': "Virgin Islands (British)",
1146 'VI': "Virgin Islands (U.S.)",
1147 'VN': "Viet Nam",
1148 'VU': "Vanuatu",
1149 'WF': "Wallis and Futuna Islands",
1150 'WS': "Samoa",
1151 'YE': "Yemen",
1152 'ZA': "South Africa",
1153 'ZM': "Zambia",
1154 'ZW': "Zimbabwe",
1155 'ZZ': "Reserved"
1156},
1157
1158'browsers': {
1159 'UNKNOWN': "Unknown",
1160 'MSIE': "Internet Explorer",
1161 'FIREFOX': "Firefox",
1162 'OPERA': "Opera",
1163 'SAFARI': "Safari",
1164 'OMNIWEB': "OmniWeb",
1165 'CAMINO': "Camino",
1166 'CHROME': "Chrome"
1167},
1168
1169'operatingSystems': {
1170 'UNKNOWN': "Unknown",
1171 'WINDOWS': "Windows",
1172 'MAC': "Mac",
1173 'LINUX': "Linux",
1174 'IPHONE': "iPhone",
1175 'MOBILE': "Mobile",
1176 'OPENBSD': "OpenBSD",
1177 'FREEBSD': "FreeBSD",
1178 'NETBSD': "NetBSD"
1179},
1180
1181
1182 //Calendar texts
1183'calendarStrings': {
1184 'months': {
1185 '0':"January",
1186 '1':"February",
1187 '2':"March",
1188 '3':"April",
1189 '4':"May",
1190 '5':"June",
1191 '6':"July",
1192 '7':"August",
1193 '8':"September",
1194 '9':"October",
1195 '10':"November",
1196 '11':"December"
1197 },
1198 'shortMonths':{
1199 '0':"Jan",
1200 '1':"Feb",
1201 '2':"Mar",
1202 '3':"Apr",
1203 '4':"May",
1204 '5':"Jun",
1205 '6':"Jul",
1206 '7':"Aug",
1207 '8':"Sep",
1208 '9':"Oct",
1209 '10':"Nov",
1210 '11':"Dec"
1211 },
1212
1213 'days':{
1214 '0':"Sunday",
1215 '1':"Monday",
1216 '2':"Tuesday",
1217 '3':"Wednesday",
1218 '4':"Thursday",
1219 '5':"Friday",
1220 '6':"Saturday"
1221 },
1222
1223 'shortDays':{
1224 '0':"Sun",
1225 '1':"Mon",
1226 '2':"Tue",
1227 '3':"Wed",
1228 '4':"Thu",
1229 '5':"Fri",
1230 '6':"Sat"
1231 },
1232
1233 'veryShortDays':{
1234 '0':"Su",
1235 '1':"Mo",
1236 '2':"Tu",
1237 '3':"We",
1238 '4':"Th",
1239 '5':"Fr",
1240 '6':"Sa"
1241 },
1242
1243 'amDesignation':"am",
1244 'pmDesignation':"pm"
1245
1246},
1247
1248// Date format
1249 'fullDate_format':"l, F d, Y H:i:s",
1250*/
1251//################################################################################
1252/*
1253'pageHeader': {
1254 'donation':"donAte",
1255 'forum':"foRum",
1256 'credits':"creDits",
1257 'feedback':"feeDback",
1258 'help': "hElp"
1259},
1260
1261
1262'bookmarkletCopy': {
1263 'noExceptionMessage':"The direct login configuration has been collected.",
1264 'exceptionMessage': "Sorry! There was an error while processing the page.",
1265 'copy': "copy",
1266 'successfulMessage':"DONE!",
1267 'failMessage': "Failed! :("
1268},
1269*/
1270//################################################################################
1271
1272'Wizards': {
1273 'DirectLoginWizard': {
1274 'LABEL': {
1275 'name': "label",
1276 'description': "Enter a name for your new direct login."
1277 },
1278 'TYPE': {
1279 'name': "type",
1280 'description': "short description of the different types of direct login available"
1281 },
1282 'CONFIGURATION': {
1283 'name': "config", //"bookmarklet config",
1284 'description': "Paste the code collected by the bookmarklet. (To install the bookmarklet drag the link below to the bookmark bar of your browser.)"
1285 },
1286 'BINDINGS': {
1287 'name': "bindings",
1288 'description': "Select the right value for each field from the drop down menus."
1289 },
1290 'FAVICON': {
1291 'name': "favicon",
1292 'description': "If you are not satisfied with the small icon for this direct login, enter the URL of a new image file (.ico, .png, .jpg)."
1293 },
1294 'DONE': {
1295 'name': "done",
1296 'description': "Congratulations! You have created a new direct login using credentials contained in your '__cardName__' card.\nEnjoy 1-clik access to '__directLoginName__'!"
1297 }
1298 },
1299 'NewUserWizard': {
1300 'CREDENTIALS': {
1301 'name': "credentials",
1302 'description': "[choose you credentials]"
1303 },
1304 'CHECK_CREDENTIALS': {
1305 'name': "check credentials",
1306 'description': "[check credentials]"
1307 },
1308 'TERMS_OF_SERVICE': {
1309 'name': "terms of service",
1310 'description': "[terms of service]"
1311 },
1312 'CREATE_USER': {
1313 'name': "login",
1314 'description': "[create user]"
1315 }//,
1316/*
1317 'LOGIN': {
1318 'name': "login",
1319 'description': "[enjoy Clipperz]"
1320 },
1321*/
1322 }
1323},
1324
1325
1326'exceptionsMessages': {
1327 'Clipperz': {
1328 'Crypto': {
1329 'Base': {
1330 'exception': {
1331 'CorruptedMessage': "Corrupted message"
1332 }
1333 }
1334 }
1335 }
1336},
1337
1338
1339__syntaxFix__: "syntax fix"
1340
1341}
diff --git a/frontend/gamma/js/Clipperz/PM/Toll.js b/frontend/gamma/js/Clipperz/PM/Toll.js
new file mode 100644
index 0000000..a533f51
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Toll.js
@@ -0,0 +1,194 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31
32//=============================================================================
33
34Clipperz.PM.Toll = function(args) {
35 args = args || {};
36
37 this._requestType = args.requestType;
38 this._targetValue = args.targetValue;
39 this._cost = args.cost;
40 this._toll = null;
41
42 return this;
43}
44
45Clipperz.PM.Toll.prototype = MochiKit.Base.update(null, {
46
47 'toString': function() {
48 return "Clipperz.PM.Toll (" + this.requestType() + ": " + this.cost() + " - " + ((this.toll() == null)? 'UNPAID' : 'PAID') + ")";
49 },
50
51 //-------------------------------------------------------------------------
52
53 'requestType': function() {
54 return this._requestType;
55 },
56
57 //-------------------------------------------------------------------------
58
59 'targetValue': function() {
60 return this._targetValue;
61 },
62
63 //-------------------------------------------------------------------------
64
65 'cost': function() {
66 return this._cost;
67 },
68
69 //-------------------------------------------------------------------------
70
71 'toll': function() {
72 return this._toll;
73 },
74
75 //-------------------------------------------------------------------------
76/*
77 '__pay': function() {
78 varresult;
79 vartargetData;
80 vartargetMatchSize;
81 var prefixMatchingBits;
82 varpayment;
83 var i;
84
85 if (this.toll() == null) {
86 i = 0;
87 targetData = new Clipperz.ByteArray("0x" + this.targetValue());
88 targetMatchSize = this.cost();
89
90 payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
91
92 do {
93 varpaymentData;
94
95 //payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
96 payment.increment();
97 paymentData = Clipperz.Crypto.SHA.sha256(payment);
98 // prefixMatchingBits = this.prefixMatchingBits(targetData, paymentData);
99 prefixMatchingBits = Clipperz.ByteArray.prefixMatchingBits(targetData, paymentData);
100 i++;
101 } while (prefixMatchingBits < targetMatchSize);
102
103 this._toll = payment.toHexString().substring(2)
104 }
105
106 return this;
107 },
108 */
109 //-------------------------------------------------------------------------
110
111 'innerDeferredPay': function (aTargetValue, aCost, aPayment) {
112 var deferredResult;
113 var result;
114 var payment;
115 var i;
116
117 result = null;
118 payment = aPayment;
119 i = 0;
120
121 while ((result == null) && (i < Clipperz.PM.Toll.numberOfCloseLoopIterations)) {
122 if (Clipperz.ByteArray.prefixMatchingBits(aTargetValue, Clipperz.Crypto.SHA.sha256(payment)) > aCost) {
123 result = payment;
124 } else {
125 payment.increment();
126 }
127
128 i ++;
129 }
130
131 if (result == null) {
132 deferredResult = MochiKit.Async.callLater(Clipperz.PM.Toll.pauseBetweenEachCloseLoop, MochiKit.Base.method(this, 'innerDeferredPay', aTargetValue, aCost, aPayment));
133 } else {
134 deferredResult = MochiKit.Async.succeed(result);
135 }
136
137 return deferredResult;
138 },
139
140 'deferredPay': function () {
141 vardeferredResult;
142 vartoll;
143
144 toll = this;
145 deferredResult = new Clipperz.Async.Deferred("Toll.deferredPay");
146//deferredResult.addLog("--->>> deferredPay - " + this.cost());
147 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes', 32);
148 deferredResult.addMethod(toll, 'innerDeferredPay', new Clipperz.ByteArray("0x" + this.targetValue()), this.cost());
149 deferredResult.addCallback(MochiKit.Base.bind(function(aPayment) {
150 var result;
151
152 result = {
153 targetValue: this.targetValue(),
154 toll: aPayment.toHexString().substr(2)
155 };
156
157 return result;
158 }, this));
159//deferredResult.addLog("<<<--- deferredPay - " + this.cost());
160 deferredResult.callback();
161
162 return deferredResult;
163 },
164
165 //=========================================================================
166 __syntaxFix__: "syntax fix"
167
168});
169
170
171Clipperz.PM.Toll.validate = function(aTargetValue, aToll, aCost) {
172 var result;
173 vartollValue;
174 var targetValue;
175 var hashedTollValue;
176 var payedToll;
177
178 tollValue = new Clipperz.ByteArray("0x" + aToll);
179 targetValue = new Clipperz.ByteArray("0x" + aTargetValue);
180 hashedTollValue = Clipperz.Crypto.SHA.sha256(tollValue);
181
182 payedToll = Clipperz.ByteArray.prefixMatchingBits(targetValue, hashedTollValue);
183
184 if (payedToll < aCost) {
185 result = false;
186 } else {
187 result = true;
188 }
189
190 return result;
191};
192
193Clipperz.PM.Toll.numberOfCloseLoopIterations = 50;
194Clipperz.PM.Toll.pauseBetweenEachCloseLoop = 0.5; \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
new file mode 100644
index 0000000..169946a
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
@@ -0,0 +1,120 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //download.js
31 //Download
32//
33 //Created by Giulio Cesare Solaroli on 3/15/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_CoverActions_downloadWidth = 46.0;
39var kClipperz_PM_UI_Canvas_CoverActions_downloadHeight = 46.0;
40
41function Clipperz_PM_UI_Canvas_CoverActions_download(canvas, aColor, aFillColor, aThickness)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var stroke;
47 var path;
48 var pointX;
49 var pointY;
50 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio;
52 else
53 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
55
56 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
59
60 // arrow
61
62 stroke = aThickness;
63 stroke *= resolution;
64 if (stroke < 1.0)
65 stroke = Math.ceil(stroke);
66 else
67 stroke = Math.round(stroke);
68 stroke /= resolution;
69 alignStroke = (0.5 * stroke * resolution) % 1.0;
70 context.beginPath();
71 pointX = 16.5;
72 pointY = 22.5;
73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
75 context.moveTo(pointX, pointY);
76 pointX = 19.5;
77 pointY = 8.5;
78 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
79 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
80 context.lineTo(pointX, pointY);
81 pointX = 30.038;
82 pointY = 10.605;
83 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
84 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
85 context.lineTo(pointX, pointY);
86 pointX = 27.354;
87 pointY = 24.354;
88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
90 context.lineTo(pointX, pointY);
91 pointX = 33.28;
92 pointY = 25.293;
93 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
94 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
95 context.lineTo(pointX, pointY);
96 pointX = 19.81;
97 pointY = 36.828;
98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
100 context.lineTo(pointX, pointY);
101 pointX = 10.07;
102 pointY = 21.617;
103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
105 context.lineTo(pointX, pointY);
106 pointX = 16.5;
107 pointY = 22.5;
108 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
109 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
110 context.lineTo(pointX, pointY);
111 context.closePath();
112 context.fillStyle = aFillColor;
113 context.fill();
114 context.strokeStyle = aColor;
115 context.lineWidth = stroke;
116 context.lineCap = "square";
117 context.stroke();
118
119 context.restore();
120}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
new file mode 100644
index 0000000..b8e535b
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
@@ -0,0 +1,208 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //look.js
31 //Look
32//
33 //Created by Giulio Cesare Solaroli on 3/15/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_CoverActions_lookWidth = 46.0;
39var kClipperz_PM_UI_Canvas_CoverActions_lookHeight = 46.0;
40
41function Clipperz_PM_UI_Canvas_CoverActions_look(canvas, aColor, aFillColor, aThickness)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var stroke;
47 var path;
48 var pointX;
49 var pointY;
50 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio;
52 else
53 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
55
56 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_lookWidth, kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
59
60 // Layer 6
61
62 stroke = aThickness;
63 stroke *= resolution;
64 if (stroke < 1.0)
65 stroke = Math.ceil(stroke);
66 else
67 stroke = Math.round(stroke);
68 stroke /= resolution;
69 alignStroke = (0.5 * stroke * resolution) % 1.0;
70 context.save();
71 context.translate(17.5, 23.0);
72 context.rotate(-0.503);
73 context.translate(-17.5, -23.0);
74 context.beginPath();
75 pointX = 28.5;
76 pointY = 31.5;
77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
79 context.moveTo(pointX, pointY);
80 pointX = 28.5;
81 pointY = 14.5;
82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
84 context.lineTo(pointX, pointY);
85 pointX = 6.5;
86 pointY = 14.5;
87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
89 context.lineTo(pointX, pointY);
90 pointX = 6.5;
91 pointY = 31.5;
92 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
93 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
94 context.lineTo(pointX, pointY);
95 pointX = 28.5;
96 pointY = 31.5;
97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
99 context.lineTo(pointX, pointY);
100 context.closePath();
101 context.fillStyle = aFillColor;
102 context.fill();
103 context.strokeStyle = aColor;
104 context.lineWidth = stroke;
105 context.lineCap = "square";
106 context.stroke();
107 context.restore();
108
109 // Layer 3
110
111 stroke = aThickness;
112 stroke *= resolution;
113 if (stroke < 1.0)
114 stroke = Math.ceil(stroke);
115 else
116 stroke = Math.round(stroke);
117 stroke /= resolution;
118 alignStroke = (0.5 * stroke * resolution) % 1.0;
119 context.save();
120 context.translate(22.5, 20.0);
121 context.rotate(-0.071);
122 context.translate(-22.5, -20.0);
123 context.beginPath();
124 pointX = 33.5;
125 pointY = 28.5;
126 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
127 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
128 context.moveTo(pointX, pointY);
129 pointX = 33.5;
130 pointY = 11.5;
131 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
132 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
133 context.lineTo(pointX, pointY);
134 pointX = 11.5;
135 pointY = 11.5;
136 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
137 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
138 context.lineTo(pointX, pointY);
139 pointX = 11.5;
140 pointY = 28.5;
141 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
142 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
143 context.lineTo(pointX, pointY);
144 pointX = 33.5;
145 pointY = 28.5;
146 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
147 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
148 context.lineTo(pointX, pointY);
149 context.closePath();
150 context.fillStyle = aFillColor;
151 context.fill();
152 context.strokeStyle = aColor;
153 context.lineWidth = stroke;
154 context.lineCap = "square";
155 context.stroke();
156 context.restore();
157
158 // Layer 4
159
160 stroke = aThickness;
161 stroke *= resolution;
162 if (stroke < 1.0)
163 stroke = Math.ceil(stroke);
164 else
165 stroke = Math.round(stroke);
166 stroke /= resolution;
167 alignStroke = (0.5 * stroke * resolution) % 1.0;
168 context.save();
169 context.translate(27.5, 18.0);
170 context.rotate(0.232);
171 context.translate(-27.5, -18.0);
172 context.beginPath();
173 pointX = 38.5;
174 pointY = 26.5;
175 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
176 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
177 context.moveTo(pointX, pointY);
178 pointX = 38.5;
179 pointY = 9.5;
180 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
181 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
182 context.lineTo(pointX, pointY);
183 pointX = 16.5;
184 pointY = 9.5;
185 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
186 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
187 context.lineTo(pointX, pointY);
188 pointX = 16.5;
189 pointY = 26.5;
190 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
191 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
192 context.lineTo(pointX, pointY);
193 pointX = 38.5;
194 pointY = 26.5;
195 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
196 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
197 context.lineTo(pointX, pointY);
198 context.closePath();
199 context.fillStyle = aFillColor;
200 context.fill();
201 context.strokeStyle = aColor;
202 context.lineWidth = stroke;
203 context.lineCap = "square";
204 context.stroke();
205 context.restore();
206
207 context.restore();
208}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
new file mode 100644
index 0000000..9c4e5ba
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
@@ -0,0 +1,209 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //directLogin.js
31 //directLogin
32//
33 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Features_directLoginWidth = 76.0;
39var kClipperz_PM_UI_Canvas_Features_directLoginHeight = 76.0;
40
41function Clipperz_PM_UI_Canvas_Features_directLogin(canvas, aColor, aBannerColor, aBannerBackgroundColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var stroke;
47 var path;
48 var pointX;
49 var pointY;
50 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio;
52 else
53 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight);
55
56 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_directLoginWidth, kClipperz_PM_UI_Canvas_Features_directLoginHeight);
59
60 // Layer 2
61
62 stroke = 6.0;
63 stroke *= resolution;
64 if (stroke < 1.0)
65 stroke = Math.ceil(stroke);
66 else
67 stroke = Math.round(stroke);
68 stroke /= resolution;
69 alignStroke = (0.5 * stroke * resolution) % 1.0;
70 context.beginPath();
71 pointX = 30.0;
72 pointY = 41.0;
73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
75 context.moveTo(pointX, pointY);
76 pointX = 45.579;
77 pointY = 25.451;
78 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
79 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
80 context.lineTo(pointX, pointY);
81 context.strokeStyle = aColor;
82 context.lineWidth = stroke;
83 context.lineCap = "square";
84 context.stroke();
85
86 alignStroke = 0.0;
87 context.beginPath();
88 pointX = 34.207;
89 pointY = 45.697;
90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
92 context.moveTo(pointX, pointY);
93 pointX = 24.101;
94 pointY = 37.52;
95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
97 context.lineTo(pointX, pointY);
98 pointX = 24.122;
99 pointY = 47.828;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 context.lineTo(pointX, pointY);
103 pointX = 34.207;
104 pointY = 45.697;
105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
107 context.lineTo(pointX, pointY);
108 context.closePath();
109 context.fillStyle = aColor;
110 context.fill();
111
112 stroke = 6.0;
113 stroke *= resolution;
114 if (stroke < 1.0)
115 stroke = Math.ceil(stroke);
116 else
117 stroke = Math.round(stroke);
118 stroke /= resolution;
119 alignStroke = (0.5 * stroke * resolution) % 1.0;
120 context.beginPath();
121 pointX = 24.631;
122 pointY = 28.971;
123 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
124 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
125 context.moveTo(pointX, pointY);
126 pointX = 46.497;
127 pointY = 26.451;
128 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
129 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
130 context.lineTo(pointX, pointY);
131 context.strokeStyle = aColor;
132 context.stroke();
133
134 alignStroke = 0.0;
135 context.beginPath();
136 pointX = 25.014;
137 pointY = 35.265;
138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
140 context.moveTo(pointX, pointY);
141 pointX = 22.166;
142 pointY = 22.58;
143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
145 context.lineTo(pointX, pointY);
146 pointX = 15.784;
147 pointY = 30.675;
148 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
149 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
150 context.lineTo(pointX, pointY);
151 pointX = 25.014;
152 pointY = 35.265;
153 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
154 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
155 context.lineTo(pointX, pointY);
156 context.closePath();
157 context.fillStyle = aColor;
158 context.fill();
159
160 stroke = 6.0;
161 stroke *= resolution;
162 if (stroke < 1.0)
163 stroke = Math.ceil(stroke);
164 else
165 stroke = Math.round(stroke);
166 stroke /= resolution;
167 alignStroke = (0.5 * stroke * resolution) % 1.0;
168 context.beginPath();
169 pointX = 42.282;
170 pointY = 47.03;
171 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
172 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
173 context.moveTo(pointX, pointY);
174 pointX = 47.771;
175 pointY = 25.714;
176 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
177 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
178 context.lineTo(pointX, pointY);
179 context.strokeStyle = aColor;
180 context.stroke();
181
182 alignStroke = 0.0;
183 context.beginPath();
184 pointX = 48.294;
185 pointY = 48.929;
186 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
187 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
188 context.moveTo(pointX, pointY);
189 pointX = 35.432;
190 pointY = 47.039;
191 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
192 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
193 context.lineTo(pointX, pointY);
194 pointX = 40.7;
195 pointY = 55.899;
196 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
197 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
198 context.lineTo(pointX, pointY);
199 pointX = 48.294;
200 pointY = 48.929;
201 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
202 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
203 context.lineTo(pointX, pointY);
204 context.closePath();
205 context.fillStyle = aColor;
206 context.fill();
207
208 context.restore();
209}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
new file mode 100644
index 0000000..501b69b
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
@@ -0,0 +1,237 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //protect.js
31 //protect
32//
33 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Features_protectWidth = 76.0;
39var kClipperz_PM_UI_Canvas_Features_protectHeight = 76.0;
40
41function Clipperz_PM_UI_Canvas_Features_protect(canvas, aColor, aBannerColor, aBannerBackgroundColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 var controlPoint1X;
50 var controlPoint1Y;
51 var controlPoint2X;
52 var controlPoint2Y;
53 var stroke;
54 if (window.devicePixelRatio)
55 resolution = window.devicePixelRatio;
56 else
57 resolution = 1.0;
58 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight);
59
60 context.save();
61 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight);
62 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_protectWidth, kClipperz_PM_UI_Canvas_Features_protectHeight);
63
64 // Layer 1
65
66 alignStroke = 0.0;
67 context.beginPath();
68 pointX = 38.5;
69 pointY = 36.0;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY);
73 pointX = 37.068;
74 pointY = 38.816;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 controlPoint1X = 37.41;
78 controlPoint1Y = 36.234;
79 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
80 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
81 controlPoint2X = 37.175;
82 controlPoint2Y = 37.907;
83 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
84 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
85 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
86 pointX = 37.031;
87 pointY = 40.802;
88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
90 controlPoint1X = 36.991;
91 controlPoint1Y = 39.474;
92 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
93 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
94 controlPoint2X = 36.98;
95 controlPoint2Y = 40.141;
96 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
97 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
98 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
99 pointX = 37.258;
100 pointY = 42.23;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 controlPoint1X = 37.068;
104 controlPoint1Y = 41.283;
105 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
106 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
107 controlPoint2X = 37.139;
108 controlPoint2Y = 41.762;
109 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
110 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
111 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
112 pointX = 38.348;
113 pointY = 43.979;
114 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
115 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
116 controlPoint1X = 37.402;
117 controlPoint1Y = 42.799;
118 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
119 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
120 controlPoint2X = 37.682;
121 controlPoint2Y = 43.798;
122 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
123 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
124 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
125 pointX = 38.5;
126 pointY = 36.0;
127 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
128 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
129 controlPoint1X = 40.249;
130 controlPoint1Y = 44.497;
131 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
132 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
133 controlPoint2X = 40.723;
134 controlPoint2Y = 36.303;
135 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
136 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
137 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
138 pointX = 38.5;
139 pointY = 36.0;
140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
142 context.lineTo(pointX, pointY);
143 context.closePath();
144 pointX = 50.0;
145 pointY = 52.0;
146 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
147 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
148 context.moveTo(pointX, pointY);
149 pointX = 26.0;
150 pointY = 52.0;
151 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
152 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
153 context.lineTo(pointX, pointY);
154 pointX = 26.0;
155 pointY = 33.0;
156 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
157 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
158 context.lineTo(pointX, pointY);
159 pointX = 50.0;
160 pointY = 33.0;
161 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
162 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
163 context.lineTo(pointX, pointY);
164 pointX = 50.0;
165 pointY = 52.0;
166 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
167 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
168 context.lineTo(pointX, pointY);
169 context.closePath();
170 context.fillStyle = aColor;
171 context.fill();
172
173 alignStroke = 0.0;
174 context.beginPath();
175 pointX = 47.0;
176 pointY = 32.463;
177 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
178 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
179 context.moveTo(pointX, pointY);
180 pointX = 38.0;
181 pointY = 52.0;
182 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
183 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
184 controlPoint1X = 47.0;
185 controlPoint1Y = 52.925;
186 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
187 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
188 controlPoint2X = 38.0;
189 controlPoint2Y = 52.0;
190 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
191 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
192 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
193 pointX = 29.0;
194 pointY = 32.463;
195 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
196 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
197 controlPoint1X = 38.0;
198 controlPoint1Y = 52.0;
199 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
200 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
201 controlPoint2X = 29.0;
202 controlPoint2Y = 52.925;
203 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
204 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
205 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
206 pointX = 47.0;
207 pointY = 32.463;
208 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
209 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
210 controlPoint1X = 29.0;
211 controlPoint1Y = 12.0;
212 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
213 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
214 controlPoint2X = 47.0;
215 controlPoint2Y = 12.0;
216 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
217 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
218 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
219 context.closePath();
220 context.strokeStyle = aColor;
221 stroke = 4.0;
222 stroke *= resolution;
223 if (stroke < 1.0)
224 stroke = Math.ceil(stroke);
225 else
226 stroke = Math.round(stroke);
227 stroke /= resolution;
228 stroke *= 2.0;
229 context.lineWidth = stroke;
230 context.lineCap = "square";
231 context.save();
232 context.clip();
233 context.stroke();
234 context.restore();
235
236 context.restore();
237}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
new file mode 100644
index 0000000..825a17e
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
@@ -0,0 +1,1719 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //share.js
31 //share
32//
33 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Features_shareWidth = 76.0;
39var kClipperz_PM_UI_Canvas_Features_shareHeight = 76.0;
40
41function Clipperz_PM_UI_Canvas_Features_share(canvas, aColor, aBannerColor, aBannerBackgroundColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 var controlPoint1X;
50 var controlPoint1Y;
51 var controlPoint2X;
52 var controlPoint2Y;
53 var stroke;
54 if (window.devicePixelRatio)
55 resolution = window.devicePixelRatio;
56 else
57 resolution = 1.0;
58 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight);
59
60 context.save();
61 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight);
62 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_shareWidth, kClipperz_PM_UI_Canvas_Features_shareHeight);
63
64 // Layer 1
65
66 alignStroke = 0.0;
67 context.beginPath();
68 pointX = 43.179;
69 pointY = 18.621;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY);
73 pointX = 37.163;
74 pointY = 12.605;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 controlPoint1X = 43.179;
78 controlPoint1Y = 15.32;
79 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
80 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
81 controlPoint2X = 40.463;
82 controlPoint2Y = 12.605;
83 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
84 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
85 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
86 pointX = 31.147;
87 pointY = 18.621;
88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
90 controlPoint1X = 33.863;
91 controlPoint1Y = 12.605;
92 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
93 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
94 controlPoint2X = 31.147;
95 controlPoint2Y = 15.32;
96 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
97 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
98 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
99 pointX = 37.163;
100 pointY = 24.637;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 controlPoint1X = 31.147;
104 controlPoint1Y = 21.921;
105 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
106 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
107 controlPoint2X = 33.863;
108 controlPoint2Y = 24.637;
109 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
110 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
111 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
112 pointX = 43.179;
113 pointY = 18.621;
114 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
115 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
116 controlPoint1X = 40.463;
117 controlPoint1Y = 24.637;
118 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
119 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
120 controlPoint2X = 43.179;
121 controlPoint2Y = 21.921;
122 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
123 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
124 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
125 context.closePath();
126 context.fillStyle = aColor;
127 context.fill();
128
129 alignStroke = 0.0;
130 context.beginPath();
131 pointX = 56.548;
132 pointY = 53.379;
133 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
134 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
135 context.moveTo(pointX, pointY);
136 pointX = 51.2;
137 pointY = 48.032;
138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
140 controlPoint1X = 56.548;
141 controlPoint1Y = 50.446;
142 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
143 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
144 controlPoint2X = 54.134;
145 controlPoint2Y = 48.032;
146 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
147 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
148 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
149 pointX = 45.853;
150 pointY = 53.379;
151 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
152 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
153 controlPoint1X = 48.267;
154 controlPoint1Y = 48.032;
155 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
156 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
157 controlPoint2X = 45.853;
158 controlPoint2Y = 50.446;
159 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
160 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
161 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
162 pointX = 51.2;
163 pointY = 58.727;
164 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
165 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
166 controlPoint1X = 45.853;
167 controlPoint1Y = 56.313;
168 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
169 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
170 controlPoint2X = 48.267;
171 controlPoint2Y = 58.727;
172 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
173 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
174 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
175 pointX = 56.548;
176 pointY = 53.379;
177 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
178 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
179 controlPoint1X = 54.134;
180 controlPoint1Y = 58.727;
181 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
182 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
183 controlPoint2X = 56.548;
184 controlPoint2Y = 56.313;
185 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
186 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
187 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
188 context.closePath();
189 context.fillStyle = aColor;
190 context.fill();
191
192 alignStroke = 0.0;
193 context.beginPath();
194 pointX = 31.147;
195 pointY = 38.674;
196 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
197 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
198 context.moveTo(pointX, pointY);
199 pointX = 25.8;
200 pointY = 33.326;
201 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
202 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
203 controlPoint1X = 31.147;
204 controlPoint1Y = 35.74;
205 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
206 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
207 controlPoint2X = 28.733;
208 controlPoint2Y = 33.326;
209 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
210 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
211 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
212 pointX = 20.452;
213 pointY = 38.674;
214 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
215 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
216 controlPoint1X = 22.866;
217 controlPoint1Y = 33.326;
218 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
219 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
220 controlPoint2X = 20.452;
221 controlPoint2Y = 35.74;
222 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
223 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
224 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
225 pointX = 25.8;
226 pointY = 44.021;
227 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
228 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
229 controlPoint1X = 20.452;
230 controlPoint1Y = 41.607;
231 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
232 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
233 controlPoint2X = 22.866;
234 controlPoint2Y = 44.021;
235 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
236 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
237 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
238 pointX = 31.147;
239 pointY = 38.674;
240 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
241 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
242 controlPoint1X = 28.733;
243 controlPoint1Y = 44.021;
244 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
245 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
246 controlPoint2X = 31.147;
247 controlPoint2Y = 41.607;
248 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
249 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
250 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
251 context.closePath();
252 context.fillStyle = aColor;
253 context.fill();
254
255 alignStroke = 0.0;
256 context.beginPath();
257 pointX = 39.168;
258 pointY = 48.032;
259 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
260 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
261 context.moveTo(pointX, pointY);
262 pointX = 33.821;
263 pointY = 42.684;
264 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
265 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
266 controlPoint1X = 39.168;
267 controlPoint1Y = 45.098;
268 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
269 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
270 controlPoint2X = 36.754;
271 controlPoint2Y = 42.684;
272 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
273 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
274 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
275 pointX = 28.473;
276 pointY = 48.032;
277 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
278 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
279 controlPoint1X = 30.887;
280 controlPoint1Y = 42.684;
281 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
282 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
283 controlPoint2X = 28.473;
284 controlPoint2Y = 45.098;
285 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
286 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
287 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
288 pointX = 33.821;
289 pointY = 53.379;
290 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
291 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
292 controlPoint1X = 28.473;
293 controlPoint1Y = 50.965;
294 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
295 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
296 controlPoint2X = 30.887;
297 controlPoint2Y = 53.379;
298 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
299 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
300 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
301 pointX = 39.168;
302 pointY = 48.032;
303 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
304 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
305 controlPoint1X = 36.754;
306 controlPoint1Y = 53.379;
307 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
308 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
309 controlPoint2X = 39.168;
310 controlPoint2Y = 50.965;
311 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
312 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
313 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
314 context.closePath();
315 context.fillStyle = aColor;
316 context.fill();
317
318 alignStroke = 0.0;
319 context.beginPath();
320 pointX = 56.548;
321 pointY = 29.984;
322 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
323 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
324 context.moveTo(pointX, pointY);
325 pointX = 53.206;
326 pointY = 26.642;
327 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
328 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
329 controlPoint1X = 56.548;
330 controlPoint1Y = 28.151;
331 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
332 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
333 controlPoint2X = 55.039;
334 controlPoint2Y = 26.642;
335 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
336 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
337 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
338 pointX = 49.863;
339 pointY = 29.984;
340 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
341 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
342 controlPoint1X = 51.372;
343 controlPoint1Y = 26.642;
344 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
345 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
346 controlPoint2X = 49.863;
347 controlPoint2Y = 28.151;
348 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
349 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
350 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
351 pointX = 53.206;
352 pointY = 33.326;
353 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
354 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
355 controlPoint1X = 49.863;
356 controlPoint1Y = 31.817;
357 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
358 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
359 controlPoint2X = 51.372;
360 controlPoint2Y = 33.326;
361 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
362 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
363 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
364 pointX = 56.548;
365 pointY = 29.984;
366 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
367 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
368 controlPoint1X = 55.039;
369 controlPoint1Y = 33.326;
370 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
371 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
372 controlPoint2X = 56.548;
373 controlPoint2Y = 31.817;
374 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
375 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
376 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
377 context.closePath();
378 context.fillStyle = aColor;
379 context.fill();
380
381 alignStroke = 0.0;
382 context.beginPath();
383 pointX = 49.863;
384 pointY = 39.342;
385 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
386 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
387 context.moveTo(pointX, pointY);
388 pointX = 46.521;
389 pointY = 36.0;
390 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
391 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
392 controlPoint1X = 49.863;
393 controlPoint1Y = 37.509;
394 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
395 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
396 controlPoint2X = 48.355;
397 controlPoint2Y = 36.0;
398 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
399 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
400 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
401 pointX = 43.179;
402 pointY = 39.342;
403 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
404 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
405 controlPoint1X = 44.688;
406 controlPoint1Y = 36.0;
407 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
408 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
409 controlPoint2X = 43.179;
410 controlPoint2Y = 37.509;
411 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
412 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
413 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
414 pointX = 46.521;
415 pointY = 42.684;
416 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
417 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
418 controlPoint1X = 43.179;
419 controlPoint1Y = 41.176;
420 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
421 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
422 controlPoint2X = 44.688;
423 controlPoint2Y = 42.684;
424 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
425 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
426 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
427 pointX = 49.863;
428 pointY = 39.342;
429 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
430 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
431 controlPoint1X = 48.355;
432 controlPoint1Y = 42.684;
433 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
434 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
435 controlPoint2X = 49.863;
436 controlPoint2Y = 41.176;
437 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
438 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
439 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
440 context.closePath();
441 context.fillStyle = aColor;
442 context.fill();
443
444 stroke = 1.0;
445 stroke *= resolution;
446 if (stroke < 1.0)
447 stroke = Math.ceil(stroke);
448 else
449 stroke = Math.round(stroke);
450 stroke /= resolution;
451 alignStroke = (0.5 * stroke * resolution) % 1.0;
452 context.beginPath();
453 pointX = 37.163;
454 pointY = 19.289;
455 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
456 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
457 context.moveTo(pointX, pointY);
458 pointX = 53.206;
459 pointY = 29.984;
460 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
461 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
462 context.lineTo(pointX, pointY);
463 context.strokeStyle = aColor;
464 context.lineWidth = stroke;
465 context.lineCap = "square";
466 context.stroke();
467
468 stroke = 1.0;
469 stroke *= resolution;
470 if (stroke < 1.0)
471 stroke = Math.ceil(stroke);
472 else
473 stroke = Math.round(stroke);
474 stroke /= resolution;
475 alignStroke = (0.5 * stroke * resolution) % 1.0;
476 context.beginPath();
477 pointX = 50.532;
478 pointY = 54.048;
479 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
480 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
481 context.moveTo(pointX, pointY);
482 pointX = 37.163;
483 pointY = 48.7;
484 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
485 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
486 context.lineTo(pointX, pointY);
487 context.strokeStyle = aColor;
488 context.stroke();
489
490 stroke = 1.0;
491 stroke *= resolution;
492 if (stroke < 1.0)
493 stroke = Math.ceil(stroke);
494 else
495 stroke = Math.round(stroke);
496 stroke /= resolution;
497 alignStroke = (0.5 * stroke * resolution) % 1.0;
498 context.beginPath();
499 pointX = 27.805;
500 pointY = 33.995;
501 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
502 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
503 context.moveTo(pointX, pointY);
504 pointX = 33.153;
505 pointY = 24.637;
506 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
507 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
508 context.lineTo(pointX, pointY);
509 context.strokeStyle = aColor;
510 context.stroke();
511
512 stroke = 1.0;
513 stroke *= resolution;
514 if (stroke < 1.0)
515 stroke = Math.ceil(stroke);
516 else
517 stroke = Math.round(stroke);
518 stroke /= resolution;
519 alignStroke = (0.5 * stroke * resolution) % 1.0;
520 context.beginPath();
521 pointX = 38.5;
522 pointY = 24.637;
523 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
524 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
525 context.moveTo(pointX, pointY);
526 pointX = 45.184;
527 pointY = 36.668;
528 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
529 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
530 context.lineTo(pointX, pointY);
531 context.strokeStyle = aColor;
532 context.stroke();
533
534 stroke = 1.0;
535 stroke *= resolution;
536 if (stroke < 1.0)
537 stroke = Math.ceil(stroke);
538 else
539 stroke = Math.round(stroke);
540 stroke /= resolution;
541 alignStroke = (0.5 * stroke * resolution) % 1.0;
542 context.beginPath();
543 pointX = 37.163;
544 pointY = 19.289;
545 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
546 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
547 context.moveTo(pointX, pointY);
548 pointX = 34.155;
549 pointY = 44.857;
550 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
551 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
552 context.lineTo(pointX, pointY);
553 context.strokeStyle = aColor;
554 context.stroke();
555
556 stroke = 1.0;
557 stroke *= resolution;
558 if (stroke < 1.0)
559 stroke = Math.ceil(stroke);
560 else
561 stroke = Math.round(stroke);
562 stroke /= resolution;
563 alignStroke = (0.5 * stroke * resolution) % 1.0;
564 context.beginPath();
565 pointX = 26.468;
566 pointY = 36.668;
567 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
568 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
569 context.moveTo(pointX, pointY);
570 pointX = 52.871;
571 pointY = 30.151;
572 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
573 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
574 context.lineTo(pointX, pointY);
575 context.strokeStyle = aColor;
576 context.stroke();
577
578 stroke = 1.0;
579 stroke *= resolution;
580 if (stroke < 1.0)
581 stroke = Math.ceil(stroke);
582 else
583 stroke = Math.round(stroke);
584 stroke /= resolution;
585 alignStroke = (0.5 * stroke * resolution) % 1.0;
586 context.beginPath();
587 pointX = 53.206;
588 pointY = 31.321;
589 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
590 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
591 context.moveTo(pointX, pointY);
592 pointX = 51.535;
593 pointY = 52.878;
594 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
595 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
596 context.lineTo(pointX, pointY);
597 context.strokeStyle = aColor;
598 context.stroke();
599
600 stroke = 1.0;
601 stroke *= resolution;
602 if (stroke < 1.0)
603 stroke = Math.ceil(stroke);
604 else
605 stroke = Math.round(stroke);
606 stroke /= resolution;
607 alignStroke = (0.5 * stroke * resolution) % 1.0;
608 context.beginPath();
609 pointX = 26.468;
610 pointY = 38.005;
611 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
612 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
613 context.moveTo(pointX, pointY);
614 pointX = 46.856;
615 pointY = 39.175;
616 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
617 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
618 context.lineTo(pointX, pointY);
619 context.strokeStyle = aColor;
620 context.stroke();
621
622 stroke = 1.0;
623 stroke *= resolution;
624 if (stroke < 1.0)
625 stroke = Math.ceil(stroke);
626 else
627 stroke = Math.round(stroke);
628 stroke /= resolution;
629 alignStroke = (0.5 * stroke * resolution) % 1.0;
630 context.beginPath();
631 pointX = 26.468;
632 pointY = 38.005;
633 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
634 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
635 context.moveTo(pointX, pointY);
636 pointX = 34.489;
637 pointY = 48.7;
638 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
639 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
640 context.lineTo(pointX, pointY);
641 context.strokeStyle = aColor;
642 context.stroke();
643
644 stroke = 1.0;
645 stroke *= resolution;
646 if (stroke < 1.0)
647 stroke = Math.ceil(stroke);
648 else
649 stroke = Math.round(stroke);
650 stroke /= resolution;
651 alignStroke = (0.5 * stroke * resolution) % 1.0;
652 context.beginPath();
653 pointX = 34.489;
654 pointY = 48.7;
655 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
656 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
657 context.moveTo(pointX, pointY);
658 pointX = 46.521;
659 pointY = 39.342;
660 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
661 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
662 context.lineTo(pointX, pointY);
663 context.strokeStyle = aColor;
664 context.stroke();
665
666 // Layer 2
667
668 alignStroke = 0.0;
669 context.beginPath();
670 pointX = 38.974;
671 pointY = 0.013;
672 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
673 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
674 context.moveTo(pointX, pointY);
675 pointX = 53.593;
676 pointY = 3.386;
677 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
678 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
679 controlPoint1X = 44.035;
680 controlPoint1Y = 0.11;
681 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
682 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
683 controlPoint2X = 48.977;
684 controlPoint2Y = 1.35;
685 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
686 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
687 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
688 pointX = 3.386;
689 pointY = 53.593;
690 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
691 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
692 context.lineTo(pointX, pointY);
693 pointX = 0.011;
694 pointY = 37.17;
695 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
696 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
697 controlPoint1X = 1.013;
698 controlPoint1Y = 48.448;
699 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
700 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
701 controlPoint2X = -0.062;
702 controlPoint2Y = 42.82;
703 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
704 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
705 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
706 pointX = 37.17;
707 pointY = 0.011;
708 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
709 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
710 context.lineTo(pointX, pointY);
711 pointX = 38.974;
712 pointY = 0.013;
713 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
714 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
715 controlPoint1X = 38.325;
716 controlPoint1Y = -0.004;
717 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
718 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
719 controlPoint2X = 37.723;
720 controlPoint2Y = -0.004;
721 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
722 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
723 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
724 pointX = 38.974;
725 pointY = 0.013;
726 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
727 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
728 context.lineTo(pointX, pointY);
729 context.closePath();
730 context.fillStyle = aBannerBackgroundColor;
731 context.fill();
732
733 alignStroke = 0.0;
734 context.beginPath();
735 pointX = 6.58;
736 pointY = 36.628;
737 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
738 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
739 context.moveTo(pointX, pointY);
740 pointX = 7.533;
741 pointY = 34.418;
742 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
743 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
744 controlPoint1X = 6.575;
745 controlPoint1Y = 35.794;
746 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
747 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
748 controlPoint2X = 6.893;
749 controlPoint2Y = 35.058;
750 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
751 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
752 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
753 pointX = 10.253;
754 pointY = 33.382;
755 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
756 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
757 controlPoint1X = 8.389;
758 controlPoint1Y = 33.562;
759 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
760 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
761 controlPoint2X = 9.296;
762 controlPoint2Y = 33.216;
763 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
764 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
765 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
766 pointX = 11.555;
767 pointY = 33.979;
768 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
769 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
770 controlPoint1X = 10.787;
771 controlPoint1Y = 33.479;
772 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
773 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
774 controlPoint2X = 11.221;
775 controlPoint2Y = 33.678;
776 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
777 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
778 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
779 pointX = 10.492;
780 pointY = 35.043;
781 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
782 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
783 context.lineTo(pointX, pointY);
784 pointX = 9.673;
785 pointY = 34.756;
786 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
787 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
788 controlPoint1X = 10.179;
789 controlPoint1Y = 34.868;
790 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
791 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
792 controlPoint2X = 9.906;
793 controlPoint2Y = 34.772;
794 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
795 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
796 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
797 pointX = 8.482;
798 pointY = 35.285;
799 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
800 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
801 controlPoint1X = 9.259;
802 controlPoint1Y = 34.729;
803 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
804 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
805 controlPoint2X = 8.862;
806 controlPoint2Y = 34.905;
807 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
808 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
809 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
810 pointX = 8.035;
811 pointY = 36.667;
812 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
813 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
814 controlPoint1X = 8.095;
815 controlPoint1Y = 35.671;
816 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
817 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
818 controlPoint2X = 7.946;
819 controlPoint2Y = 36.132;
820 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
821 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
822 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
823 pointX = 9.024;
824 pointY = 38.326;
825 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
826 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
827 controlPoint1X = 8.124;
828 controlPoint1Y = 37.203;
829 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
830 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
831 controlPoint2X = 8.453;
832 controlPoint2Y = 37.756;
833 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
834 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
835 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
836 pointX = 10.661;
837 pointY = 39.255;
838 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
839 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
840 controlPoint1X = 9.595;
841 controlPoint1Y = 38.897;
842 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
843 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
844 controlPoint2X = 10.141;
845 controlPoint2Y = 39.207;
846 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
847 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
848 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
849 pointX = 11.987;
850 pointY = 38.782;
851 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
852 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
853 controlPoint1X = 11.181;
854 controlPoint1Y = 39.304;
855 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
856 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
857 controlPoint2X = 11.623;
858 controlPoint2Y = 39.146;
859 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
860 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
861 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
862 pointX = 12.473;
863 pointY = 37.563;
864 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
865 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
866 controlPoint1X = 12.359;
867 controlPoint1Y = 38.409;
868 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
869 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
870 controlPoint2X = 12.522;
871 controlPoint2Y = 38.003;
872 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
873 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
874 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
875 pointX = 12.152;
876 pointY = 36.704;
877 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
878 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
879 controlPoint1X = 12.45;
880 controlPoint1Y = 37.324;
881 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
882 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
883 controlPoint2X = 12.343;
884 controlPoint2Y = 37.037;
885 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
886 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
887 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
888 pointX = 13.205;
889 pointY = 35.651;
890 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
891 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
892 context.lineTo(pointX, pointY);
893 pointX = 13.853;
894 pointY = 37.71;
895 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
896 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
897 controlPoint1X = 13.668;
898 controlPoint1Y = 36.297;
899 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
900 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
901 controlPoint2X = 13.884;
902 controlPoint2Y = 36.984;
903 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
904 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
905 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
906 pointX = 12.919;
907 pointY = 39.687;
908 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
909 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
910 controlPoint1X = 13.822;
911 controlPoint1Y = 38.436;
912 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
913 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
914 controlPoint2X = 13.51;
915 controlPoint2Y = 39.095;
916 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
917 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
918 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
919 pointX = 10.488;
920 pointY = 40.709;
921 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
922 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
923 controlPoint1X = 12.187;
924 controlPoint1Y = 40.419;
925 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
926 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
927 controlPoint2X = 11.377;
928 controlPoint2Y = 40.759;
929 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
930 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
931 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
932 pointX = 7.919;
933 pointY = 39.397;
934 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
935 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
936 controlPoint1X = 9.597;
937 controlPoint1Y = 40.656;
938 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
939 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
940 controlPoint2X = 8.741;
941 controlPoint2Y = 40.218;
942 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
943 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
944 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
945 pointX = 6.58;
946 pointY = 36.628;
947 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
948 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
949 controlPoint1X = 7.031;
950 controlPoint1Y = 38.508;
951 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
952 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
953 controlPoint2X = 6.584;
954 controlPoint2Y = 37.585;
955 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
956 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
957 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
958 pointX = 6.58;
959 pointY = 36.628;
960 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
961 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
962 context.lineTo(pointX, pointY);
963 context.closePath();
964 pointX = 17.778;
965 pointY = 32.093;
966 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
967 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
968 context.moveTo(pointX, pointY);
969 pointX = 16.824;
970 pointY = 30.396;
971 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
972 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
973 controlPoint1X = 17.715;
974 controlPoint1Y = 31.534;
975 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
976 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
977 controlPoint2X = 17.397;
978 controlPoint2Y = 30.969;
979 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
980 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
981 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
982 pointX = 15.129;
983 pointY = 29.443;
984 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
985 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
986 controlPoint1X = 16.253;
987 controlPoint1Y = 29.825;
988 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
989 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
990 controlPoint2X = 15.688;
991 controlPoint2Y = 29.507;
992 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
993 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
994 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
995 pointX = 13.658;
996 pointY = 29.978;
997 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
998 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
999 controlPoint1X = 14.569;
1000 controlPoint1Y = 29.378;
1001 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1002 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1003 controlPoint2X = 14.079;
1004 controlPoint2Y = 29.557;
1005 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1006 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1007 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1008 pointX = 13.116;
1009 pointY = 31.452;
1010 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1011 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1012 controlPoint1X = 13.236;
1013 controlPoint1Y = 30.399;
1014 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1015 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1016 controlPoint2X = 13.056;
1017 controlPoint2Y = 30.891;
1018 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1019 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1020 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1021 pointX = 14.065;
1022 pointY = 33.154;
1023 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1024 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1025 controlPoint1X = 13.175;
1026 controlPoint1Y = 32.014;
1027 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1028 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1029 controlPoint2X = 13.492;
1030 controlPoint2Y = 32.581;
1031 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1032 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1033 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1034 pointX = 15.767;
1035 pointY = 34.104;
1036 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1037 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1038 controlPoint1X = 14.638;
1039 controlPoint1Y = 33.727;
1040 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1041 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1042 controlPoint2X = 15.206;
1043 controlPoint2Y = 34.044;
1044 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1045 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1046 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1047 pointX = 17.242;
1048 pointY = 33.562;
1049 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1050 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1051 controlPoint1X = 16.329;
1052 controlPoint1Y = 34.164;
1053 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1054 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1055 controlPoint2X = 16.82;
1056 controlPoint2Y = 33.983;
1057 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1058 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1059 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1060 pointX = 17.778;
1061 pointY = 32.093;
1062 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1063 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1064 controlPoint1X = 17.663;
1065 controlPoint1Y = 33.14;
1066 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1067 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1068 controlPoint2X = 17.842;
1069 controlPoint2Y = 32.651;
1070 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1071 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1072 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1073 pointX = 17.778;
1074 pointY = 32.093;
1075 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1076 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1077 context.lineTo(pointX, pointY);
1078 context.closePath();
1079 pointX = 19.216;
1080 pointY = 32.201;
1081 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1082 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1083 context.moveTo(pointX, pointY);
1084 pointX = 18.143;
1085 pointY = 34.463;
1086 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1087 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1088 controlPoint1X = 19.228;
1089 controlPoint1Y = 32.982;
1090 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1091 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1092 controlPoint2X = 18.87;
1093 controlPoint2Y = 33.736;
1094 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1095 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1096 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1097 pointX = 15.881;
1098 pointY = 35.537;
1099 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1100 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1101 controlPoint1X = 17.415;
1102 controlPoint1Y = 35.19;
1103 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1104 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1105 controlPoint2X = 16.661;
1106 controlPoint2Y = 35.548;
1107 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1108 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1109 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1110 pointX = 13.009;
1111 pointY = 34.211;
1112 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1113 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1114 controlPoint1X = 14.88;
1115 controlPoint1Y = 35.567;
1116 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1117 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1118 controlPoint2X = 13.922;
1119 controlPoint2Y = 35.125;
1120 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1121 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1122 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1123 pointX = 11.683;
1124 pointY = 31.338;
1125 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1126 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1127 controlPoint1X = 12.076;
1128 controlPoint1Y = 33.279;
1129 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1130 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1131 controlPoint2X = 11.634;
1132 controlPoint2Y = 32.321;
1133 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1134 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1135 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1136 pointX = 12.757;
1137 pointY = 29.077;
1138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1140 controlPoint1X = 11.671;
1141 controlPoint1Y = 30.558;
1142 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1143 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1144 controlPoint2X = 12.029;
1145 controlPoint2Y = 29.804;
1146 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1147 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1148 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1149 pointX = 15.018;
1150 pointY = 28.003;
1151 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1152 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1153 controlPoint1X = 13.484;
1154 controlPoint1Y = 28.349;
1155 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1156 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1157 controlPoint2X = 14.238;
1158 controlPoint2Y = 27.991;
1159 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1160 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1161 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1162 pointX = 17.887;
1163 pointY = 29.332;
1164 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1165 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1166 controlPoint1X = 15.999;
1167 controlPoint1Y = 27.957;
1168 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1169 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1170 controlPoint2X = 16.955;
1171 controlPoint2Y = 28.4;
1172 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1173 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1174 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1175 pointX = 19.216;
1176 pointY = 32.201;
1177 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1178 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1179 controlPoint1X = 18.801;
1180 controlPoint1Y = 30.246;
1181 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1182 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1183 controlPoint2X = 19.244;
1184 controlPoint2Y = 31.202;
1185 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1186 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1187 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1188 pointX = 19.216;
1189 pointY = 32.201;
1190 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1191 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1192 context.lineTo(pointX, pointY);
1193 context.closePath();
1194 pointX = 19.534;
1195 pointY = 22.61;
1196 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1197 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1198 context.moveTo(pointX, pointY);
1199 pointX = 21.064;
1200 pointY = 21.08;
1201 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1202 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1203 context.lineTo(pointX, pointY);
1204 pointX = 26.153;
1205 pointY = 26.17;
1206 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1207 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1208 context.lineTo(pointX, pointY);
1209 pointX = 25.162;
1210 pointY = 27.16;
1211 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1212 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1213 context.lineTo(pointX, pointY);
1214 pointX = 21.72;
1215 pointY = 23.718;
1216 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1217 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1218 context.lineTo(pointX, pointY);
1219 pointX = 21.307;
1220 pointY = 23.299;
1221 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1222 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1223 controlPoint1X = 21.621;
1224 controlPoint1Y = 23.619;
1225 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1226 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1227 controlPoint2X = 21.483;
1228 controlPoint2Y = 23.479;
1229 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1230 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1231 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1232 pointX = 20.898;
1233 pointY = 22.883;
1234 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1235 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1236 controlPoint1X = 21.131;
1237 controlPoint1Y = 23.118;
1238 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1239 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1240 controlPoint2X = 20.995;
1241 controlPoint2Y = 22.979;
1242 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1243 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1244 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1245 pointX = 24.206;
1246 pointY = 28.117;
1247 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1248 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1249 context.lineTo(pointX, pointY);
1250 pointX = 23.173;
1251 pointY = 29.149;
1252 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1253 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1254 context.lineTo(pointX, pointY);
1255 pointX = 17.946;
1256 pointY = 25.835;
1257 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1258 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1259 context.lineTo(pointX, pointY);
1260 pointX = 18.362;
1261 pointY = 26.244;
1262 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1263 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1264 controlPoint1X = 18.043;
1265 controlPoint1Y = 25.931;
1266 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1267 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1268 controlPoint2X = 18.181;
1269 controlPoint2Y = 26.068;
1270 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1271 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1272 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1273 pointX = 18.781;
1274 pointY = 26.656;
1275 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1276 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1277 controlPoint1X = 18.543;
1278 controlPoint1Y = 26.42;
1279 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1280 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1281 controlPoint2X = 18.682;
1282 controlPoint2Y = 26.557;
1283 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1284 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1285 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1286 pointX = 22.224;
1287 pointY = 30.099;
1288 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1289 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1290 context.lineTo(pointX, pointY);
1291 pointX = 21.233;
1292 pointY = 31.09;
1293 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1294 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1295 context.lineTo(pointX, pointY);
1296 pointX = 16.144;
1297 pointY = 26;
1298 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1299 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1300 context.lineTo(pointX, pointY);
1301 pointX = 17.69;
1302 pointY = 24.454;
1303 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1304 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1305 context.lineTo(pointX, pointY);
1306 pointX = 22.617;
1307 pointY = 27.53;
1308 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1309 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1310 context.lineTo(pointX, pointY);
1311 pointX = 19.534;
1312 pointY = 22.61;
1313 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1314 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1315 context.lineTo(pointX, pointY);
1316 context.closePath();
1317 pointX = 28.114;
1318 pointY = 24.208;
1319 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1320 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1321 context.moveTo(pointX, pointY);
1322 pointX = 27.057;
1323 pointY = 25.265;
1324 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1325 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1326 context.lineTo(pointX, pointY);
1327 pointX = 21.968;
1328 pointY = 20.176;
1329 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1330 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1331 context.lineTo(pointX, pointY);
1332 pointX = 23.025;
1333 pointY = 19.119;
1334 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1335 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1336 context.lineTo(pointX, pointY);
1337 pointX = 28.114;
1338 pointY = 24.208;
1339 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1340 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1341 context.lineTo(pointX, pointY);
1342 context.closePath();
1343 pointX = 23.998;
1344 pointY = 18.146;
1345 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1346 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1347 context.moveTo(pointX, pointY);
1348 pointX = 25.114;
1349 pointY = 17.03;
1350 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1351 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1352 context.lineTo(pointX, pointY);
1353 pointX = 30.693;
1354 pointY = 18.556;
1355 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1356 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1357 context.lineTo(pointX, pointY);
1358 pointX = 27.14;
1359 pointY = 15.004;
1360 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1361 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1362 context.lineTo(pointX, pointY);
1363 pointX = 28.131;
1364 pointY = 14.013;
1365 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1366 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1367 context.lineTo(pointX, pointY);
1368 pointX = 33.22;
1369 pointY = 19.102;
1370 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1371 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1372 context.lineTo(pointX, pointY);
1373 pointX = 32.157;
1374 pointY = 20.165;
1375 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1376 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1377 context.lineTo(pointX, pointY);
1378 pointX = 26.464;
1379 pointY = 18.629;
1380 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1381 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1382 context.lineTo(pointX, pointY);
1383 pointX = 30.079;
1384 pointY = 22.244;
1385 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1386 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1387 context.lineTo(pointX, pointY);
1388 pointX = 29.088;
1389 pointY = 23.235;
1390 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1391 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1392 context.lineTo(pointX, pointY);
1393 pointX = 23.998;
1394 pointY = 18.146;
1395 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1396 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1397 context.lineTo(pointX, pointY);
1398 context.closePath();
1399 pointX = 34.132;
1400 pointY = 11.188;
1401 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1402 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1403 context.moveTo(pointX, pointY);
1404 pointX = 32.813;
1405 pointY = 11.05;
1406 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1407 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1408 controlPoint1X = 33.704;
1409 controlPoint1Y = 10.921;
1410 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1411 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1412 controlPoint2X = 33.264;
1413 controlPoint2Y = 10.875;
1414 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1415 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1416 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1417 pointX = 32.116;
1418 pointY = 11.52;
1419 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1420 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1421 controlPoint1X = 32.562;
1422 controlPoint1Y = 11.149;
1423 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1424 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1425 controlPoint2X = 32.33;
1426 controlPoint2Y = 11.306;
1427 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1428 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1429 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1430 pointX = 31.57;
1431 pointY = 12.994;
1432 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1433 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1434 controlPoint1X = 31.706;
1435 controlPoint1Y = 11.93;
1436 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1437 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1438 controlPoint2X = 31.524;
1439 controlPoint2Y = 12.421;
1440 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1441 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1442 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1443 pointX = 32.571;
1444 pointY = 14.786;
1445 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1446 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1447 controlPoint1X = 31.616;
1448 controlPoint1Y = 13.567;
1449 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1450 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1451 controlPoint2X = 31.95;
1452 controlPoint2Y = 14.165;
1453 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1454 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1455 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1456 pointX = 34.329;
1457 pointY = 15.687;
1458 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1459 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1460 controlPoint1X = 33.197;
1461 controlPoint1Y = 15.412;
1462 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1463 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1464 controlPoint2X = 33.783;
1465 controlPoint2Y = 15.713;
1466 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1467 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1468 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1469 pointX = 35.693;
1470 pointY = 15.104;
1471 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1472 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1473 controlPoint1X = 34.874;
1474 controlPoint1Y = 15.662;
1475 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1476 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1477 controlPoint2X = 35.329;
1478 controlPoint2Y = 15.467;
1479 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1480 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1481 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1482 pointX = 36.261;
1483 pointY = 13.918;
1484 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1485 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1486 controlPoint1X = 36.049;
1487 controlPoint1Y = 14.747;
1488 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1489 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1490 controlPoint2X = 36.239;
1491 controlPoint2Y = 14.352;
1492 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1493 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1494 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1495 pointX = 35.872;
1496 pointY = 12.687;
1497 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1498 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1499 controlPoint1X = 36.282;
1500 controlPoint1Y = 13.484;
1501 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1502 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1503 controlPoint2X = 36.153;
1504 controlPoint2Y = 13.074;
1505 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1506 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1507 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1508 pointX = 34.695;
1509 pointY = 13.864;
1510 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1511 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1512 context.lineTo(pointX, pointY);
1513 pointX = 33.845;
1514 pointY = 13.015;
1515 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1516 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1517 context.lineTo(pointX, pointY);
1518 pointX = 35.965;
1519 pointY = 10.895;
1520 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1521 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1522 context.lineTo(pointX, pointY);
1523 pointX = 38.696;
1524 pointY = 13.626;
1525 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1526 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1527 context.lineTo(pointX, pointY);
1528 pointX = 37.992;
1529 pointY = 14.33;
1530 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1531 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1532 context.lineTo(pointX, pointY);
1533 pointX = 37.25;
1534 pointY = 13.802;
1535 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1536 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1537 context.lineTo(pointX, pointY);
1538 pointX = 37.208;
1539 pointY = 14.866;
1540 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1541 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1542 controlPoint1X = 37.287;
1543 controlPoint1Y = 14.249;
1544 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1545 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1546 controlPoint2X = 37.273;
1547 controlPoint2Y = 14.603;
1548 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1549 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1550 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1551 pointX = 36.431;
1552 pointY = 16.16;
1553 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1554 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1555 controlPoint1X = 37.1;
1556 controlPoint1Y = 15.319;
1557 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1558 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1559 controlPoint2X = 36.841;
1560 controlPoint2Y = 15.751;
1561 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1562 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1563 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1564 pointX = 34.073;
1565 pointY = 17.117;
1566 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1567 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1568 controlPoint1X = 35.757;
1569 controlPoint1Y = 16.835;
1570 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1571 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1572 controlPoint2X = 34.971;
1573 controlPoint2Y = 17.153;
1574 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1575 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1576 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1577 pointX = 31.473;
1578 pointY = 15.863;
1579 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1580 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1581 controlPoint1X = 33.155;
1582 controlPoint1Y = 17.096;
1583 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1584 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1585 controlPoint2X = 32.288;
1586 controlPoint2Y = 16.678;
1587 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1588 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1589 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1590 pointX = 30.172;
1591 pointY = 13.201;
1592 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1593 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1594 controlPoint1X = 30.649;
1595 controlPoint1Y = 15.039;
1596 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1597 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1598 controlPoint2X = 30.216;
1599 controlPoint2Y = 14.152;
1600 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1601 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1602 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1603 pointX = 31.225;
1604 pointY = 10.657;
1605 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1606 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1607 controlPoint1X = 30.128;
1608 controlPoint1Y = 12.251;
1609 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1610 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1611 controlPoint2X = 30.479;
1612 controlPoint2Y = 11.402;
1613 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1614 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1615 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1616 pointX = 33.276;
1617 pointY = 9.59;
1618 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1619 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1620 controlPoint1X = 31.872;
1621 controlPoint1Y = 10.01;
1622 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1623 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1624 controlPoint2X = 32.555;
1625 controlPoint2Y = 9.654;
1626 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1627 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1628 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1629 pointX = 35.178;
1630 pointY = 10.142;
1631 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1632 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1633 controlPoint1X = 33.996;
1634 controlPoint1Y = 9.525;
1635 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
1636 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
1637 controlPoint2X = 34.63;
1638 controlPoint2Y = 9.71;
1639 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
1640 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
1641 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
1642 pointX = 34.132;
1643 pointY = 11.188;
1644 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1645 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1646 context.lineTo(pointX, pointY);
1647 context.closePath();
1648 pointX = 34.878;
1649 pointY = 7.301;
1650 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1651 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1652 context.moveTo(pointX, pointY);
1653 pointX = 35.958;
1654 pointY = 6.22;
1655 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1656 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1657 context.lineTo(pointX, pointY);
1658 pointX = 37.25;
1659 pointY = 7.511;
1660 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1661 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1662 context.lineTo(pointX, pointY);
1663 pointX = 39.346;
1664 pointY = 10.166;
1665 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1666 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1667 context.lineTo(pointX, pointY);
1668 pointX = 38.831;
1669 pointY = 10.681;
1670 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1671 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1672 context.lineTo(pointX, pointY);
1673 pointX = 36.169;
1674 pointY = 8.592;
1675 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1676 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1677 context.lineTo(pointX, pointY);
1678 pointX = 34.878;
1679 pointY = 7.301;
1680 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1681 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1682 context.lineTo(pointX, pointY);
1683 context.closePath();
1684 pointX = 38.976;
1685 pointY = 11.351;
1686 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1687 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1688 context.moveTo(pointX, pointY);
1689 pointX = 40.005;
1690 pointY = 10.322;
1691 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1692 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1693 context.lineTo(pointX, pointY);
1694 pointX = 41.003;
1695 pointY = 11.32;
1696 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1697 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1698 context.lineTo(pointX, pointY);
1699 pointX = 39.974;
1700 pointY = 12.349;
1701 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1702 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1703 context.lineTo(pointX, pointY);
1704 pointX = 38.976;
1705 pointY = 11.351;
1706 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1707 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1708 context.lineTo(pointX, pointY);
1709 context.closePath();
1710 pointX = 41.528;
1711 pointY = 10.795;
1712 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
1713 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
1714 context.moveTo(pointX, pointY);
1715 context.fillStyle = aBannerColor;
1716 context.fill();
1717
1718 context.restore();
1719}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
new file mode 100644
index 0000000..eaeb7f1
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
@@ -0,0 +1,310 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //store.js
31 //store
32//
33 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Features_storeWidth = 76.0;
39var kClipperz_PM_UI_Canvas_Features_storeHeight = 76.0;
40
41function Clipperz_PM_UI_Canvas_Features_store(canvas, aColor, aBannerColor, aBannerBackgroundColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 if (window.devicePixelRatio)
50 resolution = window.devicePixelRatio;
51 else
52 resolution = 1.0;
53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight);
54
55 context.save();
56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight);
57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_storeWidth, kClipperz_PM_UI_Canvas_Features_storeHeight);
58
59 // Layer 1
60
61 alignStroke = 0.0;
62 context.beginPath();
63 pointX = 27.0;
64 pointY = 29.5;
65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
67 context.moveTo(pointX, pointY);
68 pointX = 27.0;
69 pointY = 24.5;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.lineTo(pointX, pointY);
73 pointX = 22.0;
74 pointY = 24.5;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY);
78 pointX = 22.0;
79 pointY = 29.5;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 context.lineTo(pointX, pointY);
83 pointX = 27.0;
84 pointY = 29.5;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 context.lineTo(pointX, pointY);
88 context.closePath();
89 context.fillStyle = aColor;
90 context.fill();
91
92 alignStroke = 0.0;
93 context.beginPath();
94 pointX = 54.0;
95 pointY = 29.5;
96 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
97 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
98 context.moveTo(pointX, pointY);
99 pointX = 54.0;
100 pointY = 24.5;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 context.lineTo(pointX, pointY);
104 pointX = 29.0;
105 pointY = 24.5;
106 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
107 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
108 context.lineTo(pointX, pointY);
109 pointX = 29.0;
110 pointY = 29.5;
111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
113 context.lineTo(pointX, pointY);
114 pointX = 54.0;
115 pointY = 29.5;
116 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
117 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
118 context.lineTo(pointX, pointY);
119 context.closePath();
120 context.fillStyle = aColor;
121 context.fill();
122
123 alignStroke = 0.0;
124 context.beginPath();
125 pointX = 43.0;
126 pointY = 37.0;
127 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
128 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
129 context.moveTo(pointX, pointY);
130 pointX = 43.0;
131 pointY = 32.0;
132 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
133 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
134 context.lineTo(pointX, pointY);
135 pointX = 29.0;
136 pointY = 32.0;
137 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
138 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
139 context.lineTo(pointX, pointY);
140 pointX = 29.0;
141 pointY = 37.0;
142 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
143 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
144 context.lineTo(pointX, pointY);
145 pointX = 43.0;
146 pointY = 37.0;
147 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
148 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
149 context.lineTo(pointX, pointY);
150 context.closePath();
151 context.fillStyle = aColor;
152 context.fill();
153
154 alignStroke = 0.0;
155 context.beginPath();
156 pointX = 27.0;
157 pointY = 37.0;
158 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
159 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
160 context.moveTo(pointX, pointY);
161 pointX = 27.0;
162 pointY = 32.0;
163 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
164 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
165 context.lineTo(pointX, pointY);
166 pointX = 22.0;
167 pointY = 32.0;
168 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
169 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
170 context.lineTo(pointX, pointY);
171 pointX = 22.0;
172 pointY = 37.0;
173 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
174 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
175 context.lineTo(pointX, pointY);
176 pointX = 27.0;
177 pointY = 37.0;
178 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
179 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
180 context.lineTo(pointX, pointY);
181 context.closePath();
182 context.fillStyle = aColor;
183 context.fill();
184
185 alignStroke = 0.0;
186 context.beginPath();
187 pointX = 27.0;
188 pointY = 44.0;
189 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
190 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
191 context.moveTo(pointX, pointY);
192 pointX = 27.0;
193 pointY = 39.0;
194 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
195 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
196 context.lineTo(pointX, pointY);
197 pointX = 22.0;
198 pointY = 39.0;
199 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
200 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
201 context.lineTo(pointX, pointY);
202 pointX = 22.0;
203 pointY = 44.0;
204 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
205 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
206 context.lineTo(pointX, pointY);
207 pointX = 27.0;
208 pointY = 44.0;
209 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
210 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
211 context.lineTo(pointX, pointY);
212 context.closePath();
213 context.fillStyle = aColor;
214 context.fill();
215
216 alignStroke = 0.0;
217 context.beginPath();
218 pointX = 46.0;
219 pointY = 44.0;
220 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
221 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
222 context.moveTo(pointX, pointY);
223 pointX = 46.0;
224 pointY = 39.0;
225 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
226 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
227 context.lineTo(pointX, pointY);
228 pointX = 29.0;
229 pointY = 39.0;
230 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
231 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
232 context.lineTo(pointX, pointY);
233 pointX = 29.0;
234 pointY = 44.0;
235 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
236 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
237 context.lineTo(pointX, pointY);
238 pointX = 46.0;
239 pointY = 44.0;
240 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
241 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
242 context.lineTo(pointX, pointY);
243 context.closePath();
244 context.fillStyle = aColor;
245 context.fill();
246
247 alignStroke = 0.0;
248 context.beginPath();
249 pointX = 40.0;
250 pointY = 51.0;
251 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
252 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
253 context.moveTo(pointX, pointY);
254 pointX = 40.0;
255 pointY = 46.0;
256 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
257 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
258 context.lineTo(pointX, pointY);
259 pointX = 29.0;
260 pointY = 46.0;
261 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
262 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
263 context.lineTo(pointX, pointY);
264 pointX = 29.0;
265 pointY = 51.0;
266 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
267 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
268 context.lineTo(pointX, pointY);
269 pointX = 40.0;
270 pointY = 51.0;
271 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
272 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
273 context.lineTo(pointX, pointY);
274 context.closePath();
275 context.fillStyle = aColor;
276 context.fill();
277
278 alignStroke = 0.0;
279 context.beginPath();
280 pointX = 27.0;
281 pointY = 51.0;
282 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
283 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
284 context.moveTo(pointX, pointY);
285 pointX = 27.0;
286 pointY = 46.0;
287 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
288 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
289 context.lineTo(pointX, pointY);
290 pointX = 22.0;
291 pointY = 46.0;
292 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
293 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
294 context.lineTo(pointX, pointY);
295 pointX = 22.0;
296 pointY = 51.0;
297 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
298 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
299 context.lineTo(pointX, pointY);
300 pointX = 27.0;
301 pointY = 51.0;
302 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
303 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
304 context.lineTo(pointX, pointY);
305 context.closePath();
306 context.fillStyle = aColor;
307 context.fill();
308
309 context.restore();
310}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
new file mode 100644
index 0000000..5de2e96
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
@@ -0,0 +1,68 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Canvas');
30
31MochiKit.Base.update(Clipperz.PM.UI.Canvas , {
32 'marks': {
33 '!':Clipperz_PM_UI_Canvas_Marks_exclamationMark,
34 '?':Clipperz_PM_UI_Canvas_Marks_questionMark,
35 'i':Clipperz_PM_UI_Canvas_Marks_info
36 },
37
38 'features': {
39 'store': Clipperz_PM_UI_Canvas_Features_store,
40 'protect': Clipperz_PM_UI_Canvas_Features_protect,
41 'directLogin':Clipperz_PM_UI_Canvas_Features_directLogin,
42 'share': Clipperz_PM_UI_Canvas_Features_share
43 },
44
45 'tips': {
46 'open': Clipperz_PM_UI_Canvas_Tips_open,
47 'close': Clipperz_PM_UI_Canvas_Tips_close
48 },
49
50 'star': {
51 'normal': Clipperz_PM_UI_Canvas_Star_normal
52 },
53
54 'coverActions': {
55 'look': Clipperz_PM_UI_Canvas_CoverActions_look,
56 'download': Clipperz_PM_UI_Canvas_CoverActions_download
57 },
58
59 'registerButton': {
60 'normal': Clipperz_PM_UI_Canvas_RegisterButton_normal
61 },
62
63 'logo': {
64 'normal': Clipperz_PM_UI_Canvas_Logo_normal
65 },
66
67 __syntaxFix__: "syntax fix"
68});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
new file mode 100644
index 0000000..e0bea36
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
@@ -0,0 +1,65 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //normal.js
31 //normal
32//
33 //Created by Giulio Cesare Solaroli on 3/25/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Logo_normalWidth = 150.0;
39var kClipperz_PM_UI_Canvas_Logo_normalHeight = 39.0;
40
41function Clipperz_PM_UI_Canvas_Logo_normal(canvas, aMainColor, aSecondaryColor)
42{
43 var context = canvas.getContext("2d");
44 var string;
45
46 context.save();
47 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Logo_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Logo_normalHeight);
48 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Logo_normalWidth, kClipperz_PM_UI_Canvas_Logo_normalHeight);
49
50 // clipper…
51
52 string = "clipper";
53 context.font = "38.0pt Helvetica-Bold";
54 context.fillStyle = aMainColor;
55 context.fillText(string, -9.0, -9.0);
56
57 // …z
58
59 string = "z";
60 context.font = "38.0pt Helvetica-Bold";
61 context.fillStyle = aSecondaryColor;
62 context.fillText(string, 125.0, -9.0);
63
64 context.restore();
65}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
new file mode 100644
index 0000000..f3ae04d
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
@@ -0,0 +1,280 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //exclamationMark.js
31 //!
32//
33 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth = 50.0;
39var kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight = 50.0;
40
41function Clipperz_PM_UI_Canvas_Marks_exclamationMark(canvas, aColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 var controlPoint1X;
50 var controlPoint1Y;
51 var controlPoint2X;
52 var controlPoint2Y;
53 if (window.devicePixelRatio)
54 resolution = window.devicePixelRatio;
55 else
56 resolution = 1.0;
57 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
58
59 context.save();
60 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
61 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
62
63 // Layer 1
64
65 alignStroke = 0.0;
66 context.beginPath();
67 pointX = 26.499;
68 pointY = 10.848;
69 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
70 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
71 context.moveTo(pointX, pointY);
72 pointX = 20.887;
73 pointY = 11.584;
74 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
75 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
76 controlPoint1X = 25.395;
77 controlPoint1Y = 10.802;
78 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
79 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
80 controlPoint2X = 22.175;
81 controlPoint2Y = 11.078;
82 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
83 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
84 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
85 pointX = 20.013;
86 pointY = 13.194;
87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
89 controlPoint1X = 20.335;
90 controlPoint1Y = 11.814;
91 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
92 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
93 controlPoint2X = 19.921;
94 controlPoint2Y = 12.826;
95 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
96 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
97 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
98 pointX = 23.049;
99 pointY = 28.788;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 controlPoint1X = 20.243;
103 controlPoint1Y = 15.448;
104 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
105 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
106 controlPoint2X = 22.589;
107 controlPoint2Y = 26.35;
108 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
109 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
110 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
111 pointX = 25.027;
112 pointY = 29.156;
113 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
114 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
115 controlPoint1X = 23.279;
116 controlPoint1Y = 29.018;
117 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
118 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
119 controlPoint2X = 24.705;
120 controlPoint2Y = 29.202;
121 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
122 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
123 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
124 pointX = 27.971;
125 pointY = 11.354;
126 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
127 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
128 controlPoint1X = 25.809;
129 controlPoint1Y = 25.384;
130 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
131 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
132 controlPoint2X = 27.971;
133 controlPoint2Y = 12.826;
134 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
135 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
136 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
137 pointX = 26.499;
138 pointY = 10.848;
139 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
140 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
141 controlPoint1X = 27.557;
142 controlPoint1Y = 11.032;
143 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
144 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
145 controlPoint2X = 26.913;
146 controlPoint2Y = 10.848;
147 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
148 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
149 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
150 pointX = 26.499;
151 pointY = 10.848;
152 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
153 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
154 context.lineTo(pointX, pointY);
155 context.closePath();
156 pointX = 24.337;
157 pointY = 31.962;
158 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
159 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
160 context.moveTo(pointX, pointY);
161 pointX = 21.899;
162 pointY = 32.882;
163 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
164 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
165 controlPoint1X = 23.463;
166 controlPoint1Y = 31.962;
167 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
168 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
169 controlPoint2X = 22.589;
170 controlPoint2Y = 32.284;
171 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
172 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
173 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
174 pointX = 20.703;
175 pointY = 35.458;
176 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
177 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
178 controlPoint1X = 21.163;
179 controlPoint1Y = 33.572;
180 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
181 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
182 controlPoint2X = 20.703;
183 controlPoint2Y = 34.538;
184 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
185 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
186 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
187 pointX = 21.669;
188 pointY = 38.08;
189 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
190 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
191 controlPoint1X = 20.703;
192 controlPoint1Y = 36.47;
193 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
194 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
195 controlPoint2X = 20.979;
196 controlPoint2Y = 37.344;
197 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
198 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
199 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
200 pointX = 24.015;
201 pointY = 39.0;
202 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
203 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
204 controlPoint1X = 22.405;
205 controlPoint1Y = 38.77;
206 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
207 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
208 controlPoint2X = 23.325;
209 controlPoint2Y = 39.0;
210 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
211 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
212 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
213 pointX = 26.821;
214 pointY = 38.034;
215 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
216 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
217 controlPoint1X = 25.073;
218 controlPoint1Y = 39.0;
219 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
220 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
221 controlPoint2X = 26.131;
222 controlPoint2Y = 38.724;
223 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
224 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
225 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
226 pointX = 27.833;
227 pointY = 35.55;
228 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
229 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
230 controlPoint1X = 27.465;
231 controlPoint1Y = 37.344;
232 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
233 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
234 controlPoint2X = 27.833;
235 controlPoint2Y = 36.194;
236 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
237 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
238 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
239 pointX = 26.683;
240 pointY = 32.744;
241 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
242 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
243 controlPoint1X = 27.833;
244 controlPoint1Y = 34.676;
245 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
246 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
247 controlPoint2X = 27.557;
248 controlPoint2Y = 33.572;
249 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
250 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
251 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
252 pointX = 24.337;
253 pointY = 31.962;
254 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
255 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
256 controlPoint1X = 26.085;
257 controlPoint1Y = 32.238;
258 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
259 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
260 controlPoint2X = 25.211;
261 controlPoint2Y = 31.962;
262 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
263 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
264 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
265 pointX = 24.337;
266 pointY = 31.962;
267 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
268 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
269 context.lineTo(pointX, pointY);
270 context.closePath();
271 pointX = 30.639;
272 pointY = 38.402;
273 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
274 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
275 context.moveTo(pointX, pointY);
276 context.fillStyle = aColor;
277 context.fill();
278
279 context.restore();
280}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
new file mode 100644
index 0000000..adab74f
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
@@ -0,0 +1,391 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //info.js
31 //i
32//
33 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Marks_infoWidth = 50.0;
39var kClipperz_PM_UI_Canvas_Marks_infoHeight = 50.0;
40
41function Clipperz_PM_UI_Canvas_Marks_info(canvas, aColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 var controlPoint1X;
50 var controlPoint1Y;
51 var controlPoint2X;
52 var controlPoint2Y;
53 var color;
54 if (window.devicePixelRatio)
55 resolution = window.devicePixelRatio;
56 else
57 resolution = 1.0;
58 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight);
59
60 context.save();
61 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight);
62 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_infoWidth, kClipperz_PM_UI_Canvas_Marks_infoHeight);
63
64 // Layer 1
65
66 alignStroke = 0.0;
67 context.beginPath();
68 pointX = 30.253;
69 pointY = 37.436;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY);
73 pointX = 28.505;
74 pointY = 37.022;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY);
78 pointX = 27.677;
79 pointY = 35.09;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 controlPoint1X = 27.953;
83 controlPoint1Y = 36.792;
84 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
85 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
86 controlPoint2X = 27.677;
87 controlPoint2Y = 36.47;
88 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
89 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
90 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
91 pointX = 27.631;
92 pointY = 27.546;
93 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
94 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
95 controlPoint1X = 27.631;
96 controlPoint1Y = 32.974;
97 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
98 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
99 controlPoint2X = 27.631;
100 controlPoint2Y = 29.892;
101 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
102 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
103 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
104 pointX = 27.677;
105 pointY = 19.726;
106 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
107 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
108 controlPoint1X = 27.631;
109 controlPoint1Y = 24.97;
110 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
111 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
112 controlPoint2X = 27.677;
113 controlPoint2Y = 21.612;
114 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
115 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
116 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
117 pointX = 19.535;
118 pointY = 21.336;
119 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
120 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
121 controlPoint1X = 25.331;
122 controlPoint1Y = 20.692;
123 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
124 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
125 controlPoint2X = 20.593;
126 controlPoint2Y = 21.336;
127 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
128 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
129 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
130 pointX = 19.443;
131 pointY = 22.762;
132 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
133 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
134 controlPoint1X = 19.397;
135 controlPoint1Y = 21.52;
136 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
137 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
138 controlPoint2X = 19.305;
139 controlPoint2Y = 22.532;
140 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
141 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
142 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
143 pointX = 21.283;
144 pointY = 23.82;
145 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
146 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
147 controlPoint1X = 20.639;
148 controlPoint1Y = 23.222;
149 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
150 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
151 controlPoint2X = 20.961;
152 controlPoint2Y = 23.452;
153 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
154 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
155 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
156 pointX = 21.605;
157 pointY = 24.97;
158 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
159 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
160 controlPoint1X = 21.513;
161 controlPoint1Y = 24.05;
162 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
163 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
164 controlPoint2X = 21.605;
165 controlPoint2Y = 24.602;
166 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
167 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
168 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
169 pointX = 21.651;
170 pointY = 29.156;
171 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
172 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
173 controlPoint1X = 21.651;
174 controlPoint1Y = 25.752;
175 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
176 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
177 controlPoint2X = 21.651;
178 controlPoint2Y = 27.592;
179 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
180 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
181 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
182 pointX = 21.605;
183 pointY = 35.228;
184 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
185 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
186 controlPoint1X = 21.651;
187 controlPoint1Y = 31.364;
188 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
189 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
190 controlPoint2X = 21.651;
191 controlPoint2Y = 34.216;
192 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
193 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
194 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
195 pointX = 20.823;
196 pointY = 37.022;
197 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
198 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
199 controlPoint1X = 21.559;
200 controlPoint1Y = 36.332;
201 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
202 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
203 controlPoint2X = 21.467;
204 controlPoint2Y = 36.838;
205 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
206 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
207 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
208 pointX = 19.121;
209 pointY = 37.436;
210 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
211 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
212 controlPoint1X = 20.363;
213 controlPoint1Y = 37.206;
214 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
215 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
216 controlPoint2X = 19.857;
217 controlPoint2Y = 37.298;
218 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
219 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
220 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
221 pointX = 19.121;
222 pointY = 39.0;
223 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
224 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
225 controlPoint1X = 18.937;
226 controlPoint1Y = 37.62;
227 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
228 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
229 controlPoint2X = 18.983;
230 controlPoint2Y = 38.77;
231 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
232 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
233 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
234 pointX = 24.503;
235 pointY = 38.862;
236 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
237 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
238 controlPoint1X = 20.271;
239 controlPoint1Y = 39.0;
240 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
241 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
242 controlPoint2X = 21.927;
243 controlPoint2Y = 38.862;
244 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
245 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
246 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
247 pointX = 30.023;
248 pointY = 39.0;
249 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
250 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
251 controlPoint1X = 27.401;
252 controlPoint1Y = 38.862;
253 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
254 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
255 controlPoint2X = 29.149;
256 controlPoint2Y = 39.0;
257 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
258 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
259 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
260 pointX = 30.253;
261 pointY = 37.436;
262 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
263 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
264 controlPoint1X = 30.299;
265 controlPoint1Y = 38.77;
266 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
267 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
268 controlPoint2X = 30.391;
269 controlPoint2Y = 37.62;
270 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
271 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
272 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
273 pointX = 30.253;
274 pointY = 37.436;
275 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
276 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
277 context.lineTo(pointX, pointY);
278 context.closePath();
279 pointX = 27.493;
280 pointY = 13.976;
281 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
282 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
283 context.moveTo(pointX, pointY);
284 pointX = 27.125;
285 pointY = 12.228;
286 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
287 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
288 controlPoint1X = 27.493;
289 controlPoint1Y = 13.608;
290 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
291 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
292 controlPoint2X = 27.401;
293 controlPoint2Y = 12.688;
294 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
295 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
296 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
297 pointX = 24.963;
298 pointY = 11.63;
299 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
300 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
301 controlPoint1X = 26.849;
302 controlPoint1Y = 11.998;
303 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
304 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
305 controlPoint2X = 26.113;
306 controlPoint2Y = 11.63;
307 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
308 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
309 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
310 pointX = 21.513;
311 pointY = 12.688;
312 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
313 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
314 controlPoint1X = 23.767;
315 controlPoint1Y = 11.63;
316 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
317 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
318 controlPoint2X = 22.203;
319 controlPoint2Y = 12.09;
320 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
321 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
322 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
323 pointX = 21.283;
324 pointY = 14.942;
325 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
326 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
327 controlPoint1X = 21.145;
328 controlPoint1Y = 13.148;
329 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
330 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
331 controlPoint2X = 21.145;
332 controlPoint2Y = 14.436;
333 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
334 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
335 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
336 pointX = 22.801;
337 pointY = 17.012;
338 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
339 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
340 controlPoint1X = 21.513;
341 controlPoint1Y = 15.908;
342 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
343 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
344 controlPoint2X = 21.973;
345 controlPoint2Y = 16.69;
346 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
347 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
348 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
349 pointX = 26.205;
350 pointY = 16.69;
351 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
352 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
353 controlPoint1X = 23.399;
354 controlPoint1Y = 17.288;
355 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
356 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
357 controlPoint2X = 25.791;
358 controlPoint2Y = 17.058;
359 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
360 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
361 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
362 pointX = 27.493;
363 pointY = 13.976;
364 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
365 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
366 controlPoint1X = 26.941;
367 controlPoint1Y = 16.046;
368 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
369 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
370 controlPoint2X = 27.493;
371 controlPoint2Y = 14.896;
372 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
373 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
374 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
375 pointX = 27.493;
376 pointY = 13.976;
377 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
378 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
379 context.lineTo(pointX, pointY);
380 context.closePath();
381 pointX = 30.851;
382 pointY = 38.862;
383 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
384 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
385 context.moveTo(pointX, pointY);
386 color = "#FFFFFF";
387 context.fillStyle = color;
388 context.fill();
389
390 context.restore();
391}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
new file mode 100644
index 0000000..003c4c2
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
@@ -0,0 +1,438 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //questionMark.js
31 //?
32//
33 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Marks_questionMarkWidth = 50.0;
39var kClipperz_PM_UI_Canvas_Marks_questionMarkHeight = 50.0;
40
41function Clipperz_PM_UI_Canvas_Marks_questionMark(canvas, aColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 var controlPoint1X;
50 var controlPoint1Y;
51 var controlPoint2X;
52 var controlPoint2Y;
53 var color;
54 if (window.devicePixelRatio)
55 resolution = window.devicePixelRatio;
56 else
57 resolution = 1.0;
58 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
59
60 context.save();
61 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
62 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
63
64 // Layer 1
65
66 alignStroke = 0.0;
67 context.beginPath();
68 pointX = 24.118;
69 pointY = 24.464;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY);
73 pointX = 24.854;
74 pointY = 23.406;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 controlPoint1X = 24.118;
78 controlPoint1Y = 24.05;
79 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
80 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
81 controlPoint2X = 24.44;
82 controlPoint2Y = 23.636;
83 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
84 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
85 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
86 pointX = 29.454;
87 pointY = 20.6;
88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
90 controlPoint1X = 26.418;
91 controlPoint1Y = 22.532;
92 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
93 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
94 controlPoint2X = 28.534;
95 controlPoint2Y = 21.566;
96 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
97 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
98 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
99 pointX = 30.282;
100 pointY = 17.794;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 controlPoint1X = 29.868;
104 controlPoint1Y = 20.232;
105 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
106 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
107 controlPoint2X = 30.282;
108 controlPoint2Y = 19.082;
109 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
110 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
111 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
112 pointX = 27.2;
113 pointY = 12.688;
114 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
115 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
116 controlPoint1X = 30.282;
117 controlPoint1Y = 16.322;
118 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
119 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
120 controlPoint2X = 29.454;
121 controlPoint2Y = 14.344;
122 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
123 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
124 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
125 pointX = 21.312;
126 pointY = 10.664;
127 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
128 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
129 controlPoint1X = 25.636;
130 controlPoint1Y = 11.492;
131 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
132 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
133 controlPoint2X = 23.382;
134 controlPoint2Y = 10.664;
135 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
136 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
137 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
138 pointX = 19.886;
139 pointY = 11.124;
140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
142 controlPoint1X = 20.898;
143 controlPoint1Y = 10.664;
144 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
145 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
146 controlPoint2X = 20.162;
147 controlPoint2Y = 10.894;
148 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
149 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
150 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
151 pointX = 18.0;
152 pointY = 14.666;
153 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
154 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
155 controlPoint1X = 19.104;
156 controlPoint1Y = 11.676;
157 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
158 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
159 controlPoint2X = 18.0;
160 controlPoint2Y = 14.068;
161 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
162 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
163 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
164 pointX = 18.598;
165 pointY = 15.586;
166 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
167 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
168 controlPoint1X = 18.0;
169 controlPoint1Y = 14.896;
170 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
171 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
172 controlPoint2X = 18.138;
173 controlPoint2Y = 15.494;
174 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
175 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
176 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
177 pointX = 19.794;
178 pointY = 15.908;
179 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
180 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
181 controlPoint1X = 19.012;
182 controlPoint1Y = 15.678;
183 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
184 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
185 controlPoint2X = 19.426;
186 controlPoint2Y = 15.77;
187 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
188 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
189 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
190 pointX = 25.36;
191 pointY = 20.002;
192 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
193 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
194 controlPoint1X = 22.508;
195 controlPoint1Y = 16.644;
196 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
197 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
198 controlPoint2X = 25.36;
199 controlPoint2Y = 17.886;
200 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
201 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
202 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
203 pointX = 24.21;
204 pointY = 21.704;
205 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
206 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
207 controlPoint1X = 25.36;
208 controlPoint1Y = 20.738;
209 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
210 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
211 controlPoint2X = 25.084;
212 controlPoint2Y = 21.198;
213 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
214 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
215 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
216 pointX = 19.058;
217 pointY = 24.326;
218 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
219 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
220 controlPoint1X = 23.106;
221 controlPoint1Y = 22.348;
222 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
223 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
224 controlPoint2X = 19.886;
225 controlPoint2Y = 23.774;
226 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
227 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
228 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
229 pointX = 18.506;
230 pointY = 25.936;
231 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
232 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
233 controlPoint1X = 18.736;
234 controlPoint1Y = 24.556;
235 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
236 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
237 controlPoint2X = 18.506;
238 controlPoint2Y = 25.338;
239 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
240 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
241 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
242 pointX = 20.898;
243 pointY = 29.064;
244 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
245 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
246 controlPoint1X = 18.506;
247 controlPoint1Y = 26.948;
248 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
249 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
250 controlPoint2X = 19.334;
251 controlPoint2Y = 28.42;
252 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
253 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
254 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
255 pointX = 22.048;
256 pointY = 29.156;
257 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
258 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
259 controlPoint1X = 21.22;
260 controlPoint1Y = 29.156;
261 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
262 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
263 controlPoint2X = 21.726;
264 controlPoint2Y = 29.202;
265 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
266 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
267 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
268 pointX = 25.268;
269 pointY = 27.592;
270 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
271 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
272 controlPoint1X = 22.508;
273 controlPoint1Y = 29.064;
274 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
275 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
276 controlPoint2X = 24.9;
277 controlPoint2Y = 27.96;
278 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
279 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
280 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
281 pointX = 25.406;
282 pointY = 26.856;
283 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
284 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
285 controlPoint1X = 25.406;
286 controlPoint1Y = 27.454;
287 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
288 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
289 controlPoint2X = 25.544;
290 controlPoint2Y = 26.994;
291 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
292 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
293 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
294 pointX = 24.118;
295 pointY = 24.464;
296 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
297 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
298 controlPoint1X = 24.578;
299 controlPoint1Y = 25.936;
300 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
301 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
302 controlPoint2X = 24.118;
303 controlPoint2Y = 24.786;
304 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
305 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
306 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
307 pointX = 24.118;
308 pointY = 24.464;
309 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
310 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
311 context.lineTo(pointX, pointY);
312 context.closePath();
313 pointX = 23.06;
314 pointY = 31.962;
315 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
316 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
317 context.moveTo(pointX, pointY);
318 pointX = 20.53;
319 pointY = 32.928;
320 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
321 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
322 controlPoint1X = 22.186;
323 controlPoint1Y = 31.962;
324 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
325 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
326 controlPoint2X = 21.22;
327 controlPoint2Y = 32.33;
328 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
329 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
330 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
331 pointX = 19.426;
332 pointY = 35.458;
333 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
334 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
335 controlPoint1X = 19.794;
336 controlPoint1Y = 33.618;
337 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
338 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
339 controlPoint2X = 19.426;
340 controlPoint2Y = 34.538;
341 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
342 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
343 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
344 pointX = 20.392;
345 pointY = 38.08;
346 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
347 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
348 controlPoint1X = 19.426;
349 controlPoint1Y = 36.47;
350 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
351 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
352 controlPoint2X = 19.702;
353 controlPoint2Y = 37.344;
354 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
355 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
356 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
357 pointX = 22.738;
358 pointY = 39.0;
359 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
360 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
361 controlPoint1X = 21.128;
362 controlPoint1Y = 38.77;
363 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
364 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
365 controlPoint2X = 22.048;
366 controlPoint2Y = 39.0;
367 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
368 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
369 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
370 pointX = 25.544;
371 pointY = 38.034;
372 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
373 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
374 controlPoint1X = 23.796;
375 controlPoint1Y = 39.0;
376 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
377 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
378 controlPoint2X = 24.854;
379 controlPoint2Y = 38.724;
380 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
381 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
382 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
383 pointX = 26.556;
384 pointY = 35.55;
385 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
386 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
387 controlPoint1X = 26.188;
388 controlPoint1Y = 37.344;
389 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
390 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
391 controlPoint2X = 26.556;
392 controlPoint2Y = 36.194;
393 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
394 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
395 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
396 pointX = 25.452;
397 pointY = 32.744;
398 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
399 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
400 controlPoint1X = 26.556;
401 controlPoint1Y = 34.676;
402 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
403 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
404 controlPoint2X = 26.326;
405 controlPoint2Y = 33.618;
406 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
407 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
408 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
409 pointX = 23.06;
410 pointY = 31.962;
411 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
412 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
413 controlPoint1X = 24.854;
414 controlPoint1Y = 32.284;
415 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
416 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
417 controlPoint2X = 23.934;
418 controlPoint2Y = 31.962;
419 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
420 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
421 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
422 pointX = 23.06;
423 pointY = 31.962;
424 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
425 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
426 context.lineTo(pointX, pointY);
427 context.closePath();
428 pointX = 32.214;
429 pointY = 38.402;
430 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
431 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
432 context.moveTo(pointX, pointY);
433 color = "#FFFFFF";
434 context.fillStyle = color;
435 context.fill();
436
437 context.restore();
438}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
new file mode 100644
index 0000000..288e0be
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
@@ -0,0 +1,403 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //normal.js
31 //normal
32//
33 //Created by Giulio Cesare Solaroli on 3/24/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_RegisterButton_normalWidth = 282.0;
39var kClipperz_PM_UI_Canvas_RegisterButton_normalHeight = 93.0;
40
41function Clipperz_PM_UI_Canvas_RegisterButton_normal(canvas, aBackgroundColor, aDarkBackgroundColor, aLightColor, aDarkColor, aStarColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 var controlPoint1X;
50 var controlPoint1Y;
51 var controlPoint2X;
52 var controlPoint2Y;
53 var gradient;
54 var color;
55 if (window.devicePixelRatio)
56 resolution = window.devicePixelRatio;
57 else
58 resolution = 1.0;
59 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
60
61 context.save();
62 context.scale(canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
63 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
64
65 // background
66
67 alignStroke = 0.0;
68 context.beginPath();
69 pointX = 241.0;
70 pointY = 80.0;
71 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
72 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
73 context.moveTo(pointX, pointY);
74 pointX = 274.0;
75 pointY = 47.0;
76 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
77 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
78 controlPoint1X = 259.103;
79 controlPoint1Y = 80.0;
80 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
81 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
82 controlPoint2X = 274.0;
83 controlPoint2Y = 65.103;
84 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
85 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
86 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
87 pointX = 274.0;
88 pointY = 45.0;
89 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
90 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
91 context.lineTo(pointX, pointY);
92 pointX = 241.0;
93 pointY = 12.0;
94 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
95 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
96 controlPoint1X = 274.0;
97 controlPoint1Y = 26.897;
98 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
99 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
100 controlPoint2X = 259.103;
101 controlPoint2Y = 12.0;
102 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
103 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
104 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
105 pointX = 60.0;
106 pointY = 12.0;
107 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
108 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
109 context.lineTo(pointX, pointY);
110 pointX = 27.0;
111 pointY = 45.0;
112 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
113 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
114 controlPoint1X = 41.897;
115 controlPoint1Y = 12.0;
116 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
117 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
118 controlPoint2X = 27.0;
119 controlPoint2Y = 26.897;
120 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
121 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
122 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
123 pointX = 27.0;
124 pointY = 47.0;
125 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
126 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
127 context.lineTo(pointX, pointY);
128 pointX = 60.0;
129 pointY = 80.0;
130 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
131 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
132 controlPoint1X = 27.0;
133 controlPoint1Y = 65.103;
134 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
135 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
136 controlPoint2X = 41.897;
137 controlPoint2Y = 80.0;
138 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
139 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
140 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
141 pointX = 241.0;
142 pointY = 80.0;
143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
145 context.lineTo(pointX, pointY);
146 context.closePath();
147 gradient = context.createLinearGradient(150.5, 12.0, 150.5, 80.0);
148 gradient.addColorStop(0.0, aBackgroundColor);
149 gradient.addColorStop(1.0, aDarkBackgroundColor);
150 context.fillStyle = gradient;
151 context.fill();
152
153 // round
154
155 alignStroke = 0.0;
156 context.beginPath();
157 pointX = 44.103;
158 pointY = 4.014;
159 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
160 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
161 context.moveTo(pointX, pointY);
162 pointX = 65.629;
163 pointY = 10.515;
164 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
165 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
166 controlPoint1X = 51.706;
167 controlPoint1Y = 4.217;
168 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
169 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
170 controlPoint2X = 59.185;
171 controlPoint2Y = 6.475;
172 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
173 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
174 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
175 pointX = 78.65;
176 pointY = 70.918;
177 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
178 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
179 context.lineTo(pointX, pointY);
180 pointX = 43.0;
181 pointY = 90.0;
182 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
183 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
184 controlPoint1X = 70.676;
185 controlPoint1Y = 82.788;
186 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
187 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
188 controlPoint2X = 57.23;
189 controlPoint2Y = 89.817;
190 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
191 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
192 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
193 pointX = 0.056;
194 pointY = 44.801;
195 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
196 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
197 controlPoint1X = 18.834;
198 controlPoint1Y = 90.07;
199 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
200 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
201 controlPoint2X = -1.18;
202 controlPoint2Y = 68.879;
203 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
204 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
205 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
206 pointX = 44.103;
207 pointY = 4.014;
208 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
209 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
210 controlPoint1X = 1.242;
211 controlPoint1Y = 21.708;
212 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
213 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
214 controlPoint2X = 21.202;
215 controlPoint2Y = 3.72;
216 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
217 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
218 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
219 pointX = 44.103;
220 pointY = 4.014;
221 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
222 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
223 context.lineTo(pointX, pointY);
224 context.closePath();
225 gradient = context.createLinearGradient(39.326, 90, 39.326, 4.011);
226 gradient.addColorStop(0.0, aDarkColor);
227 gradient.addColorStop(1.0, aLightColor);
228 context.fillStyle = gradient;
229 context.fill();
230
231 // *
232
233 alignStroke = 0.0;
234 context.beginPath();
235 pointX = 23.983;
236 pointY = 35.944;
237 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
238 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
239 context.moveTo(pointX, pointY);
240 pointX = 37.25;
241 pointY = 40.261;
242 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
243 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
244 context.lineTo(pointX, pointY);
245 pointX = 37.25;
246 pointY = 24.963;
247 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
248 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
249 context.lineTo(pointX, pointY);
250 pointX = 48.231;
251 pointY = 24.963;
252 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
253 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
254 context.lineTo(pointX, pointY);
255 pointX = 48.231;
256 pointY = 40.261;
257 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
258 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
259 context.lineTo(pointX, pointY);
260 pointX = 61.498;
261 pointY = 35.944;
262 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
263 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
264 context.lineTo(pointX, pointY);
265 pointX = 64.481;
266 pointY = 45.402;
267 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
268 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
269 context.lineTo(pointX, pointY);
270 pointX = 50.961;
271 pointY = 49.592;
272 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
273 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
274 context.lineTo(pointX, pointY);
275 pointX = 59.784;
276 pointY = 62.224;
277 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
278 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
279 context.lineTo(pointX, pointY);
280 pointX = 51.659;
281 pointY = 68.0;
282 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
283 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
284 context.lineTo(pointX, pointY);
285 pointX = 42.836;
286 pointY = 56.066;
287 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
288 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
289 context.lineTo(pointX, pointY);
290 pointX = 33.759;
291 pointY = 68.0;
292 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
293 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
294 context.lineTo(pointX, pointY);
295 pointX = 25.634;
296 pointY = 62.224;
297 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
298 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
299 context.lineTo(pointX, pointY);
300 pointX = 34.521;
301 pointY = 49.592;
302 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
303 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
304 context.lineTo(pointX, pointY);
305 pointX = 21.0;
306 pointY = 45.402;
307 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
308 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
309 context.lineTo(pointX, pointY);
310 pointX = 23.983;
311 pointY = 35.944;
312 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
313 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
314 context.lineTo(pointX, pointY);
315 context.closePath();
316 pointX = 68.607;
317 pointY = 119.099;
318 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
319 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
320 context.moveTo(pointX, pointY);
321 context.fillStyle = aStarColor;
322 context.fill();
323
324 alignStroke = 0.0;
325 context.beginPath();
326 pointX = 212.0;
327 pointY = 125.0;
328 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
329 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
330 context.moveTo(pointX, pointY);
331 pointX = 213.0;
332 pointY = 125.0;
333 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
334 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
335 context.lineTo(pointX, pointY);
336 pointX = 212.5;
337 pointY = 124.0;
338 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
339 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
340 context.lineTo(pointX, pointY);
341 pointX = 212.0;
342 pointY = 125.0;
343 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
344 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
345 context.lineTo(pointX, pointY);
346 context.closePath();
347 gradient = context.createLinearGradient(212.5, 125.0, 212.5, 124.0);
348 color = "#FFFFFF";
349 gradient.addColorStop(0.0, color);
350 color = "#A9A9A9";
351 gradient.addColorStop(1.0, color);
352 context.fillStyle = gradient;
353 context.fill();
354
355 // flip
356
357 // Setup for Shadow Effect
358 color = "rgba(0.0%, 0.0%, 0.0%, 0.5)";
359 context.save();
360 context.shadowColor = color;
361 context.shadowBlur = 0.0;
362 context.shadowOffsetX = 2.0 * Math.cos(8.377) * resolution;
363 context.shadowOffsetY = 2.0 * Math.sin(8.377) * resolution;
364
365 // round
366
367 alignStroke = 0.0;
368 context.beginPath();
369 pointX = 78.506;
370 pointY = 70.251;
371 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
372 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
373 context.moveTo(pointX, pointY);
374 pointX = 66.155;
375 pointY = 12.954;
376 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
377 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
378 controlPoint1X = 59.899;
379 controlPoint1Y = 57.427;
380 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
381 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
382 controlPoint2X = 54.678;
383 controlPoint2Y = 32.277;
384 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
385 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
386 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
387 pointX = 78.506;
388 pointY = 70.251;
389 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
390 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
391 context.lineTo(pointX, pointY);
392 context.closePath();
393 gradient = context.createLinearGradient(69.301, 70.251, 69.301, 12.954);
394 gradient.addColorStop(0.0, aDarkColor);
395 gradient.addColorStop(1.0, aLightColor);
396 context.fillStyle = gradient;
397 context.fill();
398
399 // Shadow Effect
400 context.restore();
401
402 context.restore();
403}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
new file mode 100644
index 0000000..e70e3b5
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
@@ -0,0 +1,153 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //normal.js
31 //normal
32//
33 //Created by Giulio Cesare Solaroli on 3/15/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Star_normalWidth = 46.0;
39var kClipperz_PM_UI_Canvas_Star_normalHeight = 46.0;
40
41function Clipperz_PM_UI_Canvas_Star_normal(canvas, aColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 if (window.devicePixelRatio)
50 resolution = window.devicePixelRatio;
51 else
52 resolution = 1.0;
53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight);
54
55 context.save();
56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight);
57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Star_normalWidth, kClipperz_PM_UI_Canvas_Star_normalHeight);
58
59 // *
60
61 alignStroke = 0.0;
62 context.beginPath();
63 pointX = 8.613;
64 pointY = 15.583;
65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
67 context.moveTo(pointX, pointY);
68 pointX = 18.563;
69 pointY = 18.821;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.lineTo(pointX, pointY);
73 pointX = 18.563;
74 pointY = 7.347;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY);
78 pointX = 26.799;
79 pointY = 7.347;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 context.lineTo(pointX, pointY);
83 pointX = 26.799;
84 pointY = 18.821;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 context.lineTo(pointX, pointY);
88 pointX = 36.749;
89 pointY = 15.583;
90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
92 context.lineTo(pointX, pointY);
93 pointX = 38.986;
94 pointY = 22.677;
95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
97 context.lineTo(pointX, pointY);
98 pointX = 28.846;
99 pointY = 25.819;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 context.lineTo(pointX, pointY);
103 pointX = 35.463;
104 pointY = 35.293;
105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
107 context.lineTo(pointX, pointY);
108 pointX = 29.369;
109 pointY = 39.625;
110 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
111 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
112 context.lineTo(pointX, pointY);
113 pointX = 22.752;
114 pointY = 30.675;
115 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
116 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
117 context.lineTo(pointX, pointY);
118 pointX = 15.944;
119 pointY = 39.625;
120 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
121 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
122 context.lineTo(pointX, pointY);
123 pointX = 9.85;
124 pointY = 35.293;
125 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
126 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
127 context.lineTo(pointX, pointY);
128 pointX = 16.515;
129 pointY = 25.819;
130 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
131 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
132 context.lineTo(pointX, pointY);
133 pointX = 6.375;
134 pointY = 22.677;
135 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
136 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
137 context.lineTo(pointX, pointY);
138 pointX = 8.613;
139 pointY = 15.583;
140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
142 context.lineTo(pointX, pointY);
143 context.closePath();
144 pointX = 42.081;
145 pointY = 77.949;
146 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
147 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
148 context.moveTo(pointX, pointY);
149 context.fillStyle = aColor;
150 context.fill();
151
152 context.restore();
153}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
new file mode 100644
index 0000000..216fd24
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
@@ -0,0 +1,156 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //close.js
31 //close
32//
33 //Created by Giulio Cesare Solaroli on 3/14/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Tips_closeWidth = 310.0;
39var kClipperz_PM_UI_Canvas_Tips_closeHeight = 6.0;
40
41function Clipperz_PM_UI_Canvas_Tips_close(canvas, aColor, aBackgroundColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 if (window.devicePixelRatio)
50 resolution = window.devicePixelRatio;
51 else
52 resolution = 1.0;
53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight);
54
55 context.save();
56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight);
57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_closeWidth, kClipperz_PM_UI_Canvas_Tips_closeHeight);
58
59 // background
60
61 alignStroke = 0.0;
62 context.beginPath();
63 pointX = 310.0;
64 pointY = 6.0;
65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
67 context.moveTo(pointX, pointY);
68 pointX = 310.0;
69 pointY = 0.0;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.lineTo(pointX, pointY);
73 pointX = 0.0;
74 pointY = 0.0;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY);
78 pointX = 0.0;
79 pointY = 6.0;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 context.lineTo(pointX, pointY);
83 pointX = 310.0;
84 pointY = 6.0;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 context.lineTo(pointX, pointY);
88 context.closePath();
89 context.fillStyle = aBackgroundColor;
90 context.fill();
91
92 // grid
93
94 // background
95
96 alignStroke = 0.0;
97 context.beginPath();
98 pointX = 310.0;
99 pointY = 6.0;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 context.moveTo(pointX, pointY);
103 pointX = 310.0;
104 pointY = 0.0;
105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
107 context.lineTo(pointX, pointY);
108 pointX = 0.0;
109 pointY = 0.0;
110 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
111 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
112 context.lineTo(pointX, pointY);
113 pointX = 0.0;
114 pointY = 6.0;
115 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
116 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
117 context.lineTo(pointX, pointY);
118 pointX = 310.0;
119 pointY = 6.0;
120 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
121 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
122 context.lineTo(pointX, pointY);
123 context.closePath();
124 context.fillStyle = aBackgroundColor;
125 context.fill();
126
127 // toggle
128
129 alignStroke = 0.0;
130 context.beginPath();
131 pointX = 149.0;
132 pointY = 6.0;
133 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
134 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
135 context.moveTo(pointX, pointY);
136 pointX = 161.0;
137 pointY = 6.0;
138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
140 context.lineTo(pointX, pointY);
141 pointX = 155.0;
142 pointY = 0.0;
143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
145 context.lineTo(pointX, pointY);
146 pointX = 149.0;
147 pointY = 6.0;
148 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
149 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
150 context.lineTo(pointX, pointY);
151 context.closePath();
152 context.fillStyle = aColor;
153 context.fill();
154
155 context.restore();
156}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
new file mode 100644
index 0000000..f1bdaa9
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
@@ -0,0 +1,163 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//
30 //open.js
31 //open
32//
33 //Created by Giulio Cesare Solaroli on 3/14/10
34 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way.
36//
37
38var kClipperz_PM_UI_Canvas_Tips_openWidth = 310.0;
39var kClipperz_PM_UI_Canvas_Tips_openHeight = 6.0;
40
41function Clipperz_PM_UI_Canvas_Tips_open(canvas, aColor, aBackgroundColor)
42{
43 var context = canvas.getContext("2d");
44 var alignStroke;
45 var resolution;
46 var path;
47 var pointX;
48 var pointY;
49 var color;
50 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio;
52 else
53 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight);
55
56 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_openWidth, kClipperz_PM_UI_Canvas_Tips_openHeight);
59
60 // background
61
62 alignStroke = 0.0;
63 context.beginPath();
64 pointX = 310.0;
65 pointY = 6.0;
66 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
67 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
68 context.moveTo(pointX, pointY);
69 pointX = 310.0;
70 pointY = 0.0;
71 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
72 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
73 context.lineTo(pointX, pointY);
74 pointX = 0.0;
75 pointY = 0.0;
76 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
77 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
78 context.lineTo(pointX, pointY);
79 pointX = 0.0;
80 pointY = 6.0;
81 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
82 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
83 context.lineTo(pointX, pointY);
84 pointX = 310.0;
85 pointY = 6.0;
86 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
87 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
88 context.lineTo(pointX, pointY);
89 context.closePath();
90 context.fillStyle = aBackgroundColor;
91 context.fill();
92
93 // grid
94
95 // background
96
97 alignStroke = 0.0;
98 context.beginPath();
99 pointX = 310.0;
100 pointY = 6.0;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 context.moveTo(pointX, pointY);
104 pointX = 310.0;
105 pointY = 0.0;
106 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
107 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
108 context.lineTo(pointX, pointY);
109 pointX = 0.0;
110 pointY = 0.0;
111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
113 context.lineTo(pointX, pointY);
114 pointX = 0.0;
115 pointY = 6.0;
116 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
117 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
118 context.lineTo(pointX, pointY);
119 pointX = 310.0;
120 pointY = 6.0;
121 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
122 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
123 context.lineTo(pointX, pointY);
124 context.closePath();
125 context.fillStyle = aBackgroundColor;
126 context.fill();
127
128 // Layer 1
129
130 alignStroke = 0.0;
131 context.save();
132 context.translate(155.0, 3.0);
133 context.rotate(-3.142);
134 context.translate(-155.0, -3.0);
135 context.beginPath();
136 pointX = 149.0;
137 pointY = 6.0;
138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
140 context.moveTo(pointX, pointY);
141 pointX = 161.0;
142 pointY = 6.0;
143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
145 context.lineTo(pointX, pointY);
146 pointX = 155.0;
147 pointY = 0.0;
148 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
149 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
150 context.lineTo(pointX, pointY);
151 pointX = 149.0;
152 pointY = 6.0;
153 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
154 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
155 context.lineTo(pointX, pointY);
156 context.closePath();
157 color = "#FFFFFF";
158 context.fillStyle = color;
159 context.fill();
160 context.restore();
161
162 context.restore();
163}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
new file mode 100644
index 0000000..26f2fc4
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
@@ -0,0 +1,611 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31//#############################################################################
32
33var _Clipperz_PM_Components_base_id_ = 0;
34
35//#############################################################################
36
37Clipperz.PM.UI.Common.Components.BaseComponent = function(args) {
38 args = args || {};
39 Clipperz.PM.UI.Common.Components.BaseComponent.superclass.constructor.call(this, args);
40
41 this._element = args.element || null;
42 this._ids = {};
43
44 this._slots = {};
45 this._slotComponents = {};
46
47 this._components = {};
48
49 this._cachedSlots = {};
50
51 this._isModal = false;
52
53 this._isActive = false;
54 this._elementUsedToEnterModalState;
55
56 this._isFullyRendered = false;
57 this._renderingWaitingQueue = [];
58
59 //this._slots = {
60 // 'header':'header',
61 // 'body': 'body',
62 // 'footer':'footer'
63 //};
64
65 return this;
66}
67
68//=============================================================================
69
70//TODO get back to MochiKit.Base.update as we are not extending anything
71//MochiKit.Base.update(Clipperz.PM.UI.Common.Components.BaseComponent.prototype, {
72Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.BaseComponent, /*Ext.Component*/ Object, {
73
74 'isClipperzPMComponent': true,
75
76 //-------------------------------------------------------------------------
77
78 'toString': function () {
79 return "Clipperz.PM.UI.Common.Components.BaseComponent component";
80 },
81
82 'componentId': function () {
83 return this.getId('_id_');
84 },
85
86 //-------------------------------------------------------------------------
87/*
88 'slots': function() {
89 return this._slots;
90 },
91*/
92 'slotComponents': function() {
93 return this._slotComponents;
94 },
95
96 //-------------------------------------------------------------------------
97
98 'components': function () {
99 return this._components;
100 },
101
102 'addComponent': function (aComponent) {
103 this.components()[aComponent.componentId()] = aComponent;
104 },
105
106 'removeComponent': function (aComponent) {
107 var componentId;
108
109 componentId = aComponent.componentId();
110 this.components()[componentId].remove();
111 delete this.components()[componentId];
112 },
113
114 //-------------------------------------------------------------------------
115/*
116 'domHelper': function() {
117 return Clipperz.YUI.DomHelper;
118 },
119 */
120 //-------------------------------------------------------------------------
121/*
122 'domHelperAppend': function(aValue) {
123 Clipperz.YUI.DomHelper.append(this.element().dom, aValue);
124 },
125 */
126 //-------------------------------------------------------------------------
127
128 'element': function() {
129//MochiKit.Logging.logDebug(">>> BaseComponent.element");
130 return MochiKit.DOM.getElement(this._element);
131 },
132
133 'setElement': function(aNode) {
134 this._element = aNode;
135 },
136
137 //-----------------------------------------------------
138
139 'displayElement': function() {
140 return this.element();
141 },
142
143 //-------------------------------------------------------------------------
144
145 'renderInNode': function(aDomNode) {
146 this.setElement(aDomNode);
147 this.render();
148 },
149
150 'render': function() {
151 this.clear();
152 this.renderSelf();
153 this.renderComponents();
154 if (this.shouldShowTranslationHints()) {
155 this.renderTranslationHints();
156 }
157 if (this.shouldShowElementWhileRendering()) {
158 MochiKit.Style.showElement(this.displayElement());
159 };
160
161 this._isFullyRendered = true;
162
163 MochiKit.Iter.forEach(this.renderingWaitingQueue(), MochiKit.Base.methodcaller('callback'));
164 this.resetRenderingWaitingQueue();
165 },
166
167 'renderSelf': function() {
168 throw Clipperz.Base.exception.AbstractMethod;
169 },
170
171 'renderComponents': function() {
172 varslotName;
173
174 for (slotName in this.slotComponents()) {
175 this.slotComponents()[slotName].renderInNode(this.elementForSlotNamed(slotName));
176 }
177 },
178
179 //.........................................................................
180
181 'isFullyRendered': function () {
182 return this._isFullyRendered;
183 },
184
185 //.........................................................................
186
187 'renderingWaitingQueue': function () {
188 return this._renderingWaitingQueue;
189 },
190
191 'resetRenderingWaitingQueue': function () {
192 this._renderingWaitingQueue = [];
193 },
194
195 //.........................................................................
196
197 'waitUntilFullyRendered': function () {
198 var deferredResult;
199
200 if (this.isFullyRendered() == true) {
201 deferredResult = MochiKit.Async.succeed
202 } else {
203 deferredResult = new Clipperz.Async.Deferred("BaseComponent.waitUntilFullyRendered", {trace:false});
204 this.renderingWaitingQueue().push(deferredResult);
205 }
206
207 return deferredResult;
208 },
209
210 //-----------------------------------------------------
211
212 'renderTranslationHints': function () {
213 vartranslatableItems;
214
215 translatableItems = MochiKit.Selector.findChildElements(this.displayElement(), ['[stringID]']);
216 MochiKit.Iter.forEach(translatableItems, MochiKit.Base.method(this, 'enhanceTranslatableElement'))
217 },
218
219 'enhanceTranslatableElement': function (anElement) {
220//Clipperz.log(">>> enhanceTranslatableElement", anElement);
221 // new Clipperz.PM.UI.Common.Components.TranslatorWidget({
222 // 'element':anElement
223 // });
224
225 MochiKit.Signal.connect(anElement, 'onmouseenter', MochiKit.Base.partial(Clipperz.PM.UI.Common.Components.TranslatorWidget.show, anElement, MochiKit.DOM.getNodeAttribute(anElement, 'stringID')));
226 MochiKit.Signal.connect(anElement, 'onmouseleave', Clipperz.PM.UI.Common.Components.TranslatorWidget.hide);
227//Clipperz.log("<<< enhanceTranslatableElement");
228 },
229
230 //-----------------------------------------------------
231
232 'update': function(args) {
233 throw Clipperz.Base.exception.AbstractMethod;
234 },
235
236 'updateSelf': function(args) {
237 throw Clipperz.Base.exception.AbstractMethod;
238 },
239
240 'updateComponents': function(args) {
241 throw Clipperz.Base.exception.AbstractMethod;
242 },
243
244 //-----------------------------------------------------
245
246 'refresh': function() {
247 throw Clipperz.Base.exception.AbstractMethod;
248 },
249
250 'refreshSelf': function() {
251 throw Clipperz.Base.exception.AbstractMethod;
252 },
253
254 'refreshComponents': function(args) {
255 throw Clipperz.Base.exception.AbstractMethod;
256 },
257
258 //-----------------------------------------------------
259
260 'checkSlotNamed': function(aSlotName) {
261 if (typeof(this._slots[aSlotName]) == 'undefined') {
262 throw new Error("undefined slot");
263 };
264 },
265
266 //-----------------------------------------------------
267
268 'cachedSlots': function() {
269 return this._cachedSlots;
270 },
271
272 'slotNamed': function(aSlotName) {
273 var result;
274
275 this.checkSlotNamed(aSlotName);
276 if (typeof(this.cachedSlots()[aSlotName]) == 'undefined') {
277 this.cachedSlots()[aSlotName] = new Clipperz.PM.UI.Common.Components.ComponentSlot(this,aSlotName);
278 }
279
280 result = this.cachedSlots()[aSlotName];
281
282 return result;
283 },
284
285 //-----------------------------------------------------
286
287 'elementForSlotNamed': function(aSlotName) {
288 return MochiKit.DOM.getElement(this._slots[aSlotName]);
289 },
290
291 //-----------------------------------------------------
292
293 'componentForSlotNamed': function(aSlotName) {
294 return this.slotComponents()[aSlotName];
295 },
296
297 'setComponentForSlotNamed': function(aComponent, aSlotName) {
298 var domNode;
299
300 this.checkSlotNamed(aSlotName);
301
302 if (this.slotComponents()[aSlotName] != null) {
303 this.slotComponents()[aSlotName].remove();
304 }
305
306 this.slotComponents()[aSlotName] = aComponent;
307
308 // domNode = MochiKit.DOM.getElement(this.slotNamed(aSlotName));
309 domNode = this.elementForSlotNamed(aSlotName);
310
311 if (domNode != null) {
312 aComponent.renderInNode(domNode);
313 }
314 },
315
316 //-----------------------------------------------------
317/*
318 'purgeListeners': function() {
319//MochiKit.Logging.logDebug(">>> Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners [" + this + "]");
320//MochiKit.Logging.logDebug("--- " + this + ".purgeListeners");
321 Clipperz.NotificationCenter.unregister(this);
322 MochiKit.Signal.disconnectAllTo(this);
323//MochiKit.Logging.logDebug("<<< Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners");
324 },
325 */
326 //-----------------------------------------------------
327
328 'clear': function() {
329 varslotName;
330 var componentId;
331
332 MochiKit.Signal.disconnectAllTo(this);
333
334 for (slotName in this.slotComponents()) {
335 this.slotComponents()[slotName].clear();
336 }
337
338 for (componentId in this.components()) {
339 this.components()[componentId].clear();
340 }
341
342 // if (this.element() != null) {
343 // this.element().innerHTML = "";
344 // }
345
346 if (this.displayElement() != null) {
347 if (this.element() != this.displayElement()) {
348 MochiKit.DOM.removeElement(this.displayElement());
349 } else {
350 this.displayElement().innerHTML = "";
351 }
352 }
353
354 if (this.isModal()) {
355 //TODO: cleanup when the closed element was shown modally.
356 }
357 },
358
359
360 'remove': function() {
361 varslotName;
362 var componentId;
363
364 for (slotName in this.slotComponents()) {
365 this.slotComponents()[slotName].remove();
366 delete this.slotComponents()[slotName];
367 }
368
369 for (componentId in this.components()) {
370 this.components()[componentId].remove();
371 delete this.components()[componentId];
372 }
373
374 this.clear();
375 MochiKit.Signal.disconnectAll(this);
376 },
377
378 'append': function(aNode, aValue) {
379 return Clipperz.DOM.Helper.append(aNode, aValue);
380 },
381
382 'insertBefore': function (aNode, aValue) {
383 return Clipperz.DOM.Helper.insertBefore(aNode, aValue);
384 },
385
386 'insertAfter': function (aNode, aValue) {
387 return Clipperz.DOM.Helper.insertAfter(aNode, aValue);
388 },
389
390 //-------------------------------------------------------------------------
391
392 'getId': function(aValue) {
393 varresult;
394
395 if (typeof(aValue) != 'undefined') {
396 result = this._ids[aValue];
397
398 if (typeof(result) == 'undefined') {
399 _Clipperz_PM_Components_base_id_ ++;
400
401 result = "Clipperz_PM_Components_" + aValue + "_" + _Clipperz_PM_Components_base_id_;
402 this._ids[aValue] = result;
403 }
404 } else {
405 // result = Clipperz.PM.UI.Common.Components.BaseComponent.superclass.getId.call(this);
406 throw "call to BaseComponent.getId with an undefined value";
407 }
408
409 return result;
410 },
411
412 //-------------------------------------------------------------------------
413
414 'getElement': function(aValue) {
415 return Clipperz.DOM.get(this.getId(aValue));
416 },
417
418 //-------------------------------------------------------------------------
419
420 'hideElement': function(anElementName) {
421 MochiKit.Style.hideElement(this.getElement(anElementName));
422 },
423
424 'showElement': function(anElementName) {
425 MochiKit.Style.showElement(this.getElement(anElementName));
426 },
427
428 //-------------------------------------------------------------------------
429
430 'activate': function () {
431 this._isActive = true;
432 },
433
434 'deactivate': function () {
435 this._isActive = false;
436 },
437
438 'isActive': function () {
439 return this._isActive;
440 },
441
442 //-------------------------------------------------------------------------
443
444 'hideSlot': function(aSlotName) {
445 if (this.componentForSlotNamed(aSlotName)) {
446 this.componentForSlotNamed(aSlotName).deactivate();
447 }
448 MochiKit.Style.hideElement(this.elementForSlotNamed(aSlotName));
449 },
450
451 'showSlot': function(aSlotName) {
452 if (this.componentForSlotNamed(aSlotName)) {
453 this.componentForSlotNamed(aSlotName).activate();
454 }
455 MochiKit.Style.showElement(this.elementForSlotNamed(aSlotName));
456 },
457
458 //-------------------------------------------------------------------------
459
460 'shouldShowTranslationHints': function () {
461 return false;
462 },
463
464 'shouldShowElementWhileRendering': function() {
465 return true;
466 },
467
468 //'shouldRemoveElementWhenClearningUp': function () {
469 // return true;
470 //},
471
472 //-------------------------------------------------------------------------
473
474 'isModal': function() {
475 return this._isModal;
476 },
477
478 'setIsModal': function(aValue) {
479 this._isModal = aValue;
480 },
481
482 //-------------------------------------------------------------------------
483
484 'elementUsedToEnterModalState': function () {
485 return this._elementUsedToEnterModalState;
486 },
487
488 'setElementUsedToEnterModalState': function (aValue) {
489 this._elementUsedToEnterModalState = aValue;
490 },
491
492 //-------------------------------------------------------------------------
493
494 'modalDialogMask': function () {
495 return 'modalDialogMask';
496 },
497
498 'modalDialog': function () {
499 return 'modalDialog';
500 },
501
502 'modalDialogFrame': function() {
503 return 'modalDialogFrame'
504 },
505
506 //-------------------------------------------------------------------------
507
508 'deferredShowModal': function(args) {
509 var deferredResult;
510
511 deferredResult = new Clipperz.Async.Deferred("BaseComponent.deferredShowModal", {trace:false});
512
513 deferredResult.addMethod(this, 'setIsModal', true);
514 deferredResult.addCallback(MochiKit.Style.showElement, this.modalDialogMask());
515 deferredResult.addCallback(MochiKit.Base.bind(function(someArgs) {
516 var result;
517 var duration;
518 var from;
519 var to;
520
521 duration = someArgs.duration || 0.4;
522
523 this.setElementUsedToEnterModalState(someArgs.openFromElement);
524 from = Clipperz.Style.getSizeAndPosition(someArgs.openFromElement);
525 this.renderInNode(this.modalDialog());
526 MochiKit.DOM.addElementClass(this.modalDialog(), 'fixed');
527 to = Clipperz.Style.getSizeAndPosition(this.displayElement());
528 Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition = Clipperz.Base.deepClone(to);
529
530 MochiKit.Style.hideElement(this.displayElement());
531 MochiKit.Style.showElement(this.modalDialogFrame());
532
533 result = {from:from, to:to, duration:duration};
534 return result;
535 }, this, args));
536 deferredResult.addCallback(Clipperz.Visual.deferredResize, this.modalDialogFrame());
537 deferredResult.addCallback(MochiKit.Base.bind(function(someArgs) {
538 MochiKit.Style.hideElement(this.modalDialogFrame());
539 MochiKit.Style.showElement(this.displayElement());
540 }, this));
541 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
542 deferredResult.callback();
543
544 return deferredResult;
545 },
546
547 //-------------------------------------------------------------------------
548
549 'deferredHideModal': function(args) {
550 var deferredResult;
551
552 args = args || {};
553
554 deferredResult = new Clipperz.Async.Deferred("BaseComponent.deferredHideModal", {trace:false});
555 deferredResult.addCallback(MochiKit.Base.bind(function(someArgs) {
556 var result;
557 var from;
558 var toElement;
559 var to;
560 var duration;
561
562 toElement = args.closeToElement || this.elementUsedToEnterModalState();
563 duration = someArgs.duration || 0.4;
564 from = Clipperz.Style.getSizeAndPosition(this.displayElement());
565 to = Clipperz.Style.getSizeAndPosition(toElement);
566
567 MochiKit.Style.hideElement(this.displayElement());
568 MochiKit.Style.showElement(this.modalDialogFrame());
569
570 result = {from:from, to:to, duration:duration};
571 return result;
572 }, this, args));
573 deferredResult.addCallback(Clipperz.Visual.deferredResize, this.modalDialogFrame());
574 deferredResult.addCallback(MochiKit.Base.bind(function() {
575 MochiKit.Style.hideElement(this.modalDialogFrame());
576 MochiKit.Style.hideElement(this.modalDialogMask());
577 }, this));
578 deferredResult.addMethod(this, 'setIsModal', false);
579 deferredResult.addMethod(this, 'clear'); //##############
580 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
581 deferredResult.callback();
582
583 return deferredResult;
584 },
585
586 //-------------------------------------------------------------------------
587
588 __syntaxFix__: "syntax fix"
589
590});
591
592Clipperz.PM.UI.Common.Components.BaseComponent_modalDialog = function() {
593 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
594 {tag:'div', id:'modalDialogWrapper', cls:'modalDialogWrapper', children:[
595 {tag:'div', id:'modalDialogMask', cls:'modalDialogMask'},
596 {tag:'div', id:'modalDialogFrame', cls:'modalDialogFrame' /*, html:"modal dialog frame"*/},
597 {tag:'div', id:'modalDialog', cls:'modalDialog'}
598 // {tag:'div', id:'modalDialog', cls:'modalDialog', children:[{tag:'div'}]}
599 ]}
600 );
601
602 //MochiKit.Style.hideElement('modalDialogWrapper');
603 MochiKit.Style.hideElement('modalDialogMask');
604 MochiKit.Style.hideElement('modalDialogFrame');
605 //MochiKit.Style.hideElement('modalDialog');
606
607};
608
609//Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition = {'x':'X', 'y':'Y'};
610
611MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.BaseComponent_modalDialog);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
new file mode 100644
index 0000000..b2761ea
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
@@ -0,0 +1,108 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Common.Components.Button = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Common.Components.Button.superclass.constructor.apply(this, arguments);
35
36 this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._isDefault = args.isDefault|| false;
39
40 this.render();
41
42 return this;
43}
44
45//=============================================================================
46
47Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Button, Clipperz.PM.UI.Common.Components.BaseComponent, {
48
49 //-------------------------------------------------------------------------
50
51 'toString': function () {
52 return "Clipperz.PM.UI.Common.Components.Button component";
53 },
54
55 //-------------------------------------------------------------------------
56
57 'text': function () {
58 return this._text;
59 },
60
61 'isDefault': function () {
62 return this._isDefault;
63 },
64
65 //-------------------------------------------------------------------------
66
67 'renderSelf': function () {
68 this.append(this.element(), {tag:'div', id:this.getId('wrapper'), cls:'button_wrapper', children:[
69 {tag:'div', id:this.getId('bodyWrapper'), cls:'button_bodyWrapper', children:[
70 {tag:'div', id:this.getId('body'), cls:'button_body', children:[
71 {tag:'span', html:this.text()}
72 ]},
73 {tag:'div', id:this.getId('footer'), cls:'button_footer'}
74 ]}
75 ]});
76
77 if (this.isDefault()) {
78 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'default');
79 }
80
81 MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseenter',this, 'handleOnMouseEnter');
82 MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseleave',this, 'handleOnMouseLeave');
83 MochiKit.Signal.connect(this.getId('wrapper'), 'onmousedown',this, 'handleOnMouseDown');
84 MochiKit.Signal.connect(this.getId('wrapper'), 'onclick', this, 'handleOnClick');
85 },
86
87 //-------------------------------------------------------------------------
88
89 'handleOnMouseEnter': function (anEvent) {
90 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'hover');
91 },
92
93 'handleOnMouseLeave': function (anEvent) {
94 MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'hover');
95 MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'clicked');
96 },
97
98 'handleOnMouseDown': function (anEvent) {
99 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'clicked');
100 },
101
102 'handleOnClick': function (anEvent) {
103 MochiKit.Signal.signal(this, 'onclick', anEvent);
104 },
105
106 //-------------------------------------------------------------------------
107 __syntaxFix__: "syntax fix"
108});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js
new file mode 100644
index 0000000..0c6e221
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js
@@ -0,0 +1,64 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31//#############################################################################
32
33
34Clipperz.PM.UI.Common.Components.ComponentSlot = function(aComponent, aSlotName) {
35 this._component = aComponent;
36 this._slotName = aSlotName;
37
38 return this;
39}
40
41//=============================================================================
42
43Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ComponentSlot, Object, {
44
45 //-------------------------------------------------------------------------
46
47 'slotName': function() {
48 return this._slotName;
49 },
50
51 'component': function() {
52 return this._component;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'setContent': function(aComponent) {
58 this.component().setComponentForSlotNamed(aComponent, this.slotName());
59 },
60
61 //-------------------------------------------------------------------------
62 __syntaxFix__: "syntax fix"
63
64});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js
new file mode 100644
index 0000000..4735f5c
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js
@@ -0,0 +1,91 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Common.Components.FaviconComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Common.Components.FaviconComponent.superclass.constructor.apply(this, arguments);
35
36 this.render();
37 this.setSrc(args.src);
38
39 return this;
40}
41
42//=============================================================================
43
44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.FaviconComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
45
46 //-------------------------------------------------------------------------
47
48 'toString': function () {
49 return "Clipperz.PM.UI.Common.Components.FaviconComponent component";
50 },
51
52 //-------------------------------------------------------------------------
53
54 'src': function () {
55 return this.element().src;
56 },
57
58 'setSrc': function (aValue) {
59 this.element().src = (aValue || Clipperz.PM.Strings.getValue('defaultFaviconUrl'));
60 },
61
62 //-------------------------------------------------------------------------
63
64 'clear': function () {},
65
66 //-------------------------------------------------------------------------
67
68 'renderSelf': function () {
69 MochiKit.Signal.connect(this.element(), 'onerror',this, 'setDefaultFavicon');
70 MochiKit.Signal.connect(this.element(), 'onabort',this, 'setDefaultFavicon');
71 MochiKit.Signal.connect(this.element(), 'onload',this, 'handleOnLoad');
72 },
73
74 //-------------------------------------------------------------------------
75
76 'setDefaultFavicon': function (anEvent) {
77 MochiKit.Signal.disconnectAll(anEvent.src());
78 this.setSrc(null);
79 },
80
81 'handleOnLoad': function (anEvent) {
82 MochiKit.Signal.disconnectAll(anEvent.src());
83//console.log("HANDLE ON LOAD", anEvent, anEvent.src().src);
84 if (anEvent.src().complete == false) {
85 this.setSrc(null);
86 }
87 },
88
89 //-------------------------------------------------------------------------
90 __syntaxFix__: "syntax fix"
91});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js
new file mode 100644
index 0000000..275bbed
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js
@@ -0,0 +1,164 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.constructor.apply(this, arguments);
35
36 // this._openFromElement = args.openFromElement || null;
37 this._onOkCloseToElement = args.onOkCloseToElement || null;
38 this._onCancelCloseToElement = args.onCancelCloseToElement|| null;
39
40 this._canCancelWhileProcessing= ((typeof(args.canCancelWhileProcessing) == 'undefined') ? true : args.canCancelWhileProcessing);
41
42 return this;
43}
44
45//=============================================================================
46
47Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
48
49 //-------------------------------------------------------------------------
50
51 'toString': function () {
52 return "Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar component";
53 },
54
55 //-------------------------------------------------------------------------
56/*
57 'openFromElement': function () {
58 return this._openFromElement;
59 },
60*/
61 //-------------------------------------------------------------------------
62
63 'onOkCloseToElement': function () {
64 return this._onOkCloseToElement;
65 },
66
67 'setOnOkCloseToElement': function (anElement) {
68 this._onOkCloseToElement = anElement;
69 },
70
71 //-------------------------------------------------------------------------
72
73 'onCancelCloseToElement': function () {
74 return this._onCancelCloseToElement;
75 },
76
77 'setOnCancelCloseToElement': function (anElement) {
78 this._onCancelCloseToElement = anElement;
79 },
80
81 //-------------------------------------------------------------------------
82
83 'canCancelWhileProcessing': function () {
84 return this._canCancelWhileProcessing;
85 },
86
87 //-------------------------------------------------------------------------
88
89 'deferredShowModal': function (someArgs, aResult) {
90 if (someArgs['onOkCloseToElement'] != null) {
91 this.setOnOkCloseToElement(someArgs['onOkCloseToElement']);
92 }
93
94 if (someArgs['onCancelCloseToElement'] != null) {
95 this.setOnCancelCloseToElement(someArgs['onCancelCloseToElement']);
96 }
97
98 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.deferredShowModal.apply(this, arguments);
99 return this.deferred();
100 },
101
102 //-------------------------------------------------------------------------
103
104 'showProgressBar': function () {
105 varprogressBarElement;
106
107 this.getElement('container').innerHTML = '';
108
109 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
110 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
111
112 if (this.canCancelWhileProcessing() == true) {
113 this.setButtons([{text:"Cancel", result:'CANCEL'}]);
114 } else {
115 this.setButtons([]);
116 }
117 },
118
119 //-------------------------------------------------------------------------
120
121 'showFailure': function (someParameters) {
122 // this.setType('ALERT');
123 this.setType(someParameters['type']);
124 // this.setTitle("Login failed");
125 this.setTitle(someParameters['title']);
126 // this.setText("Wrong passphrase; the unlock has failed.");
127 this.setText(someParameters['text']);
128 // this.getElement('container').innerHTML = '';
129 this.getElement('container').innerHTML = '';
130 // this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
131 this.setButtons(someParameters['buttons']);
132 },
133
134 //-------------------------------------------------------------------------
135
136 'closeOk': function () {
137//console.log("=== closeOk");
138 this.showProgressBar();
139 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback'));
140 this._deferred = null;
141 },
142
143 'closeCancel': function () {
144//console.log("=== closeCancel");
145 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
146 this.deferred().cancel();
147 this._deferred = null;
148 },
149
150 //-------------------------------------------------------------------------
151
152 'deferredDone': function () {
153//console.log("=== deferredDone");
154 return this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
155 },
156
157 'deferredError': function (someParameters) {
158//console.log("=== deferredError");
159 this.showFailure(someParameters);
160 },
161
162 //-------------------------------------------------------------------------
163 __syntaxFix__: "syntax fix"
164});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js
new file mode 100644
index 0000000..c1b4f13
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js
@@ -0,0 +1,140 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay = function(anElement, args) {
32 args = args || {};
33
34//MochiKit.Logging.logDebug(">>> new TextFormField");
35 Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay.superclass.constructor.call(this, anElement, args);
36
37 this._wrapperElement = null;
38 this._entropyElement = null;
39
40 this.render();
41//MochiKit.Logging.logDebug("<<< new TextFormField");
42
43 return this;
44};
45
46Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay, Clipperz.PM.UI.Common.Components.BaseComponent, {
47
48 'toString': function() {
49 return "Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay";
50 },
51
52 //-----------------------------------------------------
53
54 'wrapperElement': function() {
55 return this._wrapperElement;
56 },
57
58 'setWrapperElement': function(aValue) {
59 this._wrapperElement = aValue;
60 },
61
62 //-----------------------------------------------------
63
64 'passwordElement': function() {
65 return this.element();
66 },
67
68 //-----------------------------------------------------
69
70 'entropyElement': function() {
71 return this._entropyElement;
72 },
73
74 'setEntropyElement': function(aValue) {
75 this._entropyElement = aValue;
76 },
77
78 //-----------------------------------------------------
79
80 'render': function() {
81/*
82 MochiKit.Signal.disconnectAllTo(this);
83
84 this.setWrapperElement(this.element().wrap({tag:'div'}));
85 this.setEntropyElement(Clipperz.DOM.Helper.append(this.wrapperElement().dom, {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true));
86 // this.setEntropyElement(Clipperz.DOM.Helper.insertBefore(this.element(), {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true));
87 this.entropyElement().wrap({tag:'div', cls:'passwordEntropyWrapper'});
88
89 this.updateEntropyElement();
90
91 this.connect('onkeyup', 'updateEntropyElement');
92 this.connect('onchange', 'updateEntropyElement');
93 this.connect('onblur', 'updateEntropyElement');
94*/
95 MochiKit.Signal.disconnectAllTo(this);
96
97 this.setEntropyElement(this.element());
98 this.entropyElement().addClass("entropyLevelIndicator");
99
100 this.updateEntropyElement();
101
102 this.connect('onkeyup', 'updateEntropyElement');
103 this.connect('onchange', 'updateEntropyElement');
104 this.connect('onblur', 'updateEntropyElement');
105 },
106
107 //-----------------------------------------------------
108
109 'computeEntropyForString': function(aValue) {
110 return Clipperz.PM.Crypto.passwordEntropy(aValue);
111 },
112
113 //-----------------------------------------------------
114
115 'updateEntropyElement': function(anEvent) {
116/*
117//MochiKit.Logging.logDebug(">>> PasswordEntropyDisplay.updateEntropyElement");
118 varmaxExtent;
119 varentropy;
120
121 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
122//MochiKit.Logging.logDebug("--- PasswordEntropyDisplay.updateEntropyElement - entropy: " + entropy);
123 this.entropyElement().setStyle('background-position', "0px " + -entropy + "px");
124 this.entropyElement().setWidth(this.passwordElement().getWidth() * (entropy/128));
125//MochiKit.Logging.logDebug("<<< PasswordEntropyDisplay.updateEntropyElement");
126*/
127 varentropy;
128
129 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
130
131 if (entropy == 0) {
132 this.entropyElement().setStyle('background-position', "0px 26px");
133 } else {
134 this.entropyElement().setStyle('background-position', "0px -" + (128-entropy)*26 + "px");
135 }
136 },
137
138 //-----------------------------------------------------
139 __syntaxFix__: '__syntaxFix__'
140});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js
new file mode 100644
index 0000000..7e7f8fe
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js
@@ -0,0 +1,73 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Common.Components.ProgressBar = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Common.Components.ProgressBar.superclass.constructor.apply(this, arguments);
35
36 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
37
38 this.renderSelf();
39
40 MochiKit.Signal.connect(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', this, 'updateProgressHandler')
41
42 return this;
43}
44
45//=============================================================================
46
47Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ProgressBar, Clipperz.PM.UI.Common.Components.BaseComponent, {
48
49 //-------------------------------------------------------------------------
50
51 'toString': function () {
52 return "Clipperz.PM.UI.Common.Components.ProgressBar component";
53 },
54
55 //-------------------------------------------------------------------------
56
57 'renderSelf': function() {
58 this.append(this.element(), {tag:'div', cls:'loadingBar', children:[
59 {tag:'div', cls:'loadingBarProgressBox', children:[
60 {tag:'div', id:this.getId('loadingBarProgress'), cls:'loadingBarProgress'}
61 ]}
62 ]});
63 },
64
65 //-------------------------------------------------------------------------
66
67 'updateProgressHandler': function (anEvent) {
68 MochiKit.Style.setElementDimensions(this.getId('loadingBarProgress'), {w:anEvent}, '%');
69 },
70
71 //-------------------------------------------------------------------------
72 __syntaxFix__: "syntax fix"
73});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
new file mode 100644
index 0000000..b9bb850
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
@@ -0,0 +1,282 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Common.Components.SimpleMessagePanel = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Common.Components.SimpleMessagePanel.superclass.constructor.apply(this, arguments);
35
36 this._title = args.title || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._type = args.type || Clipperz.Base.exception.raise('MandatoryParameter'); //ALERT, INFO, ERROR
39 this._buttons = args.buttons || Clipperz.Base.exception.raise('MandatoryParameter');
40
41 this._buttonComponents = [];
42 this._deferred = null;
43
44 this.renderModalMask();
45
46 return this;
47}
48
49//=============================================================================
50
51Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
52
53 //-------------------------------------------------------------------------
54
55 'toString': function () {
56 return "Clipperz.PM.UI.Common.Components.SimpleMessagePanel component";
57 },
58
59 //-------------------------------------------------------------------------
60
61 'deferred': function() {
62 if (this._deferred == null) {
63 this._deferred = new Clipperz.Async.Deferred("SimpleMessagePanel.deferred", {trace:false});
64 }
65
66 return this._deferred;
67 },
68
69 //-------------------------------------------------------------------------
70
71 'title': function () {
72 return this._title;
73 },
74
75 'setTitle': function (aValue) {
76 this._title = aValue;
77
78 if (this.getElement('title') != null) {
79 this.getElement('title').innerHTML = aValue;
80 }
81 },
82
83 //-------------------------------------------------------------------------
84
85 'text': function () {
86 return this._text;
87 },
88
89 'setText': function (aValue) {
90 this._text = aValue;
91
92 if (this.getElement('text') != null) {
93 this.getElement('text').innerHTML = aValue;
94 }
95 },
96
97 //-------------------------------------------------------------------------
98
99 'type': function () {
100 return this._type;
101 },
102
103 'setType': function (aValue) {
104 if (this.getElement('icon') != null) {
105 MochiKit.DOM.removeElementClass(this.getId('icon'), this._type);
106 MochiKit.DOM.addElementClass(this.getId('icon'), aValue);
107 }
108
109 this._type = aValue;
110 },
111
112 //-------------------------------------------------------------------------
113
114 'buttons': function () {
115 return this._buttons;
116 },
117
118 'setButtons': function (someValues) {
119 MochiKit.Iter.forEach(this.buttonComponents(), MochiKit.Base.methodcaller('clear'));
120
121 this._buttons = someValues;
122
123 if (this.getElement('buttonArea') != null) {
124 this.renderButtons();
125 }
126 },
127
128 //.........................................................................
129
130 'buttonComponents': function () {
131 return this._buttonComponents;
132 },
133
134 //-------------------------------------------------------------------------
135
136 'renderSelf': function() {
137 this.append(this.element(), {tag:'div', cls:'SimpleMessagePanel', id:this.getId('panel'), children: [
138 {tag:'div', cls:'header', children:[]},
139 {tag:'div', cls:'body', children:[
140 {tag:'div', id:this.getId('icon'),cls:'img ' + this.type(), children:[{tag:'div'}]},
141 {tag:'h3', id:this.getId('title'),html:this.title()},
142 {tag:'p', id:this.getId('text'),html:this.text()},
143 {tag:'div', id:this.getId('container')},
144 {tag:'div', id:this.getId('buttonArea'), cls:'buttonArea', children:[]}
145 ]},
146 {tag:'div', cls:'footer', children:[]}
147 ]});
148
149 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'keyDownHandler');
150
151 this.renderButtons();
152 },
153
154 //-------------------------------------------------------------------------
155
156 'renderButtons': function () {
157 this.getElement('buttonArea').innerHTML = '';
158
159 MochiKit.Base.map(MochiKit.Base.bind(function (aButton) {
160 var buttonElement;
161 var buttonComponent;
162
163 // element = this.append(this.getElement('buttonArea'), {tag:'div', cls:'button' + (aButton['isDefault'] === true ? ' default' : ''), children:[
164 // {tag:'a', href:'#'/*, id:this.getId('buttonLink')*/, html:aButton['text']}
165 // ]});
166
167 buttonElement = this.append(this.getElement('buttonArea'), {tag:'div'});
168 buttonComponent = new Clipperz.PM.UI.Common.Components.Button({'element':buttonElement, 'text':aButton['text'], 'isDefault':aButton['isDefault']});
169 this.buttonComponents().push(buttonComponent);
170
171 MochiKit.Signal.connect(buttonComponent, 'onclick', MochiKit.Base.method(this, 'buttonEventHandler', aButton));
172 }, this), MochiKit.Iter.reversed(this.buttons()));
173 },
174
175 //-------------------------------------------------------------------------
176
177 'displayElement': function() {
178 return this.getElement('panel');
179 },
180
181 //-------------------------------------------------------------------------
182
183 'closeOk': function () {
184 this.deferred().callback();
185 this._deferred = null;
186 },
187
188 'closeCancel': function () {
189 this.deferred().cancel();
190 this._deferred = null;
191 },
192
193 'closeError': function () {
194 this.deferred().errback();
195 this._deferred = null;
196 },
197
198 //-------------------------------------------------------------------------
199
200 'buttonEventHandler': function(aButton, anEvent) {
201 anEvent.preventDefault();
202
203 // MochiKit.Signal.signal(this, 'cancelEvent');
204 switch (aButton['result']) {
205 case 'OK':
206//console.log("==> OK");
207 this.closeOk();
208 break;
209 case 'CANCEL':
210//console.log("==> CANCEL");
211 this.closeCancel();
212 break;
213 default:
214//console.log("==> ????");
215 this.closeError();
216 break;
217 }
218//console.log("<==");
219 },
220
221 //-------------------------------------------------------------------------
222
223 'deferredShow': function (someArgs, aResult) {
224 this.deferredShowModal(someArgs);
225
226 this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
227 this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
228 this.deferred().addCallback(MochiKit.Async.succeed, aResult);
229
230 return this.deferred();
231 },
232
233 //-------------------------------------------------------------------------
234
235 'modalDialogMask': function () {
236 return this.getId('modalDialogMask');
237 },
238
239 'modalDialog': function () {
240 return this.getId('modalDialog');
241 },
242
243 'modalDialogFrame': function() {
244 return this.getId('modalDialogFrame');
245 },
246
247 //-------------------------------------------------------------------------
248
249 'renderModalMask': function () {
250 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
251 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper simpleMessagePanelMask', children:[
252 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask simpleMessagePanelMask'},
253 {tag:'div', id:this.getId('modalDialogFrame'), cls:'modalDialogFrame simpleMessagePanelMask'},
254 {tag:'div', id:this.getId('modalDialog'), cls:'modalDialog simpleMessagePanelMask'}
255 ]}
256 );
257
258 MochiKit.Style.hideElement(this.getId('modalDialogMask'));
259 MochiKit.Style.hideElement(this.getId('modalDialogFrame'));
260 },
261
262 //-------------------------------------------------------------------------
263
264 'keyDownHandler': function (anEvent) {
265 if (anEvent.key().string == 'KEY_ENTER') {
266 anEvent.preventDefault();
267//console.log("13 - RETURN ?", this);
268 this.closeOk();
269//console.log('<<< 13')
270 }
271
272 if (anEvent.key().string == 'KEY_ESCAPE') {
273 anEvent.preventDefault();
274//console.log("27 - ESC ?", this);
275 this.closeCancel();
276//console.log("<<< 27");
277 }
278 },
279
280 //-------------------------------------------------------------------------
281 __syntaxFix__: "syntax fix"
282});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js
new file mode 100644
index 0000000..afb3bf9
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js
@@ -0,0 +1,69 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Common.Components.TabPanelComponent = function(args) {
32 args = args || {};
33 Clipperz.PM.UI.Common.Components.TabPanelComponent.superclass.constructor.call(this, args);
34
35 this._tabPanelController = null;
36
37 return this;
38}
39
40//=============================================================================
41
42Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TabPanelComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
43
44 'toString': function () {
45 return "Clipperz.PM.UI.Common.Components.TabPanelComponent component";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'tabPanelControllerConfiguration': function() {
51 return this._tabPanelControllerConfiguration;
52 },
53
54 'tabPanelController': function() {
55 if (this._tabPanelController == null) {
56 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({component:this, configuration:this.tabPanelControllerConfiguration()});
57 }
58
59 return this._tabPanelController;
60 },
61
62 'initiallySelectedTab': function() {
63 return this._initiallySelectedTab;
64 },
65
66 //-------------------------------------------------------------------------
67 __syntaxFix__: "syntax fix"
68
69});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
new file mode 100644
index 0000000..7507b86
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
@@ -0,0 +1,216 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Common.Components.Tooltip = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Common.Components.Tooltip.superclass.constructor.apply(this, arguments);
35
36 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._position = args.position || 'BELOW'; //'BELOW', 'ABOVE', 'LEFT', 'RIGHT'
39
40 this._boxDimensions = null;
41 this._enabled = (typeof(args.enabled) == 'undefined' ? true : args.enabled);
42 this._isVisible = false;
43
44 this.renderSelf();
45
46 return this;
47}
48
49//=============================================================================
50
51Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Tooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
52
53 //-------------------------------------------------------------------------
54
55 'toString': function () {
56 return "Clipperz.PM.UI.Common.Components.Tooltip component";
57 },
58
59 //-------------------------------------------------------------------------
60
61 'text': function () {
62 return this._text;
63 },
64
65 'setText': function (aValue) {
66 this._text = aValue;
67 },
68
69 //-------------------------------------------------------------------------
70
71 'position': function () {
72 return this._position;
73 },
74
75 'setPosition': function (aValue) {
76 this._position = aValue;
77 },
78
79 //-------------------------------------------------------------------------
80
81 'enabled': function () {
82 return this._enabled;
83 },
84
85 'setIsEnabled': function (aValue) {
86 this._enabled = aValue;
87 },
88
89 //-------------------------------------------------------------------------
90
91 'isVisible': function () {
92 return this._isVisible;
93 },
94
95 'setIsVisible': function (aValue) {
96 this._isVisible = aValue;
97 },
98
99 //-------------------------------------------------------------------------
100
101 'renderSelf': function() {
102 // this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
103 // this.append(MochiKit.DOM.currentDocument().body, {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
104 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
105 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
106 {tag:'div', cls:'tooltip_text', children:[
107 {tag:'span', html:this.text()}
108 ]},
109 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
110 ]},
111 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
112 ]});
113
114 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
115 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
116
117 MochiKit.Style.hideElement(this.displayElement());
118 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
119 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
120 },
121
122 //-----------------------------------------------------
123
124 'displayElement': function() {
125 return this.getElement('tooltip');
126 },
127
128 //-------------------------------------------------------------------------
129
130 'boxDimensions': function () {
131 return this._boxDimensions;
132 },
133
134 //-------------------------------------------------------------------------
135
136 'show': function () {
137 var elementSizeAndPosition;
138 var arrowPosition;
139 var bodyPosition;
140
141 if (this.isVisible() == false) {
142 arrowPosition = {};
143 bodyPosition = {};
144
145 this.setIsVisible(true);
146 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
147//console.log("ELEMENT SIZE AND POSITION", Clipperz.Base.serializeJSON(elementSizeAndPosition));
148//console.log("BOX DIMENSIONS", Clipperz.Base.serializeJSON(this.boxDimensions()));
149 switch (this.position()) {
150 case 'ABOVE':
151//console.log("ABOVE");
152 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
153 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
154 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
155
156 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
157 arrowPosition.y = elementSizeAndPosition.position.y - 13;
158 break;
159 case 'BELOW':
160//console.log("BELOW");
161 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
162 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
163 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
164
165 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
166 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
167 break;
168 case 'LEFT':
169//console.log("LEFT");
170 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
171 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13;
172 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
173
174 arrowPosition.x = elementSizeAndPosition.position.x -13;
175 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
176 break;
177 case 'RIGHT':
178//console.log("RIGHT");
179 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
180 bodyPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w + 13;
181 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
182
183 arrowPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w;
184 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
185 break;
186 }
187//console.log("X: " + bodyPosition.x + ", Y: " + bodyPosition.y);
188
189 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
190 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
191 MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
192 }
193 },
194
195 'hide': function () {
196 if (this.isVisible() == true) {
197 MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
198 this.setIsVisible(false);
199 }
200 },
201
202 //-------------------------------------------------------------------------
203/*
204 'shouldRemoveElementWhenClearningUp': function () {
205 return false;
206 },
207*/
208 //-------------------------------------------------------------------------
209 __syntaxFix__: "syntax fix"
210});
211
212Clipperz.PM.UI.Common.Components.Tooltip.initTooltips = function () {
213 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'});
214}
215
216MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.Tooltip.initTooltips);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js
new file mode 100644
index 0000000..c31969e
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js
@@ -0,0 +1,170 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Common.Components.TranslatorWidget = function(args) {
32Clipperz.log(">>> TranslatorWidget.new");
33 args = args || {};
34
35 Clipperz.PM.UI.Common.Components.TranslatorWidget.superclass.constructor.apply(this, arguments);
36
37 // this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
38 // this._stringID = args.stringID || MochiKit.DOM.getNodeAttribute(this.element(), 'stringID')|| Clipperz.Base.exception.raise('MandatoryParameter');
39
40 //MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
41 //MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
42
43Clipperz.log("<<< TranslatorWidget.new");
44 return this;
45}
46
47//=============================================================================
48
49Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TranslatorWidget, Clipperz.PM.UI.Common.Components.BaseComponent, {
50
51 //-------------------------------------------------------------------------
52
53 'toString': function () {
54 return "Clipperz.PM.UI.Common.Components.TranslatorWidget component";
55 },
56
57 //-------------------------------------------------------------------------
58/*
59 'renderSelf': function() {
60 this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
61 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
62 {tag:'div', cls:'tooltip_text', children:[
63 {tag:'span', html:this.text()}
64 ]},
65 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
66 ]},
67 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
68 ]});
69
70 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
71 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
72
73 MochiKit.Style.hideElement(this.displayElement());
74 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
75 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
76 },
77*/
78 //-----------------------------------------------------
79/*
80 'displayElement': function() {
81 return this.getElement('tooltip');
82 },
83*/
84 //-------------------------------------------------------------------------
85/*
86 'boxDimensions': function () {
87 return this._boxDimensions;
88 },
89*/
90 //-------------------------------------------------------------------------
91
92 'show': function (anElement, aStringID) {
93 Clipperz.log(">>> Clipperz.PM.UI.Common.Components.TranslatorWidget.show: " + aStringID);
94/*
95 var elementSizeAndPosition;
96 var arrowPosition;
97 var bodyPosition;
98
99 arrowPosition = {};
100 bodyPosition = {};
101
102 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
103 switch (this.position()) {
104 case 'ABOVE':
105 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
106 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
107 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
108
109 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
110 arrowPosition.y = elementSizeAndPosition.position.y - 13;
111 break;
112 case 'BELOW':
113 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
114 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
115 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
116
117 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
118 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
119 break;
120 case 'LEFT':
121 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
122 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13;
123 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
124
125 arrowPosition.x = elementSizeAndPosition.position.x -13;
126 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
127 break;
128 case 'RIGHT':
129 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
130 break;
131 }
132
133 // MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
134 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
135 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
136 MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
137*/
138 },
139
140 //-------------------------------------------------------------------------
141
142 'hide': function () {
143 Clipperz.log("<<< Clipperz.PM.UI.Common.Components.TranslatorWidget.hide");
144 // MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
145 },
146
147 //-------------------------------------------------------------------------
148 __syntaxFix__: "syntax fix"
149});
150
151//#############################################################################
152
153Clipperz.PM.UI.Common.Components.TranslatorWidget._widget = null;
154
155Clipperz.PM.UI.Common.Components.TranslatorWidget.widget = function () {
156 if (Clipperz.PM.UI.Common.Components.TranslatorWidget._widget == null) {
157 Clipperz.PM.UI.Common.Components.TranslatorWidget._widget = new Clipperz.PM.UI.Common.Components.TranslatorWidget();
158 }
159
160 return Clipperz.PM.UI.Common.Components.TranslatorWidget._widget;
161}
162Clipperz.PM.UI.Common.Components.TranslatorWidget.show = function (anElement, aStringID) {
163 Clipperz.PM.UI.Common.Components.TranslatorWidget.widget().show(anElement, aStringID);
164}
165
166Clipperz.PM.UI.Common.Components.TranslatorWidget.hide = function () {
167 Clipperz.PM.UI.Common.Components.TranslatorWidget.widget().hide();
168}
169
170//#############################################################################
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js
new file mode 100644
index 0000000..e534435
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js
@@ -0,0 +1,267 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
30
31Clipperz.PM.UI.Common.Controllers.DirectLoginRunner = function(args) {
32 this._directLogin = args['directLogin'] || Clipperz.Base.exception.raise('MandatoryParameter');
33 this._target = Clipperz.PM.Crypto.randomKey();
34
35 return this;
36}
37
38MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.prototype, {
39
40 'toString': function() {
41 return "Clipperz.PM.UI.Common.Controllers.DirectLoginRunner";
42 },
43
44 //-----------------------------------------------------------------------------
45
46 'directLogin': function () {
47 return this._directLogin;
48 },
49
50 //-----------------------------------------------------------------------------
51
52 'target': function () {
53 return this._target;
54 },
55
56 //=============================================================================
57
58 'setWindowTitle': function (aWindow, aTitle) {
59 aWindow.document.title = aTitle;
60 },
61
62 'setWindowBody': function (aWindow, anHTML) {
63 aWindow.document.body.innerHTML = anHTML;
64 },
65
66 //=============================================================================
67
68 'initialWindowSetup': function (aWindow) {
69 this.setWindowTitle(aWindow, "Loading Clipperz Direct Login");
70 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3("Loading Clipperz Direct Login ...")));
71 },
72
73 //-----------------------------------------------------------------------------
74
75 'updateWindowWithDirectLoginLabel': function (aWindow, aLabel) {
76 var titleText;
77 var bodyText;
78
79 titleText = "Loading '__label__' Direct Login".replace(/__label__/, aLabel)
80 bodyText = "Loading '__label__' Direct Login... ".replace(/__label__/, aLabel)
81
82 this.setWindowTitle(aWindow, titleText);
83 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3(bodyText)));
84 },
85
86 //-----------------------------------------------------------------------------
87
88 'updateWindowWithHTMLContent': function (aWindow, anHtml) {
89 this.setWindowBody(aWindow, anHtml);
90 },
91
92 //=============================================================================
93
94 'submitLoginForm': function(aWindow, aSubmitFunction) {
95 MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function () {
96 var formElement;
97 var submitButtons;
98
99 formElement = MochiKit.DOM.getElement('directLoginForm');
100
101 submitButtons = MochiKit.Base.filter(function(anInputElement) {
102 return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit'));
103 }, formElement.elements);
104
105 if (submitButtons.length == 0) {
106 if (typeof(formElement.submit) == 'function') {
107 formElement.submit();
108 } else {
109 aSubmitFunction.apply(formElement);
110 }
111/*
112 varformSubmitFunction;
113
114 formSubmitFunction = MochiKit.Base.method(formElement, 'submit');
115 if (Clipperz_IEisBroken == true) {
116 formElement.submit();
117 } else {
118 formSubmitFunction();
119 }
120*/
121 } else {
122 submitButtons[0].click();
123 }
124 }, this));
125 },
126
127 //-------------------------------------------------------------------------
128
129 'runSubmitFormDirectLogin': function (aWindow, someAttributes) {
130 var html;
131 var formElement;
132 var submitFunction;
133
134 formElement = MochiKit.DOM.FORM({
135 'id':'directLoginForm',
136 'method':someAttributes['formAttributes']['method'],
137 'action':someAttributes['formAttributes']['action']
138 });
139
140 submitFunction = formElement.submit;
141
142 MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map(function (anInputAttributes) {
143 return MochiKit.DOM.INPUT({'type':'hidden', 'name':anInputAttributes[0], 'value':anInputAttributes[1]});
144 }, MochiKit.Base.items(someAttributes['inputValues'])));
145
146 html ='';
147 html += '<h3>Loading ' + someAttributes['label'] + ' ...</h3>';
148 html +=MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV(), MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}), formElement)).innerHTML;
149
150 this.updateWindowWithHTMLContent(aWindow, html);
151 this.submitLoginForm(aWindow, submitFunction);
152 },
153
154 //-------------------------------------------------------------------------
155
156 'runHttpAuthDirectLogin': function(aWindow, someAttributes) {
157 var completeUrl;
158 var url;
159
160//console.log("runHttpAuthDirectLogin", someAttributes);
161 url = someAttributes['inputValues']['url'];
162
163 if (/^https?\:\/\//.test(url) == false) {
164 url = 'http://' + url;
165 }
166
167 if (Clipperz_IEisBroken === true) {
168 completeUrl = url;
169 } else {
170 var username;
171 var password;
172
173 username = someAttributes['inputValues']['username'];
174 password = someAttributes['inputValues']['password'];
175 /(^https?\:\/\/)?(.*)/.test(url);
176
177 completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2;
178 }
179
180 window.open(completeUrl, this.target());
181 },
182
183 //=============================================================================
184
185 'runDirectLogin': function (aWindow) {
186 var deferredResult;
187
188//console.log(">>> runDirectLogin");
189 deferredResult = new Clipperz.Async.Deferred("DirectLoginRunner.openDirectLogin", {trace:false});
190 deferredResult.addMethod(this, 'initialWindowSetup', aWindow);
191 deferredResult.addMethod(this.directLogin(), 'label');
192 deferredResult.addMethod(this, 'updateWindowWithDirectLoginLabel', aWindow);
193 deferredResult.collectResults({
194 'type': MochiKit.Base.method(this.directLogin(), 'type'),
195 'label': MochiKit.Base.method(this.directLogin(), 'label'),
196 'formAttributes':MochiKit.Base.method(this.directLogin(), 'formAttributes'),
197 'inputValues': MochiKit.Base.method(this.directLogin(), 'inputValues')
198 });
199//deferredResult.addCallback(function (aValue) { console.log("SOME ATTRIBUTES", aValue); return aValue; });
200 deferredResult.addCallback(MochiKit.Base.bind(function (someAttributes) {
201//console.log("SOME ATTRIBUTES", someAttributes);
202 switch (someAttributes['type']) {
203 case 'http_auth':
204 this.runHttpAuthDirectLogin(aWindow, someAttributes);
205 break;
206 case 'simple_url':
207 this.runSimpleUrlDirectLogin(aWindow, someAttributes);
208 break;
209 default:
210 this.runSubmitFormDirectLogin(aWindow, someAttributes);
211 break;
212 }
213 }, this));
214 deferredResult.callback();
215//console.log("<<< runDirectLogin");
216
217 return deferredResult;
218 },
219
220 //=============================================================================
221
222 'run': function () {
223 var newWindow;
224
225 newWindow = window.open(Clipperz.PM.Strings.getValue('directLoginJumpPageUrl'), this.target());
226
227 return this.runDirectLogin(newWindow);
228 },
229
230 //=============================================================================
231
232 'test': function () {
233 var iFrame;
234 var newWindow;
235
236 iFrame = MochiKit.DOM.createDOM('iframe');
237 MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, iFrame);
238
239 newWindow = iFrame.contentWindow;
240
241 return this.runDirectLogin(newWindow);
242 },
243
244 //=============================================================================
245 __syntaxFix__: "syntax fix"
246});
247
248//-----------------------------------------------------------------------------
249
250Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin = function (aDirectLogin) {
251 varrunner;
252
253 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin});
254 return runner.run();
255};
256
257//-----------------------------------------------------------------------------
258
259Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin = function (aDirectLogin) {
260 varrunner;
261
262//console.log(">>>>>> TESTING DIRECT LOGIN");
263 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin});
264 return runner.test();
265};
266
267//-----------------------------------------------------------------------------
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js
new file mode 100644
index 0000000..a4fa400
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js
@@ -0,0 +1,143 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
30
31Clipperz.PM.UI.Common.Controllers.ProgressBarController = function(args) {
32 args = args || {};
33
34 this._numberOfSteps= 0;
35 this._currentStep= 0;
36
37 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle');
38 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress',this, 'updateProgressHandle');
39 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress',this, 'advanceProgressHandle');
40 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle');
41
42 return this;
43}
44
45MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.ProgressBarController.prototype, {
46
47 'toString': function() {
48 return "Clipperz.PM.UI.Common.Controllers.ProgressBarController";
49 },
50
51 //-----------------------------------------------------------------------------
52
53 'numberOfSteps': function() {
54 return this._numberOfSteps;
55 },
56
57 'setNumberOfSteps': function (aValue) {
58 this._numberOfSteps = aValue;
59 },
60
61 'updateNumberOfSteps': function (aValue) {
62 this._numberOfSteps += aValue;
63 },
64
65 //-----------------------------------------------------------------------------
66
67 'currentStep': function() {
68 return this._currentStep;
69 },
70
71 'advanceCurrentStep': function () {
72 this._currentStep ++;
73 },
74
75 //-----------------------------------------------------------------------------
76
77 'completedPercentage': function () {
78 var result;
79//Clipperz.log(">>> completedPercentage" + this.currentStep() + "/" + this.numberOfSteps(), this.currentStep() / this.numberOfSteps());
80 if (this.numberOfSteps() == 0) {
81 result = 0;
82 } else {
83 result = (Math.min(100, 100 * (this.currentStep() / this.numberOfSteps())));
84 }
85//Clipperz.log("<<< completedPercentage", result);
86 return result;
87 },
88
89 //-----------------------------------------------------------------------------
90
91 'resetStatus': function () {
92 this._numberOfSteps= 0;
93 this._currentStep= 0;
94 },
95
96 //-----------------------------------------------------------------------------
97
98 'updateProgress': function () {
99//Clipperz.log(">>> updateProgress: " + this.completedPercentage() + "%");
100 MochiKit.Signal.signal(this, 'updateProgress', this.completedPercentage());
101 },
102
103 //=============================================================================
104
105 'initProgressHandle': function (anEvent) {
106//Clipperz.log(">>> initProgressHandle - steps: " + (anEvent != null ? anEvent['steps'] : 0));
107 this.resetStatus();
108 if (anEvent != null) {
109 this.setNumberOfSteps(anEvent['steps']);
110 }
111 MochiKit.Signal.signal(this, 'initProgress');
112 this.updateProgress();
113 },
114
115 //.............................................................................
116
117 'updateProgressHandle': function (anEvent) {
118 this.updateNumberOfSteps(anEvent['extraSteps']);
119//Clipperz.log("=== updateProgressHandle - steps: " + this.numberOfSteps() + " (extra " + anEvent['extraSteps'] + ")");
120 this.updateProgress();
121 },
122
123 //.............................................................................
124
125 'advanceProgressHandle': function (anEvent) {
126 this.advanceCurrentStep();
127//Clipperz.log("--- advanceProgressHandle: " + this.currentStep() + "/" + this.numberOfSteps());
128 this.updateProgress();
129 },
130
131 //.............................................................................
132
133 'progressDoneHandle': function (anEvent) {
134//Clipperz.log("<<< progressDoneHandle: " + this.currentStep() + "/" + this.numberOfSteps());
135 this.resetStatus();
136 MochiKit.Signal.signal(this, 'progressDone');
137 },
138
139 //=============================================================================
140 __syntaxFix__: "syntax fix"
141});
142
143Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController = new Clipperz.PM.UI.Common.Controllers.ProgressBarController();
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js
new file mode 100644
index 0000000..fbc5929
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js
@@ -0,0 +1,188 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
30
31Clipperz.PM.UI.Common.Controllers.TabPanelController = function(args) {
32 args = args || {};
33
34 this._component = args.component;
35 this._configuration = args.configuration;
36 this._isEnabled = args.enabled || true;
37
38 this._selectedTab = null;
39 return this;
40}
41
42MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.TabPanelController.prototype, {
43
44 'toString': function() {
45 return "Clipperz.PM.UI.Common.Controllers.TabPanelController";
46 },
47
48 //-----------------------------------------------------------------------------
49
50 'component': function() {
51 return this._component;
52 },
53
54 'configuration': function() {
55 return this._configuration;
56 },
57
58 //-----------------------------------------------------------------------------
59
60 'getElement': function(anElementID) {
61 return this.component().getElement(anElementID);
62 },
63
64 'tabForTabElement': function(anElement) {
65 varresult;
66
67 for (result in this.configuration()) {
68 if (this.getElement(this.configuration()[result]['tab']) == anElement) {
69 break;
70 }
71 }
72
73 return result;
74 },
75
76 //-----------------------------------------------------------------------------
77
78 'setupTab': function(aConfiguration) {
79 vartabElement;
80
81 tabElement = this.getElement(aConfiguration['tab']);
82
83 MochiKit.DOM.removeElementClass(tabElement, 'selected');
84 MochiKit.Signal.connect(tabElement, 'onclick', this, 'handleTabClick')
85 },
86
87 'setupPanel': function(aConfiguration) {
88 this.hidePanel(aConfiguration['panel']);
89 },
90
91 'setup': function(args) {
92 args = args || {};
93
94 MochiKit.Base.map(MochiKit.Base.method(this, 'setupTab'),MochiKit.Base.values(this.configuration()));
95 MochiKit.Base.map(MochiKit.Base.method(this, 'setupPanel'),MochiKit.Base.values(this.configuration()));
96 this.selectTab(args.selected);
97 },
98
99 //-----------------------------------------------------------------------------
100
101 'hidePanel': function(aPanel) {
102 MochiKit.DOM.removeElementClass(this.getElement(aPanel), 'selected');
103 },
104
105 'selectTab': function(aTab) {
106 if ((aTab != this.selectedTab()) && (this.isEnabled())) {
107 if (this.selectedTab() != null) {
108 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['tab']),'selected');
109 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['panel']),'selected');
110 }
111
112 if (aTab != null) {
113 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['tab']),'selected');
114 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['panel']),'selected');
115 }
116
117 this.setSelectedTab(aTab);
118 MochiKit.Signal.signal(this, 'tabSelected', aTab);
119 }
120 },
121
122 //-----------------------------------------------------------------------------
123
124 'selectedTab': function() {
125 return this._selectedTab;
126 },
127
128 'setSelectedTab': function(aTab) {
129 this._selectedTab = aTab;
130 },
131
132 //-----------------------------------------------------------------------------
133
134 'selectedTabElement': function() {
135 var result;
136
137 if (this.selectedTab() != null) {
138 result = this.getElement(this.configuration()[this.selectedTab()]['tab']);
139 } else {
140 result = null;
141 }
142
143 return null;
144 },
145
146 'selectedTabPanelElement': function() {
147 var result;
148
149 if (this.selectedTab() != null) {
150 result = this.getElement(this.configuration()[this.selectedTab()]['panel']);
151 } else {
152 result = null;
153 }
154
155 return result;
156 },
157
158 //-----------------------------------------------------------------------------
159
160 'handleTabClick': function(anEvent) {
161 this.selectTab(this.tabForTabElement(anEvent.src()));
162 anEvent.preventDefault();
163 },
164
165 //=============================================================================
166
167 'isEnabled': function () {
168 return this._isEnabled;
169 },
170
171 'enable': function () {
172 this._isEnabled = true;
173 MochiKit.Base.map(MochiKit.Base.bind(function (aTabComponentID) {
174 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[aTabComponentID]['tab']), 'disabled');
175 }, this), MochiKit.Base.keys(this.configuration()));
176 },
177
178 'disable': function () {
179 this._isEnabled = false;
180 MochiKit.Base.map(MochiKit.Base.bind(function (aTabComponentID) {
181 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTabComponentID]['tab']), 'disabled');
182 }, this), MochiKit.Base.keys(this.configuration()));
183 },
184
185 //=============================================================================
186
187 __syntaxFix__: "syntax fix"
188});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js
new file mode 100644
index 0000000..868cea6
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js
@@ -0,0 +1,31 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29 //Still empty, but here it should be reasonable to factor in code duplicated between
30 //- DirectLoginWizardController
31 //- NewUserWizardController \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
new file mode 100644
index 0000000..22258f6
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
@@ -0,0 +1,59 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Compact');
30
31Clipperz.PM.UI.Compact.MainController = function() {
32 //this._loginPanel = null;
33 //this._user = null;
34//
35 //this._isRunningCompact = false;
36 //
37 //Clipperz.NotificationCenter.register(null, 'userConnected', this, 'userConnectedCallback');
38 //Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler');
39//
40 //Clipperz.NotificationCenter.register(null, 'EXCEPTION', this, 'reportException');
41
42 return this;
43}
44
45MochiKit.Base.update(Clipperz.PM.UI.Compact.MainController.prototype, {
46
47 'toString': function() {
48 return "Clipperz.PM.UI.Compact.MainController";
49 },
50
51 //-----------------------------------------------------------------------------
52
53 'run': function(shouldShowRegistrationForm) {
54MochiKit.Logging.logDebug("running " + this.toString());
55 },
56
57 //-----------------------------------------------------------------------------
58 __syntaxFix__: "syntax fix"
59}); \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
new file mode 100644
index 0000000..4378b19
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
@@ -0,0 +1,148 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.AccountPanel = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments);
35
36 //this._initiallySelectedTab = args.selected || 'ACCOUNT';
37 this._initiallySelectedTab = args.selected || 'PASSPHRASE';
38 this._tabPanelControllerConfiguration = {
39 // 'ACCOUNT': {
40 // tab:'accountTab',
41 // panel:'accountPanel'
42 // },
43 'PASSPHRASE': {
44 tab:'passphraseTab',
45 panel:'passphrasePanel'
46 },
47 'PREFERENCES': {
48 tab:'preferencesTab',
49 panel:'preferencesPanel'
50 },
51 'LOGIN_HISTORY': {
52 tab:'loginHistoryTab',
53 panel:'loginHistoryPanel'
54 }
55 };
56
57 return this;
58}
59
60//=============================================================================
61
62Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
63
64 //-------------------------------------------------------------------------
65
66 'toString': function () {
67 return "Clipperz.PM.UI.Web.Components.AccountPanel component";
68 },
69
70 //-------------------------------------------------------------------------
71
72 'renderSelf': function(/*aContainer, aPosition*/) {
73//Clipperz.log("AccountPanel.renderSelf element", this.element());
74 this.append(this.element(), [
75 {tag:'div', cls:'header', children:[
76 {tag:'div', cls:'subPanelTabs', children:[
77 {tag:'ul', children:[
78 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'},
79 {tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'},
80 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]},
81 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]}
82 ]}
83 ]}
84 ]},
85 {tag:'div', cls:'body', children:[
86 {tag:'div', cls:'accountPanel', children:[
87 {tag:'div', cls:'subPanelContent', children:[
88 {tag:'ul', children:[
89 // {tag:'li', id:this.getId('accountPanel'),children:[
90 // {tag:'h3', html:"-- Account --"}
91 // ]},
92 {tag:'li', id:this.getId('passphrasePanel'),children:[
93 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"},
94 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[
95 {tag:'div', cls:'currentCredentials', children:[
96 {tag:'div', cls:'field username', children:[
97 {tag:'label', html:"username", 'for':this.getId('currentUsername')},
98 {tag:'input', id:this.getId('currentUsername')}
99 ]},
100 {tag:'div', cls:'field passphrase', children:[
101 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')},
102 {tag:'input', id:this.getId('currentPassphrase')}
103 ]}
104 ]},
105 {tag:'div', cls:'newPassphrase', children:[
106 {tag:'div', cls:'field', children:[
107 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')},
108 {tag:'input', id:this.getId('newPassphrase')}
109 ]},
110 {tag:'div', cls:'field', children:[
111 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')},
112 {tag:'input', id:this.getId('reNewPassphrase')}
113 ]}
114 ]},
115 {tag:'div', cls:'confirm', children:[
116 {tag:'input', type:'checkbox', id:this.getId('confirm')},
117 {tag:'label', html:"I understand that Clipperz will not be able to recover a lost passphrase", 'for':this.getId('confirm')}
118 ]}
119 ]},
120 {tag:'div', cls:'clear'},
121 {tag:'div', cls:'confirmButton', id:this.getId('confirmationButton'), children:[
122 {tag:'span', html:"change passphrase"}
123 ]},
124
125 {tag:'h3', cls:'manageOTP', html:"Manage One-Time Passphrases"},
126 {}
127 ]},
128 {tag:'li', id:this.getId('preferencesPanel'), children:[
129 {tag:'h3', html:"-- Preferences --"}
130 ]},
131 {tag:'li', id:this.getId('loginHistoryPanel'), children:[
132 {tag:'h3', html:"-- Login History --"}
133 ]}
134 ]}
135 ]}
136 ]}
137 ]},
138 {tag:'div', cls:'footer'}
139 ]);
140
141 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
142 },
143
144 //-------------------------------------------------------------------------
145
146
147 __syntaxFix__: "syntax fix"
148});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
new file mode 100644
index 0000000..67247df
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
@@ -0,0 +1,78 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.AppPage = function(args) {
32 args = args || {};
33 Clipperz.PM.UI.Web.Components.AppPage.superclass.constructor.call(this, args);
34
35 this._element = args.element || null;
36
37 this._slots = {
38 'cardGrid' : this.getId('cardGrid'),
39 // 'directLoginGrid' : this.getId('directLoginGrid'),
40 'accountPanel': this.getId('accountPanel'),
41 'dataPanel': this.getId('dataPanel'),
42 'toolsPanel': this.getId('toolsPanel'),
43 'userInfoBox': this.getId('userInfoBox'),
44 'tabSidePanel': this.getId('tabSidePanel')
45 };
46
47 return this;
48}
49
50//=============================================================================
51
52Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AppPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
53
54 //-------------------------------------------------------------------------
55
56 'toString': function () {
57 return "Clipperz.PM.UI.Web.Components.AppPage component";
58 },
59
60 //-------------------------------------------------------------------------
61
62 'renderSelf': function(/*aContainer, aPosition*/) {
63 this.append(this.element(), {tag:'div', id:this.getId('userInfoBox'), cls:'userInfoBox'});
64 this.append(this.element(), {tag:'div', id:this.getId('sidePanels'), cls:'sidePanels'});
65 this.append(this.getId('sidePanels'),{tag:'div', id:this.getId('tabSidePanel'), cls:'tabSidePanel', children:[]});
66
67 this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'});
68 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'});
69 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('directLoginGrid'), cls:'gridComponent directLoginGrid'});
70 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('accountPanel'), cls:'otherPanel'});
71 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('dataPanel'), cls:'otherPanel'});
72 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('toolsPanel'), cls:'otherPanel'});
73 },
74
75 //-------------------------------------------------------------------------
76
77 __syntaxFix__: "syntax fix"
78});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
new file mode 100644
index 0000000..42a6052
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
@@ -0,0 +1,109 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.BookmarkletComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.BookmarkletComponent.superclass.constructor.apply(this, arguments);
35 MochiKit.Signal.connect(Clipperz.PM.Strings.Languages, 'switchLanguage', this, 'updateBookmarkletURLs');
36
37 return this;
38}
39
40//=============================================================================
41
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.BookmarkletComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
43
44 //-------------------------------------------------------------------------
45
46 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.BookmarkletComponent component";
48 },
49
50 //-------------------------------------------------------------------------
51
52 'renderSelf': function() {
53 // var bookmarkletUrl;
54//
55 // if (Clipperz_IEisBroken == true) {
56 // bookmarkletUrl = bookmarklet_ie;
57 // } else {
58 /// bookmarkletUrl = bookmarklet;
59 // bookmarkletUrl = Clipperz.PM.Strings['bookmarklet'];
60 // }
61
62 this.append(this.element(), {tag:'div', cls:'bookmarklet', children: [
63 {tag:'div', id:this.getId('linkBlock'), cls:'bookmarklet_link', children:[
64 // {tag:'a', id:this.getId('link'), href:bookmarkletUrl, children:[
65 {tag:'a', id:this.getId('link'), href:'#', children:[
66 {tag:'div', cls:'icon'},
67 {tag:'div', cls:'text', children:[
68 {tag:'span', html:"add to Clipperz"}
69 ]}
70 ]}
71 ]}
72 ]});
73
74 new Clipperz.PM.UI.Common.Components.Tooltip({
75 element:this.getElement('linkBlock'),
76 text: "Drag and drop the \"add to Clipperz\" link above to the bookmark bar.",
77 position:'BELOW'
78 });
79
80 MochiKit.Signal.connect(this.getId('link'), 'onclick', this, 'handleOnclick');
81 this.updateBookmarkletURLs();
82 },
83
84 //-------------------------------------------------------------------------
85
86 'handleOnclick': function (anEvent) {
87 anEvent.preventDefault();
88
89Clipperz.log("BOOKMARKLET CLICK");
90 },
91
92 //-------------------------------------------------------------------------
93
94 'updateBookmarkletURLs': function () {
95 var bookmarkletUrl;
96
97 if (Clipperz_IEisBroken == true) {
98 bookmarkletUrl = bookmarklet_ie;
99 } else {
100 // bookmarkletUrl = bookmarklet;
101 bookmarkletUrl = Clipperz.PM.Strings.getValue('bookmarklet');
102 }
103
104 this.getElement('link').href = bookmarkletUrl;
105 },
106
107 //-------------------------------------------------------------------------
108 __syntaxFix__: "syntax fix"
109});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
new file mode 100644
index 0000000..e3238ca
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
@@ -0,0 +1,881 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.CardDialogComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.CardDialogComponent.superclass.constructor.apply(this, arguments);
35
36 this._tabPanelController = null;
37
38 this._tabPanelControllerConfiguration = {
39 'DETAILS': {
40 tab:'detailTab',
41 panel:'detailTabpanel'
42 },
43 'DIRECT_LOGINS': {
44 tab:'directLoginTab',
45 panel:'directLoginTabpanel'
46 },
47 'SHARING': {
48 tab:'sharingTab',
49 panel:'sharingTabpanel'
50 }
51 };
52
53 this._tooltips = null;
54
55 this._isSavingEnabled = false;
56 this._hintMode = 'OFF'; //'ON'
57
58 this._fieldComponents = {};
59 this._directLoginComponents = {};
60
61 this._displayMode = 'fixed'; //'scrollable';
62
63 return this;
64}
65
66//=============================================================================
67
68Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
69
70 //-------------------------------------------------------------------------
71
72 'toString': function () {
73 return "Clipperz.PM.UI.Web.Components.CardDialogComponent component";
74 },
75
76 //-------------------------------------------------------------------------
77
78 'tabPanelController': function () {
79 if (this._tabPanelController == null) {
80 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
81 component:this,
82 configuration:this._tabPanelControllerConfiguration
83 });
84
85 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
86 }
87
88 return this._tabPanelController;
89 },
90
91 //-------------------------------------------------------------------------
92
93 'renderSelf': function() {
94 this.append(this.element(), {tag:'div', cls:'CardDialog mainDialog loading', id:this.getId('panel'), children: [
95 {tag:'form', id:this.getId('form'), children:[
96 // {tag:'input', type:'text', id:this.getId('hidden'), cls:'hidden'},
97 {tag:'div', cls:'header', children:[
98 {tag:'div', cls:'title', children:[
99 {tag:'input', type:'text', id:this.getId('title')}
100 ]}
101 ]},
102 {tag:'div', id:this.getId('body'), cls:'body', children:[
103 {tag:'div', cls:'tabs', children:[
104 {tag:'ul', cls:'tabs', children:[
105 {tag:'li', id:this.getId('detailTab'), children:[{tag:'span', html:"details"}]},
106 {tag:'li', id:this.getId('directLoginTab'), children:[
107 {tag:'span', html:"direct logins"}//,
108 // {tag:'div', id:this.getId('addDirectLoginButton'), cls:'addDirectLoginButton', children:[
109 // {tag:'span', html:"+"}
110 // ]}
111 ]},
112 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'span', html:"sharing"}]}
113 ]}
114 ]},
115 {tag:'div', cls:'tabPanels', children:[
116 {tag:'ul', cls:'tabPanels', children:[
117 {tag:'li', id:this.getId('detailTabpanel'), cls:'tabPanel', children:[
118 {tag:'div', id:this.getId('recordFields'), children:[
119 {tag:'table', cls:'fields', cellpadding:'0', id:this.getId('fieldTable'), cellspacing:'0', children:[
120 {tag:'thead', children:[
121 {tag:'tr', children:[
122 {tag:'th', cls:'fieldStateTH',html:""},
123 {tag:'th', cls:'fieldLabelTH',html:"label"},
124 {tag:'th', cls:'fieldLockTH',html:""},
125 {tag:'th', cls:'fieldValueTH',html:"value"},
126 {tag:'th', cls:'fieldActionTH',html:""},
127 {tag:'th', cls:'fieldDeleteTH',html:""}
128 ]}
129 ]},
130 {tag:'tfoot'},
131 {tag:'tbody', id:this.getId('tableBody'), children:[
132 {tag:'tr', id:this.getId('newFieldTR'), cls:'newFieldTR', children:[
133 {tag:'td', cls:'fieldState'},
134 {tag:'td', cls:'fieldLabel', children:[
135 {tag:'input', cls:'label', id:this.getId('newFieldLabel')}
136 ]},
137 {tag:'td', cls:'fieldLock', children:[
138 {tag:'div', cls:'unlocked', id:this.getId('newFieldIsLocked')}
139 ]},
140 {tag:'td', cls:'fieldValue', children:[
141 {tag:'div', cls:'unlocked', id:this.getId('newFieldValueWrapper'), children:[
142 {tag:'input',type:'text', cls:'value', id:this.getId('newFieldValue')}
143 ]}
144 ]},
145 {tag:'td', cls:'fieldAction', children:[
146 {tag:'div', html:'&nbsp;'}
147 ]},
148 {tag:'td', cls:'fieldAddDelete', children:[
149 {tag:'div', cls:'new', children:[
150 {tag:'span', children:[
151 {tag:'a', href:'#', id:this.getId('newFieldAddButton'), html:"add"}
152 ]}
153 ]}
154 ]}
155 ]}
156 ]}
157 ]}
158 ]},
159 {tag:'div', cls:'notes', children:[
160 {tag:'div', children:[
161 {tag:'textarea', id:this.getId('recordNote'), value:""}
162 ]}
163 ]}
164 ]},
165 {tag:'li', id:this.getId('directLoginTabpanel'), cls:'tabPanel', children:[
166 {tag:'div', id:this.getId('directLoginsComponentContainer'), cls:'directLoginsComponentContainer', children:[
167 {tag:'div', id:this.getId('directLogins'), cls:'directLogins', children:[
168 {tag:'div', id:this.getId('addNewDirectLoginSplash'), cls:'addNewDirectLoginSplash', children:[
169 {tag:'h3', html:"Here you can add a Direct Login for this card: instant access to your favorit website!"},
170 {tag:'a', href:'#', id:this.getId('addNewDirectLoginSplashButton'), children:[{tag:'span', html:"Add Direct Login"}]}
171 ]},
172 {tag:'div', id:this.getId('directLoginsList')},
173 {tag:'div', cls:'addDirectLoginListItem', id:this.getId('addDirectLoginListItem'), children:[{tag:'a', href:'#', id:this.getId('addNewDirectLoginListItemButton'), children:[{tag:'span', html:"Add Direct Login"}]}]}
174 ]},
175 {tag:'div', id:this.getId('directLoginEditDetail'), cls:'directLoginEditDetail'}
176 ]}
177 ]},
178 {tag:'li', id:this.getId('sharingTabpanel'), cls:'tabPanel', children:[
179 {tag:'h2', html:"Coming soon!"}
180 ]}
181 ]}
182 ]},
183 {tag:'div', cls:'mask', children:[
184 {tag:'div', id:this.getId('progress'), children:[
185 {tag:'h3', id:this.getId('progressDescription'), cls:'progressDescription', html:"Loading"},
186 {tag:'div', id:this.getId('progressBar')}
187 ]},
188 {tag:'div', id:this.getId('error'), cls:'error', children:[
189 {tag:'div', cls:'img'},
190 {tag:'p', id:this.getId('errorMessage')}
191 ]}
192 ]}
193 ]},
194 {tag:'div', cls:'footer', children:[
195 {tag:'div', cls:'buttonArea', children:[
196 {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
197 {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
198 ]}
199 ]}
200 ]}
201 ]});
202
203
204 this.insertAllTooltips();
205
206 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
207
208 this.tabPanelController().setup({selected:'DETAILS'});
209 // this.tabPanelController().setup({selected:'DIRECT_LOGINS'});
210
211 MochiKit.Style.hideElement(this.getId('error'));
212 MochiKit.Style.hideElement(this.getElement('directLoginEditDetail'));
213 MochiKit.Style.hideElement(this.getElement('addDirectLoginListItem'));
214 this.plumbDetailsPanel();
215
216 MochiKit.Signal.connect(this.getId('cancelButton'), 'onclick', this, 'handleCancelEvent');
217 MochiKit.Signal.connect(this.getId('saveButton'), 'onclick', this, 'handleSaveEvent');
218
219 MochiKit.Signal.connect(this.getId('addNewDirectLoginSplashButton'), 'onclick', this, 'handleAddDirectLogin');
220 MochiKit.Signal.connect(this.getId('addNewDirectLoginListItemButton'), 'onclick', this, 'handleAddDirectLogin');
221
222 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown',this, 'handleKeyEvent');
223 },
224
225 //-------------------------------------------------------------------------
226
227 'displayMode': function () {
228 return this._displayMode;
229 },
230
231 'setDisplayMode': function (aValue) {
232 this._displayMode = aValue;
233 },
234
235 //-------------------------------------------------------------------------
236
237 'plumbDetailsPanel': function () {
238 MochiKit.Signal.connect(this.getId('title'), 'onfocus', MochiKit.Base.method(this, 'handleOnFocusEvent',this.getElement('title').parentNode));
239 MochiKit.Signal.connect(this.getId('title'), 'onblur',MochiKit.Base.method(this, 'handleLooseFocusEvent', this.getElement('title').parentNode));
240 MochiKit.Signal.connect(this.getId('title'), 'onchange',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
241 MochiKit.Signal.connect(this.getId('title'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
242
243 MochiKit.Signal.connect(this.getId('recordNote'), 'onfocus', MochiKit.Base.method(this, 'handleOnFocusEvent',MochiKit.Selector.findChildElements(this.element(), ['div.notes'])[0]));
244 MochiKit.Signal.connect(this.getId('recordNote'), 'onblur',MochiKit.Base.method(this, 'handleLooseFocusEvent', MochiKit.Selector.findChildElements(this.element(), ['div.notes'])[0]));
245 MochiKit.Signal.connect(this.getId('recordNote'), 'onchange',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
246 MochiKit.Signal.connect(this.getId('recordNote'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
247
248 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onkeydown',this, 'handleKeyDownOnNewFieldValue');
249
250 MochiKit.Signal.connect(this.getId('newFieldLabel'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
251 MochiKit.Signal.connect(this.getId('newFieldIsLocked'), 'onclick',this, 'toggleNewFieldIsHidden');
252 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
253
254 MochiKit.Signal.connect(this.getId('newFieldAddButton'), 'onclick', this, 'handleAddClick');
255 },
256
257 //-------------------------------------------------------------------------
258
259 'insertAllTooltips': function () {
260 var tooltips;
261 var tooltipEnabled;
262
263 tooltips = {};
264 tooltipEnabled = (this.hintMode() == 'ON');
265
266 tooltips['title'] = new Clipperz.PM.UI.Common.Components.Tooltip({
267 'element':this.getElement('title'),
268 'text': "Insert here the title of the card",
269 'position':'RIGHT'
270 });
271 this.addComponent(tooltips['title']);
272 MochiKit.Signal.connect(this.getId('title'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'title'));
273 MochiKit.Signal.connect(this.getId('title'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'title'));
274
275 tooltips['newFieldTR'] = new Clipperz.PM.UI.Common.Components.Tooltip({
276 'element':this.getElement('newFieldTR'),
277 'text': "Insert your card new values here",
278 'position':'RIGHT'
279 });
280 this.addComponent(tooltips['newFieldTR']);
281 MochiKit.Signal.connect(this.getId('newFieldLabel'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'newFieldTR'));
282 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'newFieldTR'));
283
284 tooltips['recordNote'] = new Clipperz.PM.UI.Common.Components.Tooltip({
285 'element':this.getElement('recordNote'),
286 'text': "You can insert some notes here",
287 'position':'RIGHT'
288 });
289 this.addComponent(tooltips['recordNote']);
290 MochiKit.Signal.connect(this.getId('recordNote'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'recordNote'));
291 MochiKit.Signal.connect(this.getId('recordNote'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'recordNote'));
292
293 this._tooltips = tooltips;
294 },
295
296 //.........................................................................
297
298 'updateAllTooltipsEnabledMode': function (aStatus) {
299 vartooltipLabel;
300 var tooltipEnabled;
301
302 tooltipEnabled = (aStatus == 'ON') ? true : false;
303
304 for (tooltipLabel in this.tooltips()) {
305 this.tooltips()[tooltipLabel].setIsEnabled(tooltipEnabled);
306 }
307 },
308
309 //.........................................................................
310
311 'tooltips': function () {
312 return this._tooltips;
313 },
314
315 //.........................................................................
316
317 'showTooltipOnFocus': function (aTooltip, anEvent) {
318 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.tooltips()[aTooltip], 'show'));
319 },
320
321 //.........................................................................
322
323 'hideTooltipOnBlur': function (aTooltip, anEvent) {
324 this.tooltips()[aTooltip].hide();
325 },
326
327 //-------------------------------------------------------------------------
328
329 'displayElement': function() {
330 return this.getElement('panel');
331 },
332
333 //-------------------------------------------------------------------------
334
335 'fieldComponents': function () {
336 return this._fieldComponents;
337 },
338
339 //-------------------------------------------------------------------------
340
341 'directLoginComponents': function () {
342 return this._directLoginComponents;
343 },
344
345 //-------------------------------------------------------------------------
346
347 'hintMode': function () {
348 return this._hintMode;
349 },
350
351 'setHintMode': function (aValue) {
352 if (this._hintMode != aValue) {
353 this._hintMode = aValue;
354
355 this.updateAllTooltipsEnabledMode(this._hintMode);
356 // if (this._hintMode == 'ON') {
357 // this.enableHints();
358 // }
359 }
360 },
361
362 //-------------------------------------------------------------------------
363
364 'focusOnNewFieldLabel': function () {
365 this.getElement('newFieldLabel').focus();
366 },
367
368 //=========================================================================
369
370 'isSavingEnabled': function () {
371 return this._isSavingEnabled;
372 },
373
374 'setShouldEnableSaving': function (aValue) {
375 this._isSavingEnabled = aValue || this.newFieldHasPendingChanges();
376
377 if (this._isSavingEnabled == true) {
378 MochiKit.DOM.addElementClass(this.getElement('panel'), 'hasPendingChanges');
379 MochiKit.DOM.removeElementClass(this.getId('saveButton'), 'disabled');
380 } else {
381 MochiKit.DOM.removeElementClass(this.getElement('panel'), 'hasPendingChanges');
382 MochiKit.DOM.addElementClass(this.getId('saveButton'), 'disabled');
383 }
384 },
385
386 //=========================================================================
387
388 'title': function () {
389 return this.getElement('title').value;
390 },
391
392 'setTitle': function (aValue) {
393 this.renderTitle(aValue);
394 },
395
396 //-------------------------------------------------------------------------
397
398 'renderTitle': function (aValue) {
399 this.getElement('title').value = Clipperz.Base.sanitizeString(aValue);
400 },
401
402 //-------------------------------------------------------------------------
403
404 'setFocusOnTitleField': function () {
405 this.getElement('title').focus();
406 },
407
408 //-------------------------------------------------------------------------
409
410 'disableCardTitleEditing': function () {
411 this.getElement('title').disabled = true;
412 MochiKit.DOM.addElementClass(this.getElement('title').parentNode, 'disabled');
413 },
414
415
416 'enableCardTitleEditing': function () {
417 this.getElement('title').disabled = false;
418 MochiKit.DOM.removeElementClass(this.getElement('title').parentNode, 'disabled');
419 },
420
421 //=========================================================================
422
423 'notes': function () {
424 return this.getElement('recordNote').value;
425 },
426
427 'setNotes': function (aValue) {
428 this.renderNotes(aValue);
429 },
430
431 //-------------------------------------------------------------------------
432
433 'renderNotes': function (aValue) {
434 var noteElement;
435
436 noteElement = this.getElement('recordNote');
437
438 if ((aValue != null) && (typeof(aValue) != 'undefined')) {
439 noteElement.value = aValue;
440 } else {
441 noteElement.value = "";
442 }
443
444 this.fixNotesHeight();
445 },
446
447 //=========================================================================
448
449 'addFieldRowComponent': function (aFieldComponent) {
450 varfieldTR;
451
452 fieldTR = this.insertBefore(this.getElement('newFieldTR'), {tag:'tr', id:'recordFieldReferece_'+aFieldComponent.reference()});
453 aFieldComponent.renderInNode(fieldTR);
454 this.fieldComponents()[aFieldComponent.reference()] = aFieldComponent;
455 },
456
457 //=========================================================================
458
459 'addDirectLoginComponent': function (aDirectLoginComponent) {
460 var directLoginDIV;
461
462 if (MochiKit.Base.keys(this.directLoginComponents()).length == 0) {
463 this.hideNewDirectLoginSplash();
464 }
465
466 directLoginDIV = this.append(this.getElement('directLoginsList'), {tag:'div', cls:'directLoginItem'});
467 aDirectLoginComponent.renderInNode(directLoginDIV);
468 this.directLoginComponents()[aDirectLoginComponent.reference()] = aDirectLoginComponent;
469 },
470
471 'removeDirectLoginComponent': function (aDirectLoginComponent) {
472 delete this.directLoginComponents()[aDirectLoginComponent.reference()];
473 aDirectLoginComponent.remove();
474
475 if (MochiKit.Base.keys(this.directLoginComponents()).length == 0) {
476 this.showNewDirectLoginSplash();
477 }
478 },
479
480 //=========================================================================
481
482 'showNewDirectLoginSplash': function () {
483 MochiKit.Style.showElement(this.getElement('addNewDirectLoginSplash'));
484 MochiKit.Style.hideElement(this.getElement('addDirectLoginListItem'));
485 },
486
487 'hideNewDirectLoginSplash': function () {
488 MochiKit.Style.hideElement(this.getElement('addNewDirectLoginSplash'));
489 MochiKit.Style.showElement(this.getElement('addDirectLoginListItem'));
490 },
491
492 //=========================================================================
493
494 'renderDirectLoginEditingComponent': function (aDirectLoginEditingComponent) {
495 aDirectLoginEditingComponent.renderInNode(this.getElement('directLoginEditDetail'));
496 },
497
498 'placeDirectLoginEditingComponent': function () {
499 var width;
500
501 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
502
503 return Clipperz.Async.callbacks("CardDialogComponent.renderDirectLoginEditingComponent", [
504 MochiKit.Base.bind(function () {
505 MochiKit.Style.setElementPosition (this.getElement('directLoginEditDetail'), {x:width, y:-MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
506 MochiKit.Style.setElementDimensions(this.getElement('directLoginEditDetail'), {w:width});
507 }, this),
508
509 MochiKit.Base.noop
510 ], {trace:false});
511 },
512
513 //=========================================================================
514
515 'newFieldLabel': function () {
516 return this.getElement('newFieldLabel').value;
517 },
518
519 'setNewFieldLabel': function (aValue) {
520 this.getElement('newFieldLabel').value = aValue;
521 },
522
523 //-------------------------------------------------------------------------
524
525 'newFieldValue': function () {
526 return this.getElement('newFieldValue').value;
527 },
528
529 'setNewFieldValue': function (aValue) {
530 this.getElement('newFieldValue').value = aValue;
531 },
532
533 //-------------------------------------------------------------------------
534
535 'newFieldIsHidden': function () {
536 return MochiKit.DOM.hasElementClass(this.getElement('newFieldIsLocked'), 'locked');
537 },
538
539 'setNewFieldIsHidden': function (aValue) {
540 MochiKit.DOM.setElementClass(this.getElement('newFieldIsLocked'), (aValue ? 'locked': 'unlocked'));
541 MochiKit.DOM.setElementClass(this.getElement('newFieldValueWrapper'), (aValue ? 'locked': 'unlocked'));
542 },
543
544 'toggleNewFieldIsHidden': function (anEvent) {
545 anEvent.preventDefault();
546
547 this.setNewFieldIsHidden(! this.newFieldIsHidden());
548 MochiKit.Signal.signal(this, 'changedValue');
549 },
550
551 //-------------------------------------------------------------------------
552
553 'newFieldHasPendingChanges': function () {
554 return ((this.newFieldLabel() != '') || (this.newFieldValue() != '') || (this.newFieldIsHidden() == true));
555 },
556
557 'resetNewFieldInputs': function () {
558 this.setNewFieldLabel('');
559 this.setNewFieldValue('');
560 this.setNewFieldIsHidden(false);
561 },
562
563 //=========================================================================
564
565 'handleKeyDownOnNewFieldValue': function (anEvent) {
566 MochiKit.Signal.signal(this, 'keyPressed', anEvent);
567/*
568 if ((anEvent.key().string == 'KEY_TAB') && this.newFieldHasPendingChanges()) {
569 anEvent.preventDefault();
570
571 MochiKit.Signal.signal(this, 'addField');
572 this.getElement('newFieldLabel').focus();
573 }
574*/
575 },
576
577 //-------------------------------------------------------------------------
578
579 'handleAddClick': function (anEvent) {
580 anEvent.preventDefault();
581 MochiKit.Signal.signal(this, 'addField');
582 this.getElement('newFieldLabel').focus();
583 },
584
585 //=========================================================================
586
587 'handleDeleteClick': function (aFieldKey, anEvent) {
588 anEvent.preventDefault();
589 MochiKit.Signal.signal(this, 'deleteField', aFieldKey);
590 },
591
592 //-------------------------------------------------------------------------
593
594 'toggleLock': function (aFieldKey, anEvent) {
595 var shouldRedrawAsLocked;
596 var currentTRElement;
597
598 anEvent.preventDefault();
599
600 currentTRElement = Clipperz.DOM.get(aFieldKey);
601 shouldRedrawAsLocked = (MochiKit.DOM.hasElementClass(currentTRElement, 'locked') ? false : true);
602
603 this.renderFieldTR(currentTRElement, {
604 label:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldLabel input'])[0].value,
605 value:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldValue input'])[0].value
606 }, shouldRedrawAsLocked, MochiKit.DOM.hasElementClass(currentTRElement, 'new'));
607 },
608
609 //=========================================================================
610
611 'fixNotesHeight': function () {
612 var element;
613
614 element = this.getElement('recordNote');
615
616 if (element.scrollHeight == 0) {
617 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixNotesHeight'));
618 } else {
619 var textareaHeight;
620
621 textareaHeight = Math.min(Math.max(50, element.scrollHeight), 500);
622
623 MochiKit.Style.setElementDimensions(element, {h:textareaHeight}, 'px');
624 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixRendering'));
625 }
626 },
627
628 //-------------------------------------------------------------------------
629
630 'fixRendering': function () {
631 // varheight;
632 var y;
633 varscrollHeight;
634 var viewportHeight;
635 var viewportY;
636 var footerElement;
637 var footerElementPosition;
638 var footerElementDimensions;
639 var footerComputedHeight;
640
641 // height = MochiKit.Style.getElementDimensions(this.displayElement())['h'];
642 y = MochiKit.Style.getElementPosition(this.displayElement())['y'];
643
644 footerElement = MochiKit.Selector.findChildElements(this.displayElement(), ['div.footer'])[0];
645 footerElementPosition = MochiKit.Style.getElementPosition(footerElement);
646 footerElementDimensions = MochiKit.Style.getElementDimensions(footerElement);
647 footerComputedHeight = footerElementPosition['y'] + footerElementDimensions['h'] - y;
648
649 // scrollHeight = this.displayElement().scrollHeight;
650 scrollHeight = footerComputedHeight;
651
652 viewportHeight = MochiKit.Style.getViewportDimensions()['h'];
653 viewportY = MochiKit.Style.getViewportPosition()['y'];
654
655 if ((y + scrollHeight) > (viewportY + viewportHeight)) {
656 this.setDisplayMode('scrollable');
657 MochiKit.DOM.addElementClass(this.element(), 'scrollable');
658 MochiKit.DOM.removeElementClass(this.element(), 'fixed');
659 MochiKit.Style.setElementPosition(this.displayElement(), {y:Math.max(0, Math.min(y, (viewportY + viewportHeight) - scrollHeight))}, 'px');
660 MochiKit.Visual.ScrollTo(this.displayElement(), {duration:0.5});
661 } else {
662 this.setDisplayMode('fixed');
663 MochiKit.DOM.removeElementClass(this.element(), 'scrollable');
664 MochiKit.DOM.addElementClass(this.element(), 'fixed');
665 }
666 },
667
668 //=========================================================================
669
670 'unselectCurrentSelectedItems': function () {
671 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.displayElement(), ['.selectedField']), function (anElement) {
672 MochiKit.DOM.removeElementClass(anElement, 'selectedField');
673 });
674 },
675
676 //=========================================================================
677
678 'hideProgressMask': function () {
679 MochiKit.DOM.removeElementClass(this.getId('panel'), 'loading');
680 },
681
682 'showProgressMask': function () {
683 this.getElement('progressDescription').innerHTML = "Saving";
684 MochiKit.DOM.addElementClass(this.getId('panel'), 'loading');
685 },
686
687 'showError': function (anError) {
688//console.log(">>> showError", anError);
689 MochiKit.Style.hideElement(this.getId('progress'));
690 this.getElement('errorMessage').innerHTML = Clipperz.PM.Strings.errorDescriptionForException(anError['message']);
691 MochiKit.Style.showElement(this.getId('error'));
692 },
693
694 //-------------------------------------------------------------------------
695
696 'cancel': function () {
697/*
698 var deferredResult;
699
700 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.cancel", {trace:false});
701 deferredResult.addCallback(MochiKit.Base.method(this, 'isSavingEnabled'));
702 deferredResult.addIf([
703 MochiKit.Base.method(this, 'askConfirmationForLoosingPendingChanges')
704 ], []);
705 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Signal.signal, this, 'cancel'));
706 deferredResult.callback();
707
708 return deferredResult;
709*/
710 MochiKit.Signal.signal(this, 'cancel');
711 },
712
713 'handleCancelEvent': function (anEvent) {
714 anEvent.preventDefault();
715 this.cancel();
716 },
717
718 //-------------------------------------------------------------------------
719
720 'handleSaveEvent': function (anEvent) {
721 anEvent.preventDefault();
722
723 if (! MochiKit.DOM.hasElementClass(anEvent.src(), 'disabled')) {
724 MochiKit.Signal.signal(this, 'save');
725 }
726 },
727
728 //-------------------------------------------------------------------------
729
730 'handleAddDirectLogin': function (anEvent) {
731 anEvent.preventDefault();
732
733 MochiKit.Signal.signal(this, 'addDirectLogin');
734 },
735
736 //-------------------------------------------------------------------------
737
738 'handleOnFocusEvent': function (anElement, anEvent) {
739 this.unselectCurrentSelectedItems();
740 MochiKit.DOM.addElementClass(anElement, 'selectedField');
741 },
742
743 'handleLooseFocusEvent': function (anElement, anEvent) {
744 this.unselectCurrentSelectedItems();
745 },
746
747 //-------------------------------------------------------------------------
748
749 'handleTabSelected': function (aSelectedTab) {
750 this.unselectCurrentSelectedItems();
751
752 switch (aSelectedTab) {
753 case 'DETAILS':
754 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton'));
755 break;
756 case 'DIRECT_LOGINS':
757 // MochiKit.Style.showElement(this.getElement('addDirectLoginButton'));
758 break;
759 case 'SHARING':
760 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton'));
761 break;
762 }
763 },
764
765 //-------------------------------------------------------------------------
766
767 'handleKeyEvent': function (anEvent) {
768//console.log("####", anEvent.key().string);
769 if (anEvent.key().string == 'KEY_ESCAPE') {
770 MochiKit.Signal.signal(this, 'changedValue');
771 this.cancel();
772 } else if (anEvent.key().string == 'KEY_ENTER') {
773 if (anEvent.target().nodeName == 'TEXTAREA') {
774
775 } else {
776 anEvent.preventDefault();
777 }
778 }
779 },
780
781 //=========================================================================
782
783 'askConfirmationForLoosingPendingChanges': function () {
784 var deferredResult;
785 var confirmationDialog;
786
787 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
788 title:"Alert",
789 text:"Should lost pending changes?",
790 type:'ALERT',
791 buttons: [
792 {text:"Cancel",result:'CANCEL', isDefault:true},
793 {text:"Ok", result:'OK'}
794 ]
795 });
796
797 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
798 // deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()});
799 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
800 'openFromElement': this.getElement('cancelButton'),
801 'onOkCloseToElement': null, //this.getElement('cancelButton'),
802 'onCancelCloseToElement':this.getElement('cancelButton')
803 });
804 // deferredResult.addCallback(function () { console.log("DELETE: " + anObject.toString(), anObject); });
805 // deferredResult.addErrbackPass(function () { console.log("skip deletion: " + anObject.toString(), anObject); });
806 deferredResult.callback();
807
808 return deferredResult;
809 },
810
811 //=========================================================================
812
813 'showDirectLoginEditingComponent': function () {
814 varwidth;
815 var transition;
816 var duration;
817
818 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
819 transition = MochiKit.Visual.Transitions.sinoidal;
820 duration = 1;
821
822 return Clipperz.Async.callbacks("CardDialogComponent.showDirectLoginEditingComponent", [
823 MochiKit.Base.method(this, 'disableCardTitleEditing'),
824 MochiKit.Base.method(this.tabPanelController(), 'disable'),
825
826 MochiKit.Base.bind(function () {
827 MochiKit.Style.setElementPosition (this.getElement('directLoginEditDetail'), {x:width, y:-MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
828 MochiKit.Style.setElementDimensions(this.getElement('directLoginEditDetail'), {w:width});
829 MochiKit.Style.showElement(this.getElement('directLoginEditDetail'));
830 MochiKit.Style.setOpacity(this.getElement('directLoginEditDetail'), 0);
831 MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {
832 h:Math.max(
833 MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h'],
834 MochiKit.Style.getElementDimensions(this.getElement('directLoginEditDetail'))['h']
835 )
836 });
837 // MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
838 }, this),
839 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [
840 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}),
841 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:1.0, to:0.0, transition:transition, sync:true}),
842 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}),
843 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:0.0, to:1.0, transition:transition, sync:true})
844 ], {duration:duration}),
845
846 MochiKit.Base.noop
847 ], {trace:false});
848 },
849
850 //-------------------------------------------------------------------------
851
852 'hideDirectLoginEditingComponent': function () {
853 varwidth;
854 var transition;
855 var duration;
856
857 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
858 transition = MochiKit.Visual.Transitions.sinoidal;
859 duration = 1;
860
861 return Clipperz.Async.callbacks("CardDialogComponent.hideDirectLoginEditingComponent", [
862 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [
863 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:width, y:0, mode:'relative', transition:transition, sync:true}),
864 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:0.0, to:1.0, transition:transition, sync:true}),
865 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:width, y:0, mode:'relative', transition:transition, sync:true}),
866 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:1.0, to:0.0, transition:transition, sync:true})
867 ], {duration:duration}),
868 // MochiKit.Base.partial(MochiKit.Visual.appear, this.getElement('addDirectLoginButton'), {duration:0.3}),
869 Clipperz.Async.clearResult,
870 MochiKit.Base.partial(MochiKit.Style.hideElement, this.getElement('directLoginEditDetail')),
871 // MochiKit.Base.partial(MochiKit.Style.showElement, this.getElement('directLogins')),
872 MochiKit.Base.partial(MochiKit.Style.setElementDimensions, this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}),
873
874 MochiKit.Base.method(this, 'enableCardTitleEditing'),
875 MochiKit.Base.method(this.tabPanelController(), 'enable')
876 ], {trace:false});
877 },
878
879 //=========================================================================
880 __syntaxFix__: "syntax fix"
881});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
new file mode 100644
index 0000000..126c5b1
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
@@ -0,0 +1,182 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent.superclass.constructor.apply(this, arguments);
35
36 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._faviconComponent = null;
38
39 return this;
40}
41
42//=============================================================================
43
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
45
46 //-------------------------------------------------------------------------
47
48 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent component";
50 },
51
52 //-------------------------------------------------------------------------
53
54 'reference': function () {
55 return this._reference;
56 },
57
58 //-------------------------------------------------------------------------
59
60 'renderSelf': function() {
61//console.log(">>> CardDialogRecordDirectLoginComponent.renderSelf");
62 this.append(this.element(), [
63 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_favicon', children:[
64 {tag:'img', cls:'favicon', id:this.getId('favicon')}
65 ]},
66 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_label', children:[
67 {tag:'input', id:this.getId('label'), type:'text'}
68 ]},
69 {tag:'div', cls:'open', children:[
70 {tag:'span', children:[
71 {tag:'a', href:'open', id:this.getId('open'), html:'&nbsp;'}
72 ]}
73 ]},
74 {tag:'div', cls:'edit', children:[
75 {tag:'span', children:[
76 {tag:'a', href:'edit', id:this.getId('edit'), html:"edit"}
77 ]}
78 ]},
79 {tag:'div', cls:'delete', children:[
80 {tag:'span', children:[
81 {tag:'a', href:'delete', id:this.getId('delete'), html:"delete"}
82 ]}
83 ]}
84/*
85 {tag:'td', cls:'fieldState'},
86 {tag:'td', cls:'fieldLabel', children:[
87 {tag:'input', cls:'label', id:this.getId('label')}
88 ]},
89 {tag:'td', cls:'fieldLock', children:[
90 {tag:'div', cls:'unlocked', id:this.getId('isHidden')}
91 ]},
92 {tag:'td', cls:'fieldValue', children:[
93 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
94 {tag:'input', type:'text', cls:'value', id:this.getId('value')}
95 ]}
96 ]},
97 {tag:'td', cls:'fieldAddDelete', children:[
98 {tag:'div', cls:'delete', children:[
99 {tag:'span', children:[
100 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
101 ]}
102 ]}
103 ]}
104*/
105 ]);
106
107 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
108 MochiKit.Signal.connect(this.getId('open'), 'onclick',this, 'openDirectLogin');
109 MochiKit.Signal.connect(this.getId('edit'), 'onclick',this, 'editDirectLogin');
110 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteDirectLogin');
111 },
112
113 //-------------------------------------------------------------------------
114
115 'shouldShowElementWhileRendering': function () {
116 return false;
117 },
118
119 //-------------------------------------------------------------------------
120
121 'faviconComponent': function () {
122 if (this._faviconComponent == null) {
123//console.log("created the FAVICON component");
124 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')});
125 }
126
127 return this._faviconComponent;
128 },
129
130 //=========================================================================
131
132 'label': function () {
133 return this.getElement('label').value;
134 },
135
136 'setLabel': function (aValue) {
137 this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
138 },
139
140 //-------------------------------------------------------------------------
141
142 'favicon': function () {
143 // return this.getElement('favicon').src;
144 return this.faviconComponent().src();
145 },
146
147 'setFavicon': function (aValue) {
148 // this.getElement('favicon').src = Clipperz.Base.sanitizeString(aValue);
149 this.faviconComponent().setSrc(Clipperz.Base.sanitizeString(aValue));
150 },
151
152 //=========================================================================
153
154 'openDirectLogin': function (anEvent) {
155 anEvent.preventDefault();
156
157 MochiKit.Signal.signal(this, 'openDirectLogin', this.reference());
158 },
159
160 //-------------------------------------------------------------------------
161
162 'editDirectLogin': function (anEvent) {
163 anEvent.preventDefault();
164
165 MochiKit.Signal.signal(this, 'editDirectLogin', this.reference());
166//console.log("EDIT DIRECT LOGIN");
167 },
168
169 //-------------------------------------------------------------------------
170
171 'deleteDirectLogin': function (anEvent) {
172 anEvent.preventDefault();
173
174 MochiKit.Signal.signal(this, 'deleteDirectLogin', this.reference());
175//console.log("DELETE DIRECT LOGIN");
176 },
177
178
179
180 //=========================================================================
181 __syntaxFix__: "syntax fix"
182});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
new file mode 100644
index 0000000..c1a7c13
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
@@ -0,0 +1,190 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent.superclass.constructor.apply(this, arguments);
35
36 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._actionType = null;
38
39 return this;
40}
41
42//=============================================================================
43
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
45
46 //-------------------------------------------------------------------------
47
48 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent component";
50 },
51
52 //-------------------------------------------------------------------------
53
54 'renderSelf': function() {
55 this.append(this.element(), [
56 {tag:'td', cls:'fieldState'},
57 {tag:'td', cls:'fieldLabel', children:[
58 {tag:'input', cls:'label', id:this.getId('label')}
59 ]},
60 {tag:'td', cls:'fieldLock', children:[
61 {tag:'div', cls:'unlocked', id:this.getId('isHidden')}
62 ]},
63 {tag:'td', cls:'fieldValue', children:[
64 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
65 {tag:'input', type:'text', cls:'value', id:this.getId('value')}
66 ]}
67 ]},
68 {tag:'td', cls:'fieldAction', children:[
69 {tag:'a', href:'#', id:this.getId('actionLink'), html:'&nbsp;'}
70 ]},
71 {tag:'td', cls:'fieldAddDelete', children:[
72 {tag:'div', cls:'delete', children:[
73 {tag:'span', children:[
74 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
75 ]}
76 ]}
77 ]}
78 ]);
79
80 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
81 MochiKit.Signal.connect(this.getId('isHidden'), 'onclick',this, 'toggleIsHidden');
82 MochiKit.Signal.connect(this.getId('value'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
83 MochiKit.Signal.connect(this.getId('actionLink'), 'onclick',this, 'handleActionLink');
84 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteField');
85 // MochiKit.Signal.connect(this.getId('delete'), 'onclick',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'deleteField', this.reference()));
86 },
87
88 //-------------------------------------------------------------------------
89
90 'shouldShowElementWhileRendering': function () {
91 return false;
92 },
93
94 //=========================================================================
95
96 'reference': function () {
97 return this._reference;
98 },
99
100 //=========================================================================
101
102 'label': function () {
103 return this.getElement('label').value;
104 },
105
106 'setLabel': function (aValue) {
107 // this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
108 this.getElement('label').value = aValue;
109 },
110
111 //=========================================================================
112
113 'value': function () {
114 return this.getElement('value').value;
115 },
116
117 'setValue': function (aValue) {
118 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
119 this.getElement('value').value = aValue;
120 },
121
122 //-------------------------------------------------------------------------
123
124 'actionType': function () {
125 return this._actionType;
126 },
127
128 'setActionType': function (anActionType) {
129 this._actionType = anActionType;
130
131 switch (this._actionType) {
132 case 'NONE':
133 MochiKit.Style.hideElement(this.getId('actionLink'));
134 MochiKit.DOM.setElementClass(this.getId('actionLink'), '');
135 break;
136 case 'URL':
137 MochiKit.Style.showElement(this.getId('actionLink'));
138 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'url');
139 break;
140 case 'EMAIL':
141 MochiKit.Style.showElement(this.getId('actionLink'));
142 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'email');
143 break;
144 case 'PASSWORD':
145 MochiKit.Style.showElement(this.getId('actionLink'));
146 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'password');
147 break;
148 }
149 },
150
151 //=========================================================================
152
153 'isHidden': function () {
154 // return this.getElement('value').value;
155 return MochiKit.DOM.hasElementClass(this.getElement('isHidden'), 'locked');
156 },
157
158 'setIsHidden': function (aValue) {
159 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
160 MochiKit.DOM.setElementClass(this.getElement('isHidden'), (aValue ? 'locked': 'unlocked'));
161 MochiKit.DOM.setElementClass(this.getElement('valueWrapper'), (aValue ? 'locked': 'unlocked'));
162 },
163
164 'toggleIsHidden': function (anEvent) {
165 anEvent.preventDefault();
166
167 this.setIsHidden(! this.isHidden());
168 MochiKit.Signal.signal(this, 'changedValue');
169 },
170
171 //=========================================================================
172
173 'handleActionLink': function (anEvent) {
174 anEvent.preventDefault();
175
176//console.log("ACTION LINK - " + this.actionType());
177 MochiKit.Signal.signal(this, 'performAction', this.reference(), anEvent.target());
178 },
179
180 //=========================================================================
181
182 'deleteField': function (anEvent) {
183 anEvent.preventDefault();
184
185 MochiKit.Signal.signal(this, 'deleteField', this.reference());
186 },
187
188 //=========================================================================
189 __syntaxFix__: "syntax fix"
190});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
new file mode 100644
index 0000000..bfc7e61
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
@@ -0,0 +1,203 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31//#############################################################################
32
33Clipperz.PM.UI.Web.Components.ColumnManager = function(args) {
34 args = args || {};
35 Clipperz.PM.UI.Web.Components.ColumnManager.superclass.constructor.call(this, args);
36
37 this._name = args.name || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._selector = args.selector|| Clipperz.Base.exception.raise('MandatoryParameter');;
39 this._label = args.label || null;
40 this._isSortable = args.sortable|| false;
41 this._comparator = args.comparator|| null;
42 this._sorted = args.sorted || 'UNSORTED'; //'ASCENDING' | 'DESCENDING' | 'UNSORTED'
43 this._cssClass = args.cssClass|| '';
44
45 this._signalIdentifiers = [];
46
47 return this;
48}
49
50//=============================================================================
51
52Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ColumnManager, Clipperz.PM.UI.Common.Components.BaseComponent, {
53
54 'toString': function () {
55 return "Clipperz.PM.UI.Web.Components.ColumnManager - " + this._name;
56 },
57
58 'name': function () {
59 return this._name;
60 },
61
62 'label': function () {
63 return this._label;
64 },
65
66 'selector': function () {
67 return this._selector;
68 },
69
70 'comparator': function() {
71 return this._comparator;
72 },
73
74 'cssClass': function() {
75 return this._cssClass;
76 },
77
78 //-------------------------------------------------------------------------
79
80 'isSortable': function () {
81 return this._isSortable;
82 },
83
84 //-------------------------------------------------------------------------
85
86 'sorted': function () {
87 return this._sorted;
88 },
89
90 'isSorted': function () {
91 return (this.sorted() != 'UNSORTED');
92 },
93
94 'setSorted': function(aValue) {
95 this._sorted = aValue;
96 this.updateSortIcon();
97 },
98
99 //-------------------------------------------------------------------------
100
101 'signalIdentifiers': function () {
102 return this._signalIdentifiers;
103 },
104
105 'resetSignalIdentifiers': function () {
106 this._signalIdentifiers = [];
107 },
108
109 //-------------------------------------------------------------------------
110
111 'disconnectRowsSignals': function () {
112 MochiKit.Base.map(MochiKit.Signal.disconnect, this.signalIdentifiers());
113 this.resetSignalIdentifiers();
114 },
115
116 'connectEvent': function () {
117 var ident;
118
119 ident = MochiKit.Signal.connect.apply(null, arguments);
120 this.signalIdentifiers().push(ident);
121 },
122
123 //-------------------------------------------------------------------------
124
125 'renderHeader': function(aTRElement) {
126 varthElement;
127
128 thElement = Clipperz.DOM.Helper.append(aTRElement, {tag:'th', cls:(this.cssClass() + 'TH'), id:this.getId('sortLink'), children:[
129 {tag:'span', html:this.label() ? this.label() : '&nbsp;'}
130 ]});
131
132 if (this.isSortable()) {
133 Clipperz.DOM.Helper.append(thElement, {tag:'span', cls:'sortable', children:[
134 {tag:'a', href:'#'/*, id:this.getId('sortLink')*/, html:'&nbsp;'}
135 ]});
136
137 MochiKit.DOM.addElementClass(thElement, 'sortable');
138 MochiKit.Signal.connect(thElement, 'onclick', this, 'handleClickOnSortingCriteria');
139 };
140
141 this.updateSortIcon();
142 },
143
144 //-------------------------------------------------------------------------
145
146 'toggleSorting': function () {
147 var result;
148 switch (this.sorted()) {
149 case 'UNSORTED':
150 result = 'ASCENDING';
151 break;
152 case 'ASCENDING':
153 result = 'DESCENDING';
154 break;
155 case 'DESCENDING':
156 result = 'ASCENDING';
157 break;
158 default:
159 result = 'UNSORTED';
160 break;
161 }
162
163 this.setSorted(result);
164
165 return result;
166 },
167
168 //-------------------------------------------------------------------------
169
170 'sortElementClass': function () {
171 return this.sorted().toLowerCase();
172 },
173
174 //-------------------------------------------------------------------------
175
176 'updateSortIcon': function () {
177 if (this.isSortable()) {
178 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'ascending');
179 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'descending');
180 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'unsorted');
181
182 MochiKit.DOM.addElementClass(this.getId('sortLink'), this.sortElementClass());
183 }
184 },
185
186 //-------------------------------------------------------------------------
187
188 'renderCell': function(aRowElement, anObject) {
189 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[{tag:'span', html:anObject[this.name()]}]});
190 },
191
192 //-----------------------------------------------------
193
194 'handleClickOnSortingCriteria': function (anEvent) {
195 anEvent.preventDefault();
196 MochiKit.Signal.signal(this, 'sort', this);
197 },
198
199 //-----------------------------------------------------
200 '__syntax_fix__' : 'syntax fix'
201
202});
203
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
new file mode 100644
index 0000000..61d6ead
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
@@ -0,0 +1,71 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent.superclass.constructor.apply(this, arguments);
35
36 return this;
37}
38
39//=============================================================================
40
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return "Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent component";
47 },
48
49 //-------------------------------------------------------------------------
50
51 'renderSelf': function() {
52 this.append(this.element(), [
53 {tag:'div', cls:'createNewCardSplash', id:this.getId('button'), children:[
54 {tag:'span', html:"Create New Card"}
55 ]}
56 ]);
57
58 MochiKit.Signal.connect(this.getElement('button'), 'onclick', this, 'handleClick');
59 },
60
61 //-------------------------------------------------------------------------
62
63 'handleClick': function (anEvent) {
64 anEvent.preventDefault();
65 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'addCard', this.element());
66 },
67
68 //-------------------------------------------------------------------------
69
70 __syntaxFix__: "syntax fix"
71});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
new file mode 100644
index 0000000..91d99e3
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
@@ -0,0 +1,111 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.DataPanel = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments);
35
36 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY';
37 this._tabPanelControllerConfiguration = {
38 'OFFLINE_COPY': {
39 tab:'offlineCopyTab',
40 panel:'offlineCopyPanel'
41 },
42 'SHARING': {
43 tab:'sharingTab',
44 panel:'sharingPanel'
45 },
46 'IMPORT': {
47 tab:'importTab',
48 panel:'importPanel'
49 },
50 'EXPORT': {
51 tab:'exportTab',
52 panel:'exportPanel'
53 }
54 };
55
56 return this;
57}
58
59//=============================================================================
60
61Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
62
63 //-------------------------------------------------------------------------
64
65 'toString': function () {
66 return "Clipperz.PM.UI.Web.Components.DataPanel component";
67 },
68
69 //-------------------------------------------------------------------------
70
71 'renderSelf': function(/*aContainer, aPosition*/) {
72 this.append(this.element(), [
73 {tag:'div', cls:'header', children:[
74 {tag:'div', cls:'subPanelTabs', children:[
75 {tag:'ul', children:[
76 {tag:'li', id:this.getId('offlineCopyTab'),children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'},
77 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'a', href:'#', html:'Sharing'}]},
78 {tag:'li', id:this.getId('importTab'), children:[{tag:'a', href:'#', html:'Import'}]},
79 {tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]}
80 ]}
81 ]}
82 ]},
83 {tag:'div', cls:'body', children:[
84 {tag:'div', cls:'accountPanel', children:[
85 {tag:'div', cls:'subPanelContent', children:[
86 {tag:'ul', children:[
87 {tag:'li', id:this.getId('offlineCopyPanel'),children:[
88 {tag:'h3', html:"Offline copy"}
89 ]},
90 {tag:'li', id:this.getId('sharingPanel'),children:[
91 {tag:'h3', html:"Sharing"}
92 ]},
93 {tag:'li', id:this.getId('importPanel'), children:[
94 {tag:'h3', html:"Import"}
95 ]},
96 {tag:'li', id:this.getId('exportPanel'), children:[
97 {tag:'h3', html:"Export"}
98 ]}
99 ]}
100 ]}
101 ]}
102 ]},
103 {tag:'div', cls:'footer'}
104 ]);
105
106 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
107 },
108
109 //-------------------------------------------------------------------------
110 __syntaxFix__: "syntax fix"
111});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
new file mode 100644
index 0000000..3f8aa88
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
@@ -0,0 +1,72 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31//#############################################################################
32
33Clipperz.PM.UI.Web.Components.DateColumnManager = function(args) {
34 args = args || {};
35 Clipperz.PM.UI.Web.Components.DateColumnManager.superclass.constructor.call(this, args);
36
37 this._format = args.format|| Clipperz.Base.exception.raise('MandatoryParameter');
38
39 return this;
40}
41
42//=============================================================================
43
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DateColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
45
46 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
48 },
49
50 //-------------------------------------------------------------------------
51
52 'format': function () {
53 return this._format;
54 },
55
56 //-------------------------------------------------------------------------
57
58 'renderCell': function(aRowElement, anObject) {
59 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
60 {
61 tag:'span',
62 title:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], "D, d M Y H:i:s"),
63 html:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], this.format())
64 }
65 ]});
66 },
67
68 //-----------------------------------------------------
69
70 '__syntax_fix__' : 'syntax fix'
71});
72
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
new file mode 100644
index 0000000..ee60f2f
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
@@ -0,0 +1,70 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31//#############################################################################
32
33Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager = function(args) {
34 args = args || {};
35 Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager.superclass.constructor.call(this, args);
36
37 return this;
38}
39
40//=============================================================================
41
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager, Clipperz.PM.UI.Web.Components.LinkColumnManager, {
43
44 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager component";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'renderCell': function(aRowElement, anObject) {
51 var tdElement;
52 var linkElement;
53
54 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
55 {tag:'div', cls:'delete', children:[
56 {tag:'span', children:[
57 {tag:'a', href:'delete', html:"delete"}
58 ]}
59 ]}
60 ]});
61
62 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
63 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
64 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
65 },
66
67 //-----------------------------------------------------
68 '__syntax_fix__' : 'syntax fix'
69});
70
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
new file mode 100644
index 0000000..4bf9020
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
@@ -0,0 +1,90 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29/*
30Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
31
32//#############################################################################
33
34Clipperz.PM.UI.Web.Components.DirectLoginColumnManager = function(args) {
35 args = args || {};
36 Clipperz.PM.UI.Web.Components.DirectLoginColumnManager.superclass.constructor.call(this, args);
37
38 this._actionMethod = args.actionMethod || null;
39
40 return this;
41}
42
43//=============================================================================
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
46
47 'toString': function () {
48 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
49 },
50
51 //-------------------------------------------------------------------------
52
53 'actionMethod': function () {
54 return this._actionMethod;
55 },
56
57 //-------------------------------------------------------------------------
58
59 'renderCell': function(aRowElement, anObject) {
60 vartdElement;
61 varlinkElement;
62
63 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
64 {tag:'div', cls:'directLogin_directLogin', children:[
65 {tag:'div', cls:'directLogin_directLogin_body', children:[
66 {tag:'a', href:'#', html:anObject[this.name()]}
67 ]}
68 ]}
69 ]});
70
71 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
72 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
73 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
74 },
75
76 //-----------------------------------------------------
77
78 'handleLinkClick': function (anObject, anEvent) {
79 anEvent.preventDefault();
80
81 if (this.actionMethod() != null) {
82 this.actionMethod()(anObject, anEvent);
83 }
84 },
85
86 //-----------------------------------------------------
87 '__syntax_fix__' : 'syntax fix'
88});
89
90*/ \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
new file mode 100644
index 0000000..9a9c0b2
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
@@ -0,0 +1,168 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent.superclass.constructor.apply(this, arguments);
35
36 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._fields = args.fields || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._initiallySelectedFieldKey = args.selectedFieldKey|| null;
39
40 return this;
41}
42
43//=============================================================================
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
46
47 //-------------------------------------------------------------------------
48
49 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent component";
51 },
52
53 //-------------------------------------------------------------------------
54
55 'formFieldName': function () {
56 return this._formFieldName;
57 },
58
59 //-------------------------------------------------------------------------
60
61 'fields': function () {
62 return this._fields;
63 },
64
65 //-------------------------------------------------------------------------
66
67 'selectedValue': function () {
68 var result;
69
70 result = this.getElement('select').value;
71
72 if (result == '---') {
73 result = null;
74 }
75
76 return result;
77 },
78
79 'initiallySelectedFieldKey': function () {
80 return this._initiallySelectedFieldKey;
81 },
82
83 //=========================================================================
84
85 'renderSelf': function() {
86 var initiallySelectedOptions;
87
88 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'binding', children:[
89 {tag:'span', cls:'formFieldName', html:this.formFieldName()},
90 {tag:'span', cls:'fieldLock', id:this.getId('isHidden'), children:[
91 {tag:'a', href:'#', id:this.getId('showHide'), html:'&nbsp;'}
92 ]},
93 {tag:'input', id:this.getId('input'), cls:'formFieldExampleValue', disabled:true, value:''},
94 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
95 MochiKit.Base.flattenArguments(
96 {tag:'option', value:'---', html:"---"},
97 MochiKit.Base.map(
98 MochiKit.Base.bind(function (aField) { return {tag:'option', value:aField['reference'], html:aField['label']}; }, this),
99 this.fields()
100 )
101 )
102 }
103 ]});
104
105 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
106 MochiKit.Signal.connect(this.getElement('showHide'), 'onclick', this, 'handleShowHide');
107
108 if (! MochiKit.Base.isUndefinedOrNull(this.initiallySelectedFieldKey())) {
109 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initiallySelectedFieldKey() + ']']);
110 if (initiallySelectedOptions.length == 1) {
111 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
112 this.handleSelectChange();
113 }
114 }
115 },
116
117 //-------------------------------------------------------------------------
118
119 'setFieldValue': function (aValue) {
120 this.getElement('input').value = aValue;
121 },
122
123 'isHidden': function () {
124 return MochiKit.DOM.hasElementClass(this.getElement('div'), 'locked');
125 },
126
127 'setIsHidden': function (aValue) {
128 if (aValue == true) {
129 MochiKit.DOM.addElementClass(this.getElement('div'), 'locked');
130 MochiKit.DOM.addElementClass(this.getElement('div'), 'showLocked');
131 } else {
132 MochiKit.DOM.removeElementClass(this.getElement('div'), 'locked');
133 MochiKit.DOM.removeElementClass(this.getElement('div'), 'showLocked');
134 }
135 },
136
137 'isShowLocked': function () {
138 return MochiKit.DOM.hasElementClass(this.getElement('div'), 'showLocked');
139 },
140
141 //-------------------------------------------------------------------------
142
143 'handleSelectChange': function (anEvent) {
144 // this.getElement('input').value = this.valueOfField(anEvent.src().value);
145 MochiKit.Signal.signal(this, 'bindChange', this);
146 },
147
148 'handleShowHide': function (anEvent) {
149 anEvent.preventDefault();
150
151 if (this.isShowLocked()) {
152 MochiKit.DOM.removeElementClass(this.getElement('div'), 'showLocked');
153 } else {
154 MochiKit.DOM.addElementClass(this.getElement('div'), 'showLocked');
155 }
156 },
157
158 //=========================================================================
159 __syntaxFix__: "syntax fix"
160});
161
162
163
164
165
166
167
168
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
new file mode 100644
index 0000000..d254c29
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
@@ -0,0 +1,481 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent.superclass.constructor.apply(this, arguments);
35
36 this._tabPanelController = null;
37
38 this._initiallySelectedTab = args.selected || 'TYPE';
39 this._tabPanelControllerConfiguration = {
40 'LABEL': {
41 tab:'labelTab',
42 panel:'labelTabpanel'
43 },
44 'TYPE': {
45 tab:'typeTab',
46 panel:'typeTabpanel'
47 },
48 'CONFIGURATION': {
49 tab:'configurationTab',
50 panel:'configurationTabpanel'
51 },
52 'BINDINGS': {
53 tab:'bindingsTab',
54 panel:'bindingsTabpanel'
55 },
56 'FAVICON': {
57 tab:'faviconTab',
58 panel:'faviconTabpanel'
59 },
60 'DONE': {
61 tab:'doneTab',
62 panel:'doneTabpanel'
63 }
64 };
65
66 this._directLoginReference = null;
67
68 this._directLoginFavicon = null;
69
70 this._updateFaviconCounter = 0;
71 this._faviconComponent = null;
72
73 this._bindingComponents= [];
74 this._formValueComponents = [];
75
76 return this;
77}
78
79//=============================================================================
80
81//Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
82Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
83
84 //-------------------------------------------------------------------------
85
86 'toString': function () {
87 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent component";
88 },
89
90 //=========================================================================
91
92 'directLoginReference': function () {
93 return this._directLoginReference;
94 },
95
96 //-------------------------------------------------------------------------
97
98 'setDirectLoginReference': function (aDirectLoginReference) {
99 this._directLoginReference = aDirectLoginReference;
100
101 return this._directLoginReference;
102 },
103
104 //=========================================================================
105
106 'label': function () {
107 return this.getElement('label').value
108 },
109
110 'setLabel': function (aValue) {
111//console.log("##> LABEL: " + aValue);
112 this.getElement('label').value = (aValue ? aValue : '');
113 },
114
115 //-------------------------------------------------------------------------
116
117 'favicon': function () {
118 return this.getElement('faviconURL').value;
119 },
120
121 'setFavicon': function (aValue) {
122 var regexp;
123 var displayValue;
124
125 regexp = new RegExp('^data\:\/\/.*', 'i');
126 if (regexp.test(aValue)) {
127 displayValue = ''
128 } else {
129 displayValue = (aValue ? aValue : '');
130 }
131
132 this.getElement('faviconURL').value = displayValue;
133 this.faviconComponent().setSrc(aValue);
134 },
135
136 //'setFaviconData': function (aValue) {
137 // this.getElement('faviconIcon').src = aValue;
138 //},
139
140 'directLoginFavicon': function () {
141 return this._directLoginFavicon;
142 },
143
144 'setDirectLoginFavicon': function (aValue) {
145 this._directLoginFavicon = aValue;
146 this.setFavicon(aValue);
147 },
148
149 //-------------------------------------------------------------------------
150
151 'bookmarkletConfiguration': function () {
152 return this.getElement('bookmarkletConfiguration').value
153 },
154
155 'setBookmarkletConfiguration': function (aValue) {
156 this.getElement('bookmarkletConfiguration').value = aValue;
157 },
158
159 'highlightConfigurationSyntaxError': function () {
160 MochiKit.DOM.addElementClass(this.getElement('bookmarkletConfiguration'), 'error');
161 },
162
163 'removeHighlightConfigurationSyntaxError': function () {
164 MochiKit.DOM.removeElementClass(this.getElement('bookmarkletConfiguration'), 'error');
165 },
166
167 //=========================================================================
168
169 'disableAllPanels': function () {
170 this.getElement('label').disabled = true;
171 MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
172
173 this.tabPanelController().selectTab(null);
174 },
175
176 //-------------------------------------------------------------------------
177
178 //'disableLabelField': function () {
179 // this.getElement('label').disabled = true;
180 // MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
181 //},
182
183 'enableLabelField': function () {
184 this.getElement('label').disabled = false;
185 MochiKit.DOM.removeElementClass(this.getElement('label').parentNode, 'disabled');
186 this.tabPanelController().selectTab('LABEL');
187 },
188
189 //-------------------------------------------------------------------------
190
191 //'disableTypeField': function () {
192 // this.tabPanelController().selectTab(null);
193 //},
194
195 'enableTypeField': function () {
196 this.tabPanelController().selectTab('TYPE');
197 },
198
199 //-------------------------------------------------------------------------
200
201 //'disableConfigurationField': function () {
202 // this.tabPanelController().selectTab(null);
203 //},
204
205 'enableConfigurationField': function () {
206 this.tabPanelController().selectTab('CONFIGURATION');
207 },
208
209 //-------------------------------------------------------------------------
210
211 //'disableBindingFields': function () {
212 // this.tabPanelController().selectTab(null);
213 //},
214
215 'enableBindingFields': function () {
216 this.tabPanelController().selectTab('BINDINGS');
217 },
218
219 //-------------------------------------------------------------------------
220
221 //'disableFaviconField': function () {
222 // this.tabPanelController().selectTab(null);
223 //},
224
225 'enableFaviconField': function () {
226 this.tabPanelController().selectTab('FAVICON');
227 },
228
229 //-------------------------------------------------------------------------
230
231 'enableDonePanel': function () {
232 this.tabPanelController().selectTab('DONE');
233 },
234
235 //=========================================================================
236
237 'shouldShowElementWhileRendering': function() {
238 return false;
239 },
240
241 //=========================================================================
242
243 'faviconComponent': function () {
244 if (this._faviconComponent == null) {
245 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')});
246 }
247
248 return this._faviconComponent;
249 },
250
251 //=========================================================================
252
253 'tabPanelController': function () {
254 if (this._tabPanelController == null) {
255 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
256 component:this,
257 configuration:this._tabPanelControllerConfiguration
258 });
259
260 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
261 }
262
263 return this._tabPanelController;
264 },
265
266 //-------------------------------------------------------------------------
267
268 'renderSelf': function() {
269 varbookmarkletComponent;
270
271 this.append(this.element(), {tag:'div', cls:'directLoginEditing', id:this.getId('panel'), children: [
272 // {tag:'div', cls:'back', children:[
273 // {tag:'a', href:'#', id:this.getId('back'), html:"&nbsp;"}
274 // ]},
275 {tag:'form', id:this.getId('form'), cls:'directLoginEditingForm', children:[
276 {tag:'div', cls:'title', children:[
277 {tag:'img', id:this.getId('favicon'), cls:'favicon'},
278 {tag:'input', type:'text', id:this.getId('label')}//,
279 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.LABEL.description')}]},
280 ]},
281 {tag:'div', cls:'tabContainer', children:[
282 {tag:'ul', cls:'tabs', children:[
283 {tag:'li', id:this.getId('labelTab'), children:[{tag:'span', html:"label"}]},
284 {tag:'li', id:this.getId('typeTab'), children:[{tag:'span', html:"type"}]},
285 {tag:'li', id:this.getId('configurationTab'),children:[{tag:'span', html:"configuration"}]},
286 {tag:'li', id:this.getId('bindingsTab'), children:[{tag:'span', html:"bindings"}]},
287 {tag:'li', id:this.getId('faviconTab'), children:[{tag:'span', html:"favicon"}]},
288 {tag:'li', id:this.getId('doneTab'), children:[{tag:'span', html:"done"}]}
289 ]},
290 {tag:'ul', cls:'tabPanels', children:[
291 {tag:'li', id:this.getId('labelTabpanel'), cls:'tabPanel label', children:[
292 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.LABEL.description')}]}
293 ]},
294 {tag:'li', id:this.getId('typeTabpanel'), cls:'tabPanel type', children:[
295 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.TYPE.description')}]},
296 {tag:'h2', html:"type"}
297 ]},
298 {tag:'li', id:this.getId('configurationTabpanel'), cls:'tabPanel configuration', children:[
299 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.CONFIGURATION.description')}]},
300 {tag:'div', cls:'bookmarkletConfigurationWrapper', children:[
301 {tag:'textarea', id:this.getId('bookmarkletConfiguration'), value:""},
302 // {tag:'div', cls:'bookmarkletComponentWrapper', children:[{tag:'div', id:this.getId('bookmarkletComponent'), cls:'bookmarkletComponent'}]}
303 {tag:'div', id:this.getId('bookmarkletComponent'), cls:'bookmarkletComponent'}
304 ]}
305 ]},
306 {tag:'li', id:this.getId('bindingsTabpanel'), cls:'tabPanel bindings', children:[
307 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.BINDINGS.description')}]},
308 {tag:'div', cls:'bindings', id:this.getId('bindings'), children:[]},
309 {tag:'div', cls:'formValues', id:this.getId('formValues'), children:[]}
310 ]},
311 {tag:'li', id:this.getId('faviconTabpanel'), cls:'tabPanel favicon', children:[
312 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.FAVICON.description')}]},
313 {tag:'div', cls:'favicon', children:[
314 {tag:'input', type:'text', id:this.getId('faviconURL')}
315 ]}
316 ]},
317 {tag:'li', id:this.getId('doneTabpanel'), cls:'tabPanel done', children:[
318 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', id:this.getId('doneDescription')/*, html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.DONE.description')*/}]}
319 ]}
320 ]}
321 ]}
322 ]},
323 {tag:'div', cls:'clear'}
324 ]});
325
326 bookmarkletComponent = new Clipperz.PM.UI.Web.Components.BookmarkletComponent({element:this.getElement('bookmarkletComponent')});
327 bookmarkletComponent.render();
328
329 this.tabPanelController().setup(/*{selected:this.initiallySelectedTab()}*/);
330
331 MochiKit.Signal.connect(this.getId('label'), 'onchange', this, 'changedValue');
332 MochiKit.Signal.connect(this.getId('label'), 'onkeyup', this, 'changedValue');
333
334 MochiKit.Signal.connect(this.getId('bookmarkletConfiguration'),'onchange', this, 'changedValue');
335 MochiKit.Signal.connect(this.getId('bookmarkletConfiguration'),'onkeyup', this, 'changedValue');
336
337 MochiKit.Signal.connect(this.getId('faviconURL'), 'onchange', this, 'changedValue');
338 MochiKit.Signal.connect(this.getId('faviconURL'), 'onkeyup', this, 'changedValue');
339
340 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown',this, 'handleKeyEvent');
341 },
342
343 //-------------------------------------------------------------------------
344
345 'handleTabSelected': function (aSelectedTab) {
346 switch (aSelectedTab) {
347 case 'DETAILS':
348 break;
349 case 'DIRECT_LOGINS':
350 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList'));
351 break;
352 case 'SHARING':
353 break;
354 }
355 },
356
357 //=========================================================================
358
359 'incrementUpdateFaviconCounter': function () {
360 this._updateFaviconCounter ++;
361 },
362
363 'decrementUpdateFaviconCounter': function () {
364 this._updateFaviconCounter --;
365 },
366
367 'updateFaviconCounter': function () {
368 return this._updateFaviconCounter;
369 },
370
371 //-------------------------------------------------------------------------
372
373 'updateFavicon': function () {
374 this.decrementUpdateFaviconCounter();
375
376 if (this.updateFaviconCounter() == 0) {
377 this.setFavicon(this.favicon());
378 }
379 },
380
381 //=========================================================================
382
383 'bindingComponents': function () {
384 return this._bindingComponents;
385 },
386
387 'clearAllBindingsComponents': function () {
388 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove'));
389 this._bindingComponents = [];
390 this.getElement('bindings').innerHTML = '';
391 },
392
393 'addBindingComponent': function (aBindingComponent) {
394 this.bindingComponents().push(aBindingComponent);
395 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'}));
396 },
397
398 //=========================================================================
399
400 'formValueComponents': function () {
401 return this._formValueComponents;
402 },
403
404 'clearAllFormValueComponents': function () {
405 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove'));
406 this._formValueComponents = [];
407 this.getElement('formValues').innerHTML = '';
408 },
409
410 'addFormValueComponent': function (aFormValueComponent) {
411 this.formValueComponents().push(aFormValueComponent);
412 aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'}));
413 },
414
415 //=========================================================================
416
417 'changedValue': function (anEvent) {
418 MochiKit.Signal.signal(this, 'changedValue', anEvent);
419
420 this.incrementUpdateFaviconCounter();
421 MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon'));
422 },
423
424 //-------------------------------------------------------------------------
425
426 'handleBackClick': function (anEvent) {
427 anEvent.preventDefault();
428
429 MochiKit.Signal.signal(this, 'back');
430 },
431
432 //=========================================================================
433
434 'bottomMargin': function () {
435 returnMochiKit.Style.getElementPosition(this.element().parentNode)['y'] +
436 MochiKit.Style.getElementDimensions(this.element())['h'];
437 },
438
439 //=========================================================================
440
441 'focusOnLabelElement': function () {
442 this.getElement('label').focus();
443 },
444
445 'focusOnBookmarkletConfigurationElement': function () {
446 this.getElement('bookmarkletConfiguration').focus();
447 },
448
449 'focusOnFaviconElement': function () {
450 this.getElement('faviconURL').focus();
451 },
452
453 //=========================================================================
454
455 'setDoneDescriptionWithKeys': function (someKeys) {
456 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', id:this.getId('doneDescription')/*, html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.DONE.description')*/}]}
457 this.getElement('doneDescription').innerHTML = Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.DONE.description', someKeys);
458 },
459
460 //=========================================================================
461
462 'handleKeyEvent': function (anEvent) {
463 MochiKit.Signal.signal(this, 'keyPressed', anEvent);
464/*
465 if (anEvent.key().string == 'KEY_ENTER') {
466 if (anEvent.target().nodeName != 'TEXTAREA') {
467 MochiKit.Signal.signal(this, 'moveForward');
468 anEvent.preventDefault();
469 }
470 } else if (anEvent.key().string == 'KEY_TAB') {
471 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
472 MochiKit.Signal.signal(this, 'moveForward');
473 anEvent.preventDefault();
474 }
475 }
476*/
477 },
478
479 //=========================================================================
480 __syntaxFix__: "syntax fix"
481});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
new file mode 100644
index 0000000..b91eb98
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
@@ -0,0 +1,179 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent.superclass.constructor.apply(this, arguments);
35
36 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._initialValue = args.initialValue || null;
39
40 return this;
41}
42
43//=============================================================================
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
46
47 //-------------------------------------------------------------------------
48
49 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent component";
51 },
52
53 //-------------------------------------------------------------------------
54
55 'formFieldName': function () {
56 return this._formFieldName;
57 },
58
59 //-------------------------------------------------------------------------
60
61 'fieldOptions': function () {
62 return this._fieldOptions;
63 },
64
65 'fieldType': function () {
66 return this.fieldOptions()['type'];
67 },
68
69 'optionValues': function () {
70 return MochiKit.Base.map(function (anOptionValue) {
71 return {
72 'label': anOptionValue['label'] || anOptionValue['value'],
73 'value': anOptionValue['value']
74 }
75 }, this.fieldOptions()['options']);
76 },
77
78 //-------------------------------------------------------------------------
79
80 'selectedValue': function () {
81 var result;
82
83 result = this.getElement('select').value;
84
85 if (result == '---') {
86 result = null;
87 }
88
89 return result;
90 },
91
92 'initialValue': function () {
93 return this._initialValue;
94 },
95
96 //=========================================================================
97
98 'renderSelf': function() {
99//console.log(">>> DirectLoginEditingFormValueComponent.renderSelf");
100//console.log("FIELD OPTIONS", this.fieldOptions());
101//console.log("OPTION VALUES", this.optionValues());
102 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'formValue', children:[
103 {tag:'span', cls:'formFieldName', html:this.formFieldName()},
104 {tag:'div', id:this.getId('values')}
105 ]});
106
107 if ((this.fieldType() == 'radio') || (this.fieldType() == 'select')) {
108 this.append(this.getElement('values'),
109 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
110 MochiKit.Base.flattenArguments(
111 // {tag:'option', value:'---', html:"---"},
112 MochiKit.Base.map(
113 MochiKit.Base.bind(function (aValue) { return {tag:'option', value:aValue['value'], html:aValue['label']}; }, this),
114 this.optionValues()
115 )
116 )
117 }
118 );
119
120 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
121
122 if (! MochiKit.Base.isUndefinedOrNull(this.initialValue())) {
123 var initiallySelectedOptions;
124 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initialValue() + ']']);
125 if (initiallySelectedOptions.length == 1) {
126 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
127 this.handleSelectChange();
128 } else {
129 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
130 }
131 } else {
132 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
133 }
134 } else if (this.fieldType() == 'checkbox') {
135 this.append(this.getElement('values'),
136 {tag:'input', type:'checkbox', name:this.formFieldName(), id:this.getId('checkbox'), cls:'formFieldMatchinCardField'}
137 );
138
139 MochiKit.Signal.connect(this.getElement('checkbox'), 'onchange', this, 'handleSelectChange');
140
141 if (this.initialValue()) {
142 MochiKit.DOM.updateNodeAttributes(this.getElement('checkbox'), {checked:true});
143 }
144 } else {
145 WTF = TODO;
146 }
147//console.log("<<< DirectLoginEditingFormValueComponent.renderSelf");
148 },
149
150 //=========================================================================
151
152 'handleSelectChange': function (anEvent) {
153//console.log("handleSelectChange", anEvent, anEvent.src(), anEvent.src().value);
154 var options;
155
156 options = {};
157
158 options['fieldName'] = this.formFieldName();
159
160 if (this.fieldType() == 'checkbox') {
161 options['selectedValue'] = (this.getElement('checkbox').checked ? 1 : null);
162 } else {
163 options['selectedValue'] = this.selectedValue();
164 }
165
166 MochiKit.Signal.signal(this, 'formValueChange', options);
167 },
168
169 //=========================================================================
170 __syntaxFix__: "syntax fix"
171});
172
173
174
175
176
177
178
179
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
new file mode 100644
index 0000000..1f49575
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
@@ -0,0 +1,271 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31//#############################################################################
32
33Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager = function(args) {
34 args = args || {};
35 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.constructor.call(this, args);
36
37 this._enterLeaveCounter = 0;
38 this._selectedRowObject = null;
39
40 return this;
41}
42
43//=============================================================================
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
46
47 'toString': function () {
48 return "Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager component";
49 },
50
51 //-------------------------------------------------------------------------
52
53 'renderHeader': function(aTRElement) {
54 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.renderHeader.call(this, aTRElement);
55
56 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, {tag:'div', cls:'DirectLoginListPopup', id:this.getId('DirectLoginListPopup'), children:[
57 {tag:'div', cls:'DirectLoginListPopup_body', children:[
58 {tag:'ul', id:this.getId('DirectLoginListPopup_list'), children:[
59 // {tag:'li', children:[
60 // {tag:'img', cls:'favicon', src:'http://www.microsoft.com/favicon.ico'},
61 // {tag:'a', href:'#', html:"Google Mail"}
62 // ]},
63 // ...
64 ]}
65 ]},
66 {tag:'div', cls:'DirectLoginListPopup_footer'}
67 ]});
68
69 MochiKit.Style.hideElement(this.getId('DirectLoginListPopup'));
70
71 //BEWARE: use MochiKit.Signal.connect instead of this.connectEvent, as the HEADER is NOT redrawn after each refresh
72 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseenter', this, 'handleDirectLoginListPopupEnter');
73 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseleave', this, 'handleDirectLoginListPopupLeave');
74 },
75
76 //-------------------------------------------------------------------------
77
78 'renderCell': function(aRowElement, anObject) {
79 var i,c;
80 var directLoginsInfo;
81
82 directLoginsInfo = anObject[this.name()];
83
84 TDElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:'card_directLogins'});
85
86 c = Math.min(2, directLoginsInfo.length);
87 for (i=0; i<c; i++) {
88 var elementID;
89
90 elementID = 'directLogin_' + directLoginsInfo[i]['_reference'];
91
92 Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin', children:[
93 {tag:'div', cls:'card_directLogin_body', children:[
94 {tag:'a', href:'#', id:elementID, html:directLoginsInfo[i]['label']}
95 ]}
96 ]});
97 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
98 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
99 }
100
101 if (directLoginsInfo.length > 2) {
102 var ellipsesElement;
103
104 ellipsesElement = Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin_ellipses', children:[
105 {tag:'div', cls:'card_directLogin_ellipses_body', children:[
106 {tag:'span', html:'&hellip;'}
107 ]}
108 ]});
109
110 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseenter', MochiKit.Base.method(this, 'handleEllipsesEnter', anObject));
111 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseleave', MochiKit.Base.method(this, 'handleEllipsesLeave'));
112 // MochiKit.Signal.connect(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
113 this.connectEvent(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
114 }
115 // MochiKit.Signal.connect(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
116 this.connectEvent(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
117
118 },
119
120 //=========================================================================
121/*
122 'handleEllipsesEnter': function (aRecordInfo, anEvent) {
123 this._enterLeaveCounter ++;
124 if (this._enterLeaveCounter > 2) {
125 this._enterLeaveCounter = 2;
126 }
127
128 if (this._enterLeaveCounter == 1) {
129 this.showDirectLoginListPopup(aRecordInfo, anEvent.src());
130 }
131 },
132
133 'handleEllipsesLeave': function (anEvent) {
134 this._enterLeaveCounter --;
135
136 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
137 if (this._enterLeaveCounter == 0) {
138 this.hideDirectLoginListPopup();
139 }
140 }, this))
141 },
142*/
143 //-------------------------------------------------------------------------
144
145 'handleTDEnter': function (aRecordInfo, anEvent) {
146 if (MochiKit.Selector.findChildElements(anEvent.src(), ['div.card_directLogin_ellipses']).length > 0) {
147 this._enterLeaveCounter ++;
148 if (this._enterLeaveCounter > 2) {
149 this._enterLeaveCounter = 2;
150 }
151
152 if (this._enterLeaveCounter == 1) {
153 this.showDirectLoginListPopup(aRecordInfo, anEvent.src());
154 }
155 } else {
156 if (this._selectedRowObject != null) {
157 this.hideDirectLoginListPopup();
158 }
159 }
160 },
161
162 'handleTDLeave': function (anEvent) {
163 this._enterLeaveCounter --;
164 if (this._enterLeaveCounter < 0) {
165 this._enterLeaveCounter = 0;
166 }
167
168 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
169 if (this._enterLeaveCounter == 0) {
170 this.hideDirectLoginListPopup();
171 }
172 }, this))
173 },
174
175 //-------------------------------------------------------------------------
176
177 'handleDirectLoginListPopupEnter': function (anEvent) {
178 this._enterLeaveCounter ++;
179 if (this._enterLeaveCounter > 2) {
180 this._enterLeaveCounter = 2;
181 }
182 },
183
184 'handleDirectLoginListPopupLeave': function (anEvent) {
185 this._enterLeaveCounter --;
186 if (this._enterLeaveCounter < 0) {
187 this._enterLeaveCounter = 0;
188 }
189
190 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
191 if (this._enterLeaveCounter == 0) {
192 this.hideDirectLoginListPopup();
193 }
194 }, this))
195 },
196
197 //=========================================================================
198
199 'showDirectLoginListPopup': function (aRecordInfo, anElement) {
200 var position;
201 var directLoginsInfo;
202 var directLoginsListElement;
203 var ellipsesElement;
204
205
206 ellipsesElement = MochiKit.Selector.findChildElements(anElement, ['div.card_directLogin_ellipses'])[0];
207 position = MochiKit.Style.getElementPosition(ellipsesElement);
208 // position = MochiKit.Style.getElementPosition(anElement);
209 position.x += 14;
210 position.y -= 26;
211
212 MochiKit.Style.setElementPosition(this.getId('DirectLoginListPopup'), position /*[, units='px'] */);
213
214 directLoginsListElement = this.getElement('DirectLoginListPopup_list');
215 directLoginsListElement.innerHTML = '';
216
217 directLoginsInfo = aRecordInfo[this.name()];
218 c = directLoginsInfo.length;
219 for (i=0; i<c; i++) {
220 varelementID;
221 varlabel;
222 var trunkedLabel;
223
224 label = directLoginsInfo[i]['label'];
225 trunkedLabel = (label.length > 20 ? label.slice(0,20) + '&hellip;' : label);
226
227 elementID = this.getId('directLoginList_' + directLoginsInfo[i]['_reference']);
228
229 Clipperz.DOM.Helper.append(directLoginsListElement, {tag:'li', children:[
230 {tag:'div', children:[
231 {tag:'img', cls:'favicon', src:directLoginsInfo[i]['favicon']},
232 (label == trunkedLabel ? {tag:'a', href:'#', id:elementID, html:trunkedLabel} : {tag:'a', href:'#', id:elementID, title:label, html:trunkedLabel})
233 ]}
234 ]});
235
236 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
237 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
238 }
239
240 // MochiKit.Style.showElement(this.getId('DirectLoginListPopup'));
241 MochiKit.Visual.appear(this.getId('DirectLoginListPopup'), {duration:0.5});
242 MochiKit.Signal.signal(this, 'selectRow', aRecordInfo);
243
244 this._selectedRowObject = aRecordInfo;
245 },
246
247 //-------------------------------------------------------------------------
248
249 'hideDirectLoginListPopup': function () {
250 if (this._selectedRowObject != null) {
251 MochiKit.Signal.signal(this, 'unselectRow', this._selectedRowObject);
252 MochiKit.Visual.fade(this.getId('DirectLoginListPopup'), {duration:0.5});
253 this._selectedRowObject = null;
254 this._enterLeaveCounter = 0;
255 }
256 },
257
258 //=========================================================================
259
260 'handleDirectLoginClick': function (aDirectLogin, anEvent) {
261 anEvent.preventDefault();
262 // aDirectLogin.runDirectLogin();
263 Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin(aDirectLogin);
264 },
265
266 //-------------------------------------------------------------------------
267
268 '__syntax_fix__' : 'syntax fix'
269
270});
271
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
new file mode 100644
index 0000000..19d1635
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
@@ -0,0 +1,89 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31//#############################################################################
32
33Clipperz.PM.UI.Web.Components.FaviconColumnManager = function(args) {
34 args = args || {};
35 Clipperz.PM.UI.Web.Components.FaviconColumnManager.superclass.constructor.call(this, args);
36
37 return this;
38}
39
40//=============================================================================
41
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.FaviconColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43
44 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.FaviconColumnManager component";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'renderCell': function(aRowElement, anObject) {
51 varfaviconImageElement;
52 var faviconUrl;
53
54 faviconImageElement = this.getId('favicon');
55 faviconUrl = anObject[this.name()];
56
57 if (faviconUrl == null) {
58 faviconUrl = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
59 }
60
61 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
62 {tag:'img', id:faviconImageElement, src:faviconUrl}
63 ]});
64
65 MochiKit.Signal.connect(faviconImageElement, 'onload', this, 'handleLoadedFaviconImage');
66 MochiKit.Signal.connect(faviconImageElement, 'onerror', this, 'handleMissingFaviconImage');
67 MochiKit.Signal.connect(faviconImageElement, 'onabort', this, 'handleMissingFaviconImage');
68 },
69
70 //-----------------------------------------------------
71
72 'handleLoadedFaviconImage': function(anEvent) {
73 MochiKit.Signal.disconnectAllTo(anEvent.src());
74 if (anEvent.src().complete == false) {
75 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
76 }
77 },
78
79 //-----------------------------------------------------
80
81 'handleMissingFaviconImage': function(anEvent) {
82 MochiKit.Signal.disconnectAllTo(anEvent.src());
83 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
84 },
85
86 //-----------------------------------------------------
87 '__syntax_fix__' : 'syntax fix'
88});
89
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
new file mode 100644
index 0000000..8b3e6c9
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
@@ -0,0 +1,262 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.GridComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.GridComponent.superclass.constructor.apply(this, arguments);
35
36 this._columnsManagers = args.columnsManagers;
37
38 this._rowsObjects = [];
39 this._noRowsGridComponent = null;
40
41 this._slots = {
42 'headerSlot':this.getId('headerSlot')
43 };
44
45 return this;
46}
47
48//=============================================================================
49
50Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.GridComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
51
52 //-------------------------------------------------------------------------
53
54 'toString': function () {
55 return "Clipperz.PM.UI.Web.Components.GridComponent component";
56 },
57
58 //-------------------------------------------------------------------------
59
60 'rows': function () {
61 throw Clipperz.Base.exception.AbstractMethod;
62 // return this._rows;
63 },
64
65 //-------------------------------------------------------------------------
66
67 'columnsManagers': function () {
68 return this._columnsManagers;
69 },
70
71 //-------------------------------------------------------------------------
72
73 'renderSelf': function(/*aContainer, aPosition*/) {
74 this.append(this.element(), [
75 {tag:'div', cls:'header', children:[
76 {tag:'form', id:this.getId('searchForm'), cls:'search', children:[
77 {tag:'div', cls:'search', children:[
78 {tag:'input', type:'text', id:this.getId('search'), cls:'search', placeholder:"search", name:'textToSearch'/*, value:"clipperz"*/}
79 ]},
80 {tag:'div', cls:'clearSearchButton', id:this.getId('clearSearch')},
81 // {tag:'input', type:'button', cls:'searchButton', name:'searchButton', value:"search"},
82 {tag:'div', cls:'headerSlot', id:this.getId('headerSlot')}
83 ]}
84 ]},
85 {tag:'div', cls:'body', children:[
86 {tag:'div', cls:'rows', id:this.getId('rows'), children:[
87 {tag:'table', cellpadding:'0', cellspacing:'0', cls:'rows', children:[
88 {tag:'thead', children:[
89 {tag:'tr', id:this.getId('thead_tr'), children:[]}
90 ]},
91 {tag:'tbody', id:this.getId('gridRows'), children:[]}
92 ]}
93 ]},
94 {tag:'div', cls:'noRowsBlock', id:this.getId('noRowsBlock'), children:[]}
95 ]},
96 {tag:'div', cls:'footer'}
97 ]);
98
99 this.renderHeader();
100 MochiKit.Signal.connect(this.getId('clearSearch'), 'onclick', this, 'clearSearchHandler');
101 },
102
103 //-------------------------------------------------------------------------
104
105 'renderHeader': function () {
106 var headerElement;
107
108 headerElement = this.getElement('thead_tr');
109 headerElement.innerHTML = "";
110
111 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
112 aColumnManager.renderHeader(headerElement);
113 });
114 },
115
116 //-------------------------------------------------------------------------
117
118 'update': function (someObjects) {
119 this._rowsObjects = someObjects
120 this.refresh();
121 this.focus();
122 },
123
124 'focus': function () {
125 this.getElement('search').focus();
126 },
127
128 //-------------------------------------------------------------------------
129
130 'startSearch': function () {
131//console.log("--> startSearch");
132 MochiKit.DOM.addElementClass(this.getElement('search'), 'running');
133 },
134
135 'endSearch': function () {
136 MochiKit.DOM.removeElementClass(this.getElement('search'), 'running');
137//console.log("<-- startSearch");
138 },
139
140 //-------------------------------------------------------------------------
141
142 'disconnectColumnManagersRowsSignals': function () {
143 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
144 aColumnManager.disconnectRowsSignals();
145 });
146 },
147
148 //-------------------------------------------------------------------------
149
150 'refresh': function () {
151 var gridRowsElement;
152 var rowClass;
153
154 this.disconnectColumnManagersRowsSignals();
155
156 {
157 MochiKit.DOM.removeElementClass(this.getElement('search'), 'disabled');
158 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', null);
159 MochiKit.DOM.removeElementClass(this.element(), 'empty');
160 MochiKit.DOM.removeElementClass(this.element(), 'noRows');
161 }
162
163
164 gridRowsElement = this.getElement('gridRows');
165 gridRowsElement.innerHTML = "";
166
167 MochiKit.DOM.removeElementClass(this.element(), 'empty');
168
169 rowClass = 'odd';
170 MochiKit.Iter.forEach(this._rowsObjects, MochiKit.Base.bind(function (aRowObject) {
171 var cardRowElement;
172
173 cardRowElement = this.append(gridRowsElement, {tag:'tr', id:this.getId(aRowObject['_reference']), cls:rowClass});
174 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
175 aColumnManager.renderCell(cardRowElement, aRowObject);
176 });
177
178 rowClass = (rowClass == 'odd') ? 'even' : 'odd';
179 }, this));
180 },
181
182 //-----------------------------------------------------------------------------
183
184 'filterElement': function () {
185 return this.getElement('search');
186 },
187
188 //-------------------------------------------------------------------------
189
190 'shouldShowElementWhileRendering': function () {
191 return false;
192 },
193
194 //-------------------------------------------------------------------------
195
196 'selectRow': function (aRowObject) {
197 MochiKit.DOM.addElementClass(this.getId(aRowObject['_reference']), 'selected');
198 },
199
200 'unselectRow': function (aRowObject) {
201 MochiKit.DOM.removeElementClass(this.getId(aRowObject['_reference']), 'selected');
202 },
203
204 //-------------------------------------------------------------------------
205 /*
206 'passOpenDirectLogin': function(aDirectLoginReferenceId) {
207 MochiKit.Signal.signal(this, 'openDirectLogin', aDirectLoginReferenceId);
208 },
209 */
210 //-------------------------------------------------------------------------
211
212 'clearSearchHandler': function (anEvent) {
213 var searchElement;
214
215 anEvent.preventDefault();
216
217 searchElement = this.getElement('search');
218 searchElement.value = "";
219 searchElement.focus();
220 },
221
222 //-------------------------------------------------------------------------
223
224 'drawEmpty': function () {
225 this.disconnectColumnManagersRowsSignals();
226 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled');
227 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled');
228
229 gridRowsElement = this.getElement('gridRows');
230 gridRowsElement.innerHTML = "";
231 MochiKit.DOM.addElementClass(this.element(), 'empty');
232 },
233
234 //-------------------------------------------------------------------------
235
236 'setNoRowsGridComponent': function (aComponent) {
237 this.removeNoRowsGridComponent();
238 this._noRowsGridComponent = aComponent;
239
240 this.disconnectColumnManagersRowsSignals();
241 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled');
242 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled');
243
244 gridRowsElement = this.getElement('gridRows');
245 gridRowsElement.innerHTML = "";
246 MochiKit.DOM.addElementClass(this.element(), 'noRows');
247
248 if (aComponent != null) {
249 aComponent.renderInNode(this.getElement('noRowsBlock'));
250 }
251 },
252
253 'removeNoRowsGridComponent': function () {
254 if (this._noRowsGridComponent != null) {
255 this._noRowsGridComponent.remove();
256 this._noRowsGridComponent = null;
257 }
258 },
259
260 //-------------------------------------------------------------------------
261 __syntaxFix__: "syntax fix"
262});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
new file mode 100644
index 0000000..07b8dcc
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
@@ -0,0 +1,68 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31//#############################################################################
32
33Clipperz.PM.UI.Web.Components.ImageColumnManager = function(args) {
34 args = args || {};
35 Clipperz.PM.UI.Web.Components.ImageColumnManager.superclass.constructor.call(this, args);
36
37 return this;
38}
39
40//=============================================================================
41
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ImageColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43
44 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.ImageColumnManager component";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'renderCell': function(aRowElement, anObject) {
51 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
52 {tag:'img', src:anObject[this.name()]}
53 ]});
54
55 // return Clipperz.Async.callbacks("ImageColumnManager.renderCell", [
56 // this.selector(),
57 // MochiKit.Base.bind(function (aValue) {
58 // Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
59 // {tag:'img', src:aValue}
60 // ]});
61 // }, this)
62 // ], {trace:false}, anObject);
63 },
64
65 //-----------------------------------------------------
66 '__syntax_fix__' : 'syntax fix'
67});
68
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
new file mode 100644
index 0000000..e833190
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
@@ -0,0 +1,92 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31//#############################################################################
32
33Clipperz.PM.UI.Web.Components.LinkColumnManager = function(args) {
34 args = args || {};
35 Clipperz.PM.UI.Web.Components.LinkColumnManager.superclass.constructor.call(this, args);
36
37 this._actionMethod = args.actionMethod || null;
38
39 return this;
40}
41
42//=============================================================================
43
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LinkColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
45
46 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
48 },
49
50 //-------------------------------------------------------------------------
51
52 'actionMethod': function () {
53 return this._actionMethod;
54 },
55
56 //-------------------------------------------------------------------------
57
58 'renderCell': function(aRowElement, anObject) {
59 vartdElement;
60 varlinkElement;
61
62 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
63 {tag:'span', children:[
64 {tag:'a', href:'#', html:anObject[this.name()]}
65 ]}
66 ]});
67
68 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
69 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
70 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
71 },
72
73 //-----------------------------------------------------
74
75 'handleLinkClick': function (anObject, anEvent) {
76 anEvent.preventDefault();
77
78 if (this.actionMethod() != null) {
79 var deferredResult;
80
81 deferredResult = new Clipperz.Async.Deferred("LinkColumnManager.handleLinkClick", {trace:false});
82 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'selectRow', anObject);
83 deferredResult.addCallback(this.actionMethod(), anObject, anEvent);
84 // deferredResult.addBothPass(MochiKit.Signal.signal, this, 'unselectRow', anObject);
85 deferredResult.callback();
86 }
87 },
88
89 //-----------------------------------------------------
90 '__syntax_fix__' : 'syntax fix'
91});
92
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
new file mode 100644
index 0000000..de20853
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
@@ -0,0 +1,203 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.LoginForm = function(args) {
32 args = args || {};
33
34 this._autocomplete = args.autocomplete || 'off';
35
36 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments);
37
38 this._slots = {
39 'passphraseEntropy':this.getId('passphraseEntropy')
40 };
41
42 return this;
43}
44
45//=============================================================================
46
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
48
49 //-------------------------------------------------------------------------
50
51 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.LoginForm component";
53 },
54
55 'autocomplete': function () {
56 return this._autocomplete;
57 },
58
59 //-------------------------------------------------------------------------
60
61 'renderSelf': function() {
62 this.append(this.element(), {tag:'div', id:'loginBox', children:[
63 {tag:'div', cls:'header'},
64 {tag:'div', cls:'body', id:this.getId('body'), children:[
65 {tag:'div', id:this.getId('loginForm'), children:[
66 {tag:'div', children:[
67 {tag:'h4', html:'Login'},
68 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[
69 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[
70 {tag:'label', html:'username', 'for':this.getId('usernameField')},
71 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'/*, value:'joe'*/},
72 {tag:'ul', id:this.getId('passwordOptions'), children:[
73 {tag:'li', id:this.getId('passphraseOption'), children:[
74 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')},
75 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'/*, value:'clipperz'*/}
76 ]} //,
77/*
78 {tag:'li', id:this.getId('otpOption'), children:[
79 {tag:'label', html:'one-time password', 'for':this.getId('otpField_1')},
80 {tag:'input', id:this.getId('otpField_1'), type:'text', cls:'otp', value:'abcd-efgh'},
81 {tag:'input', id:this.getId('otpField_2'), type:'text', cls:'otp', value:'abcd-efgh'},
82 {tag:'input', id:this.getId('otpField_3'), type:'text', cls:'otp', value:'abcd-efgh'},
83 {tag:'input', id:this.getId('otpField_4'), type:'text', cls:'otp', value:'abcd-efgh'}
84 ]}
85*/
86 ]},
87 // {tag:'input', id:this.getId('otpCheckbox'), type:'checkbox', cls:'checkbox'},
88 // {tag:'label', html:'use a one-time passphrase', 'for':this.getId('otpCheckbox'), cls:'checkbox'},
89
90 {tag:'div', cls:'translations', children:[
91 {tag:'h4', html:'choose your language'},
92 {tag:'ul', children:[
93 {tag:'li', cls:'selected', html:'english'},
94 {tag:'li', html:'italiano'},
95 {tag:'li', html:'dutch'},
96 {tag:'li', html:'french'},
97 {tag:'li', html:'spanish'},
98 {tag:'li', html:'chinese'},
99 {tag:'li', html:'japanese'},
100 {tag:'li', html:'portugal'},
101 {tag:'li', html:'arabic'}
102 ]}
103 ]},
104
105 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'}
106 ]}
107 ]}
108 ]}
109 ]},
110 {tag:'div', cls:'footer'}
111 ]});
112
113 if (this.autocomplete() == 'off') {
114 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'});
115 }
116
117 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"})
118
119 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField')));
120
121 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields');
122 // this.showPassphraseField();
123
124 this.getElement('usernameField').focus();
125
126 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler');
127 },
128
129 //-----------------------------------------------------------------------------
130/*
131 'togglePasswordFields': function(anEvent) {
132 var shouldUseOTP;
133
134 shouldUseOTP = this.getElement('otpCheckbox').checked;
135
136 if (shouldUseOTP == false) {
137 this.showPassphraseField();
138 } else {
139 this.showOTPFields();
140 }
141 },
142*/
143 //-----------------------------------------------------------------------------
144/*
145 'showPassphraseField': function() {
146 this.showElement('passphraseOption');
147 this.hideElement('otpOption');
148 },
149*/
150 //-----------------------------------------------------------------------------
151
152 'focusOnPassphraseField': function () {
153 this.getElement('passphraseField').focus();
154 this.getElement('passphraseField').select();
155 },
156
157 //-----------------------------------------------------------------------------
158/*
159 'showOTPFields': function() {
160 this.hideElement('passphraseOption');
161 this.showElement('otpOption');
162 },
163*/
164 //-------------------------------------------------------------------------
165
166 'loginEventHandler': function(anEvent) {
167 varusername;
168 var passphrase;
169 // var shouldUseOTP;
170 // var otp;
171 var signalArguments;
172
173 anEvent.preventDefault();
174
175 username = this.getElement('usernameField').value;
176 passphrase = this.getElement('passphraseField').value;
177 // otp =this.getElement('otpField_1').value +
178 // this.getElement('otpField_2').value +
179 // this.getElement('otpField_3').value +
180 // this.getElement('otpField_4').value;
181 // shouldUseOTP = this.getElement('otpCheckbox').checked;
182
183 signalArguments = {username:username};
184
185 // if (shouldUseOTP) {
186 // signalArguments.otp = otp;
187 // } else {
188 signalArguments.passphrase = passphrase;
189 // }
190
191 MochiKit.Signal.signal(this, 'doLogin', signalArguments);
192 },
193
194 //-------------------------------------------------------------------------
195
196 'submitButtonElement': function() {
197 return this.getElement('submitButton');
198 },
199
200 //-------------------------------------------------------------------------
201
202 __syntaxFix__: "syntax fix"
203});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
new file mode 100644
index 0000000..49c030d
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
@@ -0,0 +1,206 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.LoginPage = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.LoginPage.superclass.constructor.apply(this, arguments);
35
36 this._slots = {
37 'loginForm':this.getId('loginBoxSlot')
38 };
39
40 return this;
41}
42
43//=============================================================================
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
46
47 //-------------------------------------------------------------------------
48
49 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.LoginPage component";
51 },
52
53 //-------------------------------------------------------------------------
54
55 'renderSelf': function(/*aContainer, aPosition*/) {
56 this.append(this.element(), [
57 {tag:'div', id:this.getId('loginBoxSlot')},
58 {tag:'div', id:'main', children:[
59 {tag:'div', id:'featurePoints', children:[
60 {tag:'table', children:[
61 {tag:'tr', children:[
62 {tag:'td', children:[
63 {tag:'div', cls:'block', children:[
64 {tag:'h3', html:'Clipperz is:'},
65 {tag:'ul', children:[
66 {tag:'li', html:'a secure and simple password manager'},
67 {tag:'li', html:'an effective single sign-on solution'},
68 {tag:'li', html:'a digital vault for your personal data'}
69 ]}
70 ]},
71 {tag:'div', cls:'block', children:[
72 {tag:'h3', html:'Clipperz benefits:'},
73 {tag:'ul', children:[
74 {tag:'li', html:'free and completely anonymous'},
75 {tag:'li', html:'access it any time from any computer'},
76 {tag:'li', html:'no software to download and nothing to install'},
77 {tag:'li', html:'avoid keeping secrets on your PC or on paper'}
78 ]}
79 ]}
80 ]}, {tag:'td', children:[
81 {tag:'div', cls:'block', children:[
82 {tag:'h3', html:'Clipperz security:'},
83 {tag:'ul', children:[
84 {tag:'li', html:'your secretes are locally encrypted by your browser before being uploaded to Clipperz'},
85 {tag:'li', html:'the encryption key is a passphrase known only to you'},
86 {tag:'li', html:'Clipperz hosts your sensitive data in an encrypted form and could never access the data in its plain form'},
87 {tag:'li', html:'Clipperz is built upon standard encryption schemes, nothing fancies of homemade'},
88 {tag:'li', html:'you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!'}
89 ]}
90 ]}
91 ]}
92 ]}
93 ]}
94 ]},
95 {tag:'div', cls:'activeFeatures', children:[
96 {tag:'div', id:this.getId('registerButton'), cls:'createAccountLink', children:[
97 {tag:'canvas', id:this.getId('registerButtonIcon')},
98 {tag:'a', href:'#', id:this.getId('createAccountLink'), cls:'createAccountLink', children:[
99 {tag:'span', cls:'payoff', html:"Free sign up!"},
100 {tag:'span', cls:'link', html:"Create account >>"}
101 ]}
102 ]},
103 {tag:'div', cls:'keepTogether', children:[
104 {tag:'div', id:this.getId('screenshotLink'), cls:'screenshotLink', children:[
105 {tag:'canvas', id:this.getId('lookIcon')},
106 {tag:'a', href:'#', cls:'screenshotLink', children:[
107 {tag:'span', cls:'payoff', html:"Look Clipperz!"},
108 {tag:'span', cls:'link', html:"screenshot tour >>"}
109 ]}
110 ]},
111 {tag:'div', id:this.getId('offlineLink'), cls:'offlineLink', children:[
112 {tag:'canvas', id:this.getId('downloadIcon')},
113 {tag:'a', href:'#', cls:'offlineLink', children:[
114 {tag:'span', cls:'payoff', html:"Download!"},
115 {tag:'span', cls:'link', html:"Offline version >>"}
116 ]}
117 ]}
118 ]}
119 ]}
120 ]}
121 ]);
122
123 this.setRegistrationButtonIconDefaultColors();
124 this.setLookIconDefaultColors();
125 this.setDownloadIconDefaultColors();
126
127 // MochiKit.Signal.connect(this.getElement('createAccountLink'), 'onclick', this, 'handleCreateAccountLink')
128
129 MochiKit.Signal.connect(this.getElement('registerButton'), 'onmouseenter', this, 'handleMouseEnterOnRegisterButtonIcon');
130 MochiKit.Signal.connect(this.getElement('registerButton'), 'onmouseleave', this, 'handleMouseLeaveOnRegisterButtonIcon');
131
132 MochiKit.Signal.connect(this.getElement('screenshotLink'), 'onmouseenter', this, 'handleMouseEnterOnLookIcon');
133 MochiKit.Signal.connect(this.getElement('screenshotLink'), 'onmouseleave', this, 'handleMouseLeaveOnLookIcon');
134
135 MochiKit.Signal.connect(this.getElement('offlineLink'), 'onmouseenter', this, 'handleMouseEnterOnDownloadIcon');
136 MochiKit.Signal.connect(this.getElement('offlineLink'), 'onmouseleave', this, 'handleMouseLeaveOnDownloadIcon');
137
138 MochiKit.Signal.connect(this.getElement('createAccountLink'), 'onclick', this, 'handleCreateAccountLink')
139 },
140
141 //-------------------------------------------------------------------------
142
143 'setRegistrationButtonIconDefaultColors': function () {
144 Clipperz.PM.UI.Canvas.registerButton.normal(this.getElement('registerButtonIcon'), "#eeeeee", "#eeeeee", "#ecab12", "#e14624", "#ffffff");
145 },
146
147 'setRegistrationButtonIconHoverColors': function () {
148 Clipperz.PM.UI.Canvas.registerButton.normal(this.getElement('registerButtonIcon'), "#cccccc", "#999999", "#ffb710", "#ff4d27", "#ffffff");
149 },
150
151 'handleMouseEnterOnRegisterButtonIcon': function (anEvent) {
152 this.setRegistrationButtonIconHoverColors();
153 },
154
155 'handleMouseLeaveOnRegisterButtonIcon': function (anEvent) {
156 this.setRegistrationButtonIconDefaultColors();
157 },
158
159 //-------------------------------------------------------------------------
160
161 'setLookIconDefaultColors': function () {
162 Clipperz.PM.UI.Canvas.coverActions.look(this.getElement('lookIcon'), "#7e7e7e", "#ffffff", 1);
163 },
164
165 'setLookIconHoverColors': function () {
166 Clipperz.PM.UI.Canvas.coverActions.look(this.getElement('lookIcon'), "#666666", "#ffffff", 2);
167 },
168
169 'handleMouseEnterOnLookIcon': function (anEvent) {
170 this.setLookIconHoverColors();
171 },
172
173 'handleMouseLeaveOnLookIcon': function (anEvent) {
174 this.setLookIconDefaultColors();
175 },
176
177 //-------------------------------------------------------------------------
178
179 'setDownloadIconDefaultColors': function () {
180 Clipperz.PM.UI.Canvas.coverActions.download(this.getElement('downloadIcon'), "#7e7e7e", "#ffffff", 1);
181 },
182
183 'setDownloadIconHoverColors': function () {
184 Clipperz.PM.UI.Canvas.coverActions.download(this.getElement('downloadIcon'), "#666666", "#ffffff", 2);
185 },
186
187 'handleMouseEnterOnDownloadIcon': function (anEvent) {
188 this.setDownloadIconHoverColors();
189 },
190
191 'handleMouseLeaveOnDownloadIcon': function (anEvent) {
192 this.setDownloadIconDefaultColors();
193 },
194
195 //-------------------------------------------------------------------------
196
197 'handleCreateAccountLink': function (anEvent) {
198 anEvent.preventDefault();
199
200 MochiKit.Signal.signal(this, 'createNewAccountClick', anEvent.src());
201 },
202
203 //-------------------------------------------------------------------------
204
205 __syntaxFix__: "syntax fix"
206});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
new file mode 100644
index 0000000..03c7b9e
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
@@ -0,0 +1,155 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.LoginProgress = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments);
35
36 this._deferred = null;
37
38 return this;
39}
40
41//=============================================================================
42
43Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, {
44
45 //-------------------------------------------------------------------------
46
47 'toString': function () {
48 return "Clipperz.PM.UI.Web.Components.LoginProgress component";
49 },
50
51 //-------------------------------------------------------------------------
52
53 'deferred': function() {
54 return this._deferred;
55 },
56
57 'setDeferred': function(aValue) {
58 this._deferred = aValue;
59 },
60
61 //-------------------------------------------------------------------------
62
63 'renderSelf': function() {
64 // var loginProgressElement;
65 //
66 // loginProgressElement = MochiKit.DOM.getElement('loginProgress');
67 //
68 // if (loginProgressElement == null) {
69 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true);
70 // }
71
72//console.log(">> LoginProgress.renderSelf", this.element());
73 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [
74 // this.append(loginProgressElement, [
75 {tag:'div', cls:'header', children:[
76 {tag:'h3', id:this.getId('title'), html:"login progress"}
77 ]},
78 {tag:'div', cls:'body', children:[
79 {tag:'div', id:this.getId('progressBar')},
80 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[
81 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]},
82 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]},
83 {tag:'p', html:"Login failed"}
84 ]}
85 ]},
86 {tag:'div', cls:'footer', children:[
87 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[
88 {tag:'div', cls:'button', id:this.getId('button'), children:[
89 {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"}
90 ]}
91 ]}
92 ]}
93 ]});
94 // ]);
95
96 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff");
97
98 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
99 MochiKit.Style.hideElement(this.getElement('errorBox'));
100
101 MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler');
102 },
103
104 //-------------------------------------------------------------------------
105
106 'displayElement': function() {
107 return MochiKit.DOM.getElement('loginProgress');
108 },
109
110 //-------------------------------------------------------------------------
111
112 'cancelEventHandler': function(anEvent) {
113 anEvent.preventDefault();
114
115 MochiKit.Signal.signal(this, 'cancelEvent');
116 },
117
118 //-------------------------------------------------------------------------
119
120 'disableCancel': function() {
121 MochiKit.Style.hideElement(this.getElement('buttonArea'));
122 },
123
124 //-------------------------------------------------------------------------
125
126 'showErrorMessage': function() {
127 this.getElement('buttonLink').innerHTML = "close";
128
129 MochiKit.Style.hideElement(this.getElement('progressBar'));
130
131 this.getElement('title').innerHTML = "Error";
132 MochiKit.Style.showElement(this.getElement('errorBox'));
133 MochiKit.Style.showElement(this.getElement('buttonArea'));
134 },
135
136 //-------------------------------------------------------------------------
137
138 'deferredHideModalAndRemove': function(someParameters, aResult) {
139 vardeferredResult;
140
141 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false});
142 deferredResult.addMethod(this, 'deferredHideModal');
143 deferredResult.addMethod(this, 'remove');
144 deferredResult.addCallback(function () {
145 return aResult;
146 });
147 deferredResult.callback(someParameters);
148
149 return deferredResult;
150 },
151
152 //-------------------------------------------------------------------------
153
154 __syntaxFix__: "syntax fix"
155});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
new file mode 100644
index 0000000..b40d1f3
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
@@ -0,0 +1,430 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments);
35
36 this._tabPanelController = null;
37
38 this._initiallySelectedTab = args.selected || 'CREDENTIALS';
39 this._tabPanelControllerConfiguration = {
40 'CREDENTIALS': {
41 tab:'credentialsTab',
42 panel:'credentialsTabpanel'
43 },
44 'CHECK_CREDENTIALS': {
45 tab:'checkCredentialsTab',
46 panel:'checkCredentialsTabpanel'
47 },
48 'TERMS_OF_SERVICE': {
49 tab:'termsOfServiceTab',
50 panel:'termsOfServiceTabpanel'
51 },
52 'CREATE_USER': {
53 tab:'createUserTab',
54 panel:'createUserTabpanel'
55 }//,
56/*
57 'LOGIN': {
58 tab:'loginTab',
59 panel:'loginTabpanel'
60 }
61*/
62 };
63
64 return this;
65}
66
67//=============================================================================
68
69Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
70
71 //-------------------------------------------------------------------------
72
73 'toString': function () {
74 return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component";
75 },
76
77 //=========================================================================
78
79 'disableAllPanels': function () {
80 this.tabPanelController().selectTab(null);
81 },
82
83 //-------------------------------------------------------------------------
84
85 'enableCredentialsPanel': function () {
86 this.tabPanelController().selectTab('CREDENTIALS');
87 },
88
89 'enableCheckCredentialsPanel': function () {
90 this.tabPanelController().selectTab('CHECK_CREDENTIALS');
91 },
92
93 'enableTermsOfServicePanel': function () {
94 this.tabPanelController().selectTab('TERMS_OF_SERVICE');
95 },
96
97 'enableCreateUserPanel': function () {
98 this.tabPanelController().selectTab('CREATE_USER');
99 },
100
101 //'enableLoginPanel': function () {
102 // this.tabPanelController().selectTab('LOGIN');
103 //},
104
105 //=========================================================================
106
107 'shouldShowElementWhileRendering': function() {
108 return false;
109 },
110
111 //=========================================================================
112
113 'tabPanelController': function () {
114 if (this._tabPanelController == null) {
115 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
116 component:this,
117 configuration:this._tabPanelControllerConfiguration
118 });
119
120 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
121 }
122
123 return this._tabPanelController;
124 },
125
126 //-------------------------------------------------------------------------
127
128 'renderSelf': function() {
129//console.log('** Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
130
131 this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [
132 {tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[
133 {tag:'div', cls:'header', children:[
134 {tag:'div', cls:'title', children:[
135 {tag:'h3', id:this.getId('title'), html:"Create new user"}
136 ]}
137 ]},
138 {tag:'div', id:this.getId('body'), cls:'body', children:[
139 {tag:'div', cls:'tabContainer', children:[
140 {tag:'ul', cls:'tabs', children:[
141 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]},
142 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]},
143 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]},
144 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//,
145 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]},
146 ]},
147 {tag:'ul', cls:'tabPanels', children:[
148 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[
149 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]},
150 {tag:'ul', cls:'credentials', children:[
151 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]},
152 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]}
153 ]}
154 ]},
155 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[
156 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]},
157 {tag:'ul', cls:'credentials', children:[
158 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]}
159 ]}
160 ]},
161 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[
162 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]},
163 {tag:'ul', cls:'termsOfService', children:[
164 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('awareOfUnrecoverablePassphrase')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('awareOfUnrecoverablePassphrase'), html:"I understand that Clipperz will not be able to recover a lost passphrase."}]},
165 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>."}]}
166 ]}
167 ]},
168 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[
169 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]},
170 {tag:'ul', cls:'createUserStates', children:[
171 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]},
172 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]},
173 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]}
174 ]}
175 ]}//,
176 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[
177 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]},
178 // ]}
179 ]}
180 ]}
181 ]},
182 {tag:'div', id:this.getId('footer'), cls:'footer', children:[
183 {tag:'div', cls:'buttonArea', children:[
184 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
185 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
186 ]}
187 ]}
188 ]},
189 {tag:'div', cls:'clear'}
190 ]});
191
192 this.tabPanelController().setup();
193 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent');
194 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent');
195 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
196 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
197 },
198
199 //-------------------------------------------------------------------------
200/*
201 'resetContent': function () {
202 this.getElement('username').value = '';
203 this.getElement('passphrase').value = '';
204 },
205*/
206 //-------------------------------------------------------------------------
207
208 'displayElement': function() {
209 return this.getElement('panel');
210 },
211
212 //-------------------------------------------------------------------------
213
214 'handleTabSelected': function (aSelectedTab) {
215/*
216 switch (aSelectedTab) {
217 case 'DETAILS':
218 break;
219 case 'DIRECT_LOGINS':
220 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList'));
221 break;
222 case 'SHARING':
223 break;
224 }
225*/
226 },
227
228 //=========================================================================
229
230 'username': function () {
231 return this.getElement('username').value;
232 },
233
234 'usernameElement': function () {
235 return this.getElement('username');
236 },
237
238 'passphrase': function () {
239 return this.getElement('passphrase').value;
240 },
241
242 'rePassphrase': function () {
243 return this.getElement('re-passphrase').value;
244 },
245
246 'awareOfUnrecoverablePassphrase': function () {
247 return this.getElement('awareOfUnrecoverablePassphrase').value;
248 },
249
250 'readTermsOfService': function () {
251 return this.getElement('readTermsOfService').value;
252 },
253
254 //=========================================================================
255/*
256 'incrementUpdateFaviconCounter': function () {
257 this._updateFaviconCounter ++;
258 },
259
260 'decrementUpdateFaviconCounter': function () {
261 this._updateFaviconCounter --;
262 },
263
264 'updateFaviconCounter': function () {
265 return this._updateFaviconCounter;
266 },
267 */
268 //-------------------------------------------------------------------------
269/*
270 'updateFavicon': function () {
271 this.decrementUpdateFaviconCounter();
272
273 if (this.updateFaviconCounter() == 0) {
274 this.setFavicon(this.favicon());
275 }
276 },
277*/
278 //=========================================================================
279/*
280 'bindingComponents': function () {
281 return this._bindingComponents;
282 },
283
284 'clearAllBindingsComponents': function () {
285 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove'));
286 this._bindingComponents = [];
287 this.getElement('bindings').innerHTML = '';
288 },
289
290 'addBindingComponent': function (aBindingComponent) {
291 this.bindingComponents().push(aBindingComponent);
292 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'}));
293 },
294*/
295 //=========================================================================
296/*
297 'formValueComponents': function () {
298 return this._formValueComponents;
299 },
300
301 'clearAllFormValueComponents': function () {
302 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove'));
303 this._formValueComponents = [];
304 this.getElement('formValues').innerHTML = '';
305 },
306
307 'addFormValueComponent': function (aFormValueComponent) {
308 this.formValueComponents().push(aFormValueComponent);
309 aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'}));
310 },
311*/
312 //=========================================================================
313
314 'changedValue': function (anEvent) {
315 MochiKit.Signal.signal(this, 'changedValue', anEvent);
316
317 this.incrementUpdateFaviconCounter();
318 MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon'));
319 },
320
321 //-------------------------------------------------------------------------
322
323 'handleBackClick': function (anEvent) {
324 anEvent.preventDefault();
325
326 MochiKit.Signal.signal(this, 'back');
327 },
328
329 //=========================================================================
330
331 'bottomMargin': function () {
332 var result;
333
334 //TODO: WTF!!!
335 // result =MochiKit.Style.getElementPosition(this.element())['y'] +
336 // MochiKit.Style.getElementDimensions(this.element())['h'];
337
338 // result =MochiKit.Style.getElementPosition(this.getElement('footer'))['y'];
339//console.log("### bottomMargin");
340//console.log('displayElement', this.displayElement());
341//console.log('-- Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
342//console.log('element', MochiKit.Style.getElementPosition('modalDialog') ['y'], MochiKit.Style.getElementDimensions('modalDialog')['h']);
343 // result = 450;
344
345 result =Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] +
346 Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] -
347 60;
348
349 return result;
350 },
351
352 //=========================================================================
353
354 'focusOnUsernameElement': function () {
355 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus'));
356 },
357
358 'focusOnRePassphraseElement': function () {
359 this.getElement('re-passphrase').focus();
360 },
361 /*
362 'focusOnBookmarkletConfigurationElement': function () {
363 this.getElement('bookmarkletConfiguration').focus();
364 },
365
366 'focusOnFaviconElement': function () {
367 this.getElement('faviconURL').focus();
368 },
369*/
370
371 //=========================================================================
372
373 'hideAllProgeressStates': function () {
374 MochiKit.Style.hideElement(this.getElement('creatingRegistering'));
375 MochiKit.Style.hideElement(this.getElement('creatingDone'));
376 MochiKit.Style.hideElement(this.getElement('creatingFailed'));
377 },
378
379 'showProgressOnUserCreation': function () {
380//Clipperz.log(">>> NewUserCreationComponent.showProgressOnUserCreation");
381 this.hideAllProgeressStates();
382 MochiKit.Style.showElement(this.getElement('creatingRegistering'));
383 },
384
385 'showUserCreationDone': function () {
386//Clipperz.log(">>> NewUserCreationComponent.showUserCreationDone");
387 this.hideAllProgeressStates();
388 MochiKit.Style.showElement(this.getElement('creatingDone'));
389//Clipperz.log("<<< NewUserCreationComponent.showUserCreationDone");
390 },
391
392 'showUserCreationFailed': function () {
393//Clipperz.log(">>> NewUserCreationComponent.showUserCreationFailed");
394 this.hideAllProgeressStates();
395 MochiKit.Style.showElement(this.getElement('creatingFailed'));
396 },
397
398 //=========================================================================
399
400 'handleKeyEvent': function (anEvent) {
401 MochiKit.Signal.signal(this, 'keyPressed', anEvent);
402/*
403 if (anEvent.key().string == 'KEY_ENTER') {
404 if (anEvent.target().nodeName != 'TEXTAREA') {
405 MochiKit.Signal.signal(this, 'moveForward');
406 anEvent.preventDefault();
407 }
408 } else if (anEvent.key().string == 'KEY_TAB') {
409 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
410 MochiKit.Signal.signal(this, 'moveForward');
411 anEvent.preventDefault();
412 }
413 }
414*/
415 },
416
417 'handleTermsOfServiceCheckboxChange': function (anEvent) {
418 MochiKit.Signal.signal(this, 'changedValue');
419 },
420
421 //=========================================================================
422
423 'clear': function () {
424 this.tabPanelController().selectTab(null);
425 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.clear.apply(this, arguments);
426 },
427
428 //=========================================================================
429 __syntaxFix__: "syntax fix"
430});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
new file mode 100644
index 0000000..bed6675
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
@@ -0,0 +1,71 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.Page = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.Page.superclass.constructor.apply(this, arguments);
35
36 this._slots = {
37 'header':'pageHeader',
38 'body': 'pageBody',
39 'footer':'pageFooter'
40 };
41
42 return this;
43}
44
45//=============================================================================
46
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.Page, Clipperz.PM.UI.Common.Components.BaseComponent, {
48
49 //-------------------------------------------------------------------------
50
51 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.Page component";
53 },
54
55 //-------------------------------------------------------------------------
56
57 'renderSelf': function(/*aContainer, aPosition*/) {
58 this.append(this.element(), [
59 {tag:'div', id:'pageHeaderAndBody', cls:'pageHeaderAndBody', children:[
60 {tag:'div', id:'pageHeader', cls:'pageHeader'},
61 {tag:'div', id:'pageBody', cls:'pageBody'}
62 ]},
63 {tag:'div', id:'pageFooter', cls:'pageFooter'}
64 ]);
65
66 },
67
68 //-------------------------------------------------------------------------
69
70 __syntaxFix__: "syntax fix"
71});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
new file mode 100644
index 0000000..11135d8
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
@@ -0,0 +1,71 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.PageFooter = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments);
35
36 return this;
37}
38
39//=============================================================================
40
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, {
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return "Clipperz.PM.UI.Web.Components.PageFooter component";
47 },
48
49 //-------------------------------------------------------------------------
50
51 'renderSelf': function(/*aContainer, aPosition*/) {
52 this.append(this.element(), [
53 {tag:'div', cls:'footerWrapper', children:[
54 {tag:'div', cls:'footerContent', children:[
55 // {tag:'div', cls:'footerStarIcon'},
56 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'},
57 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009 Clipperz Srl'},
58 {tag:'a', href:'http://www.clipperz.com/terms_of_service',target:'_blank', html:'terms of service'},
59 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'},
60 {tag:'span', cls:'applicationVersion', html:'application version: [1992]'}
61 ]}
62 ]}
63 ]);
64
65 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e");
66 },
67
68 //-------------------------------------------------------------------------
69
70 __syntaxFix__: "syntax fix"
71});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
new file mode 100644
index 0000000..3924434
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
@@ -0,0 +1,184 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.PageHeader = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.PageHeader.superclass.constructor.apply(this, arguments);
35 this._newsIsOpen = args.newsIsOpen || false;
36 this._animationDuration = args.animationDuration || 0.5;
37
38 this._offset = 82;
39
40 return this;
41}
42
43//=============================================================================
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageHeader, Clipperz.PM.UI.Common.Components.BaseComponent, {
46
47 //-------------------------------------------------------------------------
48
49 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.PageHeader component";
51 },
52
53 //-------------------------------------------------------------------------
54
55 'iframeURL': function () {
56 // return './rss_view.html';
57 return 'http://www.clipperz.com/files/clipperz.com/appTips/index.html';
58 },
59
60 //-------------------------------------------------------------------------
61
62 'renderSelf': function(/*aContainer, aPosition*/) {
63 this.append(this.element(), [
64 {tag:'div', id:'miscLinks', children:[
65 {tag:'ul', children:[
66 {tag:'li', children:[{tag:'a', id:'donateHeaderLink', stringID:'pageHeader.donation', href:'http://www.clipperz.com/donations', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.donation')}]},
67 {tag:'li', children:[{tag:'a', id:'forumHeaderLink', stringID:'pageHeader.forum', href:'http://www.clipperz.com/forum', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.forum')}]},
68 {tag:'li', children:[{tag:'a', id:'creditsHeaderLink', stringID:'pageHeader.credits', href:'http://www.clipperz.com/credits', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.credits')}]},
69 {tag:'li', children:[{tag:'a', id:'feedbackHeaderLink', stringID:'pageHeader.feedback', href:'http://www.clipperz.com/contact', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.feedback')}]},
70 {tag:'li', children:[{tag:'a', id:'helpHeaderLink', stringID:'pageHeader.help', href:'http://www.clipperz.com/support/user_guide',target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.help')}]}
71 ]}
72 ]},
73 {tag:'div', id:'logoFrame', children:[
74 {tag:'a', href:'http://www.clipperz.com', target:'_blank', children:[{tag:'div', id:'logo'}]},
75 {tag:'h5', cls:'clipperzPayoff', html:'keep it to yourself!'}
76 ]},
77 {tag:'div', id:'news', cls:'hidden', children:[
78 // {tag:'div', cls:'close', children:[
79 // {tag:'a', href:'#', id:this.getId('closeTips'), html:'x'}
80 // ]},
81 {tag:'div', id:'newsframe', children:[
82 {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()}
83 ]},
84 {tag:'div', id:this.getId('newsGrip'), cls:'grip', children:[]}
85 ]},
86 {tag:'div', id:'featureTabs', children:[
87 {tag:'table', children:[{tag:'tr', children:[
88 {tag:'td', children:[{tag:'div', id:'feature_store', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('storeIcon')}, {tag:'span', html:"Store and manage your password and online credentials"}]}]},
89 {tag:'td', children:[{tag:'div', id:'feature_protect', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('protectIcon')}, {tag:'span', html:"Protect all your sensitive data"}]}]},
90 {tag:'td', children:[{tag:'div', id:'feature_directLogin', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('directLoginIcon')},{tag:'span', html:"Login to your web services without entering any username or password"}]}]},
91 {tag:'td', children:[{tag:'div', id:'feature_share', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('shareIcon')}, {tag:'span', html:"Share secret with family members and associates"}]}]}
92 ]}]}
93 ]}
94 ]);
95
96 Clipperz.PM.UI.Canvas.features.store(this.getElement('storeIcon'), "#ffffff");
97 Clipperz.PM.UI.Canvas.features.protect(this.getElement('protectIcon'), "#ffffff");
98 Clipperz.PM.UI.Canvas.features.directLogin(this.getElement('directLoginIcon'), "#ffffff");
99 Clipperz.PM.UI.Canvas.features.share(this.getElement('shareIcon'), "#ffffff", "#ffffff", "#ff0000");
100
101 MochiKit.Signal.connect(this.getElement('newsGrip'), 'onclick', this, 'toggleTips');
102 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad');
103 },
104
105 //-------------------------------------------------------------------------
106
107 'switchToLoggedMode': function() {
108 // MochiKit.Style.addElementClass(this.element(), 'logged');
109 MochiKit.Style.hideElement('featureTabs');
110 },
111
112 //-------------------------------------------------------------------------
113
114 'animationDuration': function () {
115 return this._animationDuration;
116 },
117
118 'offset': function () {
119 return this._offset;
120 },
121
122 //-------------------------------------------------------------------------
123
124 'isNewsOpen': function () {
125 return this._newsIsOpen;
126 },
127
128 'toggleNewsIsOpen': function () {
129 this._newsIsOpen = !this._newsIsOpen;
130 },
131
132 'toggleTips': function(anEvent) {
133 anEvent.preventDefault();
134
135 if (this.isNewsOpen() == true) {
136 MochiKit.Visual.Move(Clipperz.DOM.get('news'), {
137 x: 0,
138 y: -this.offset(),
139 mode: 'relative',
140 duration: this.animationDuration(),
141 beforeStart: function () {
142 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'hiding');
143 },
144 afterFinish: function () {
145 Clipperz.DOM.get('newsframe').innerHTML = "";
146 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'hidden');
147 }
148 })
149 this.toggleNewsIsOpen();
150 } else {
151 MochiKit.DOM.addElementClass('newsframe', 'loading');
152 MochiKit.Visual.Move(Clipperz.DOM.get('news'), {
153 x: 0,
154 y: this.offset(),
155 mode: 'relative',
156 duration: this.animationDuration(),
157 beforeStart: MochiKit.Base.bind(function () {
158 this.append(Clipperz.DOM.get('newsframe'), {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()});
159
160 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad');
161 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'opening');
162 }, this),
163 afterFinish: function () {
164 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'open');
165 }
166 })
167 this.toggleNewsIsOpen();
168 }
169 },
170
171 //-------------------------------------------------------------------------
172
173 'handleIframeDidLoad': function (anEvent) {
174 if (this.isNewsOpen() == false) {
175 this.toggleTips(anEvent);
176 }
177
178 MochiKit.DOM.removeElementClass('newsframe', 'loading');
179 MochiKit.Signal.disconnectAllTo(this.getElement('iframe'));
180 },
181
182 //-------------------------------------------------------------------------
183 __syntaxFix__: "syntax fix"
184});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
new file mode 100644
index 0000000..79c8d4f
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
@@ -0,0 +1,164 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30
31Clipperz.PM.UI.Web.Components.PasswordTooltip = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.PasswordTooltip.superclass.constructor.apply(this, arguments);
35
36 this._referenceElement = args.referenceElement|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
38
39 this._boxDimensions = null;
40 this._isVisible = false;
41
42 this.renderSelf();
43
44 return this;
45}
46
47//=============================================================================
48
49Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PasswordTooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
50
51 //-------------------------------------------------------------------------
52
53 'toString': function () {
54 return "Clipperz.PM.UI.Web.Components.PasswordTooltip component";
55 },
56
57 //-------------------------------------------------------------------------
58
59 'referenceElement': function () {
60 return this._referenceElement;
61 },
62
63 //-------------------------------------------------------------------------
64
65 'text': function () {
66 return this._text;
67 },
68
69 'setText': function (aValue) {
70 this._text = aValue;
71 },
72
73 //-------------------------------------------------------------------------
74
75 'isVisible': function () {
76 return this._isVisible;
77 },
78
79 'setIsVisible': function (aValue) {
80 this._isVisible = aValue;
81 },
82
83 //-------------------------------------------------------------------------
84
85 'renderSelf': function() {
86 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'passwordTooltip', children:[
87 {tag:'div', id:this.getId('body'), cls:'passwordTooltip_body', children:[
88 {tag:'div', cls:'passwordTooltip_text', children:[
89 {tag:'span', html:this.text()}
90 ]},
91 {tag:'div', id:this.getId('footer'), cls:'passwordTooltip_footer'}
92 ]},
93 {tag:'div', id:this.getId('arrow'), cls:'passwordTooltip_arrow'}
94 ]});
95
96 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
97 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
98
99 MochiKit.Style.hideElement(this.displayElement());
100 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
101 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
102 },
103
104 //-----------------------------------------------------
105
106 'displayElement': function() {
107 return this.getElement('tooltip');
108 },
109
110 //-------------------------------------------------------------------------
111
112 'boxDimensions': function () {
113 return this._boxDimensions;
114 },
115
116 //-------------------------------------------------------------------------
117
118 'show': function () {
119 var elementSizeAndPosition;
120 var arrowPosition;
121 var bodyPosition;
122
123 if (this.isVisible() == false) {
124 arrowPosition = {};
125 bodyPosition = {};
126
127 this.setIsVisible(true);
128 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
129
130 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
131 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
132 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
133
134 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
135 arrowPosition.y = elementSizeAndPosition.position.y - 13;
136
137 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
138 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
139 MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
140 }
141 },
142
143 'hide': function () {
144 if (this.isVisible() == true) {
145 MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
146 this.setIsVisible(false);
147 }
148 },
149
150 //-------------------------------------------------------------------------
151/*
152 'shouldRemoveElementWhenClearningUp': function () {
153 return false;
154 },
155*/
156 //-------------------------------------------------------------------------
157 __syntaxFix__: "syntax fix"
158});
159
160Clipperz.PM.UI.Web.Components.PasswordTooltip.initTooltips = function () {
161 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Web_Components_PasswordTooltip_wrapperNode'});
162}
163
164MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Web.Components.PasswordTooltip.initTooltips);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
new file mode 100644
index 0000000..ab8a38c
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
@@ -0,0 +1,324 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.RulerComponent = function(args) {
32 args = args || {};
33 Clipperz.PM.UI.Web.Components.RulerComponent.superclass.constructor.apply(this, arguments);
34
35 this._translationContext = args.translationContext|| Clipperz.Base.exception.raise('MandatoryParameter');
36 // this._steps = args.steps || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._steps = args.steps;
38
39 this._currentStep = -1;
40
41 return this;
42}
43
44//=============================================================================
45
46Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.RulerComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
47
48 //-------------------------------------------------------------------------
49
50 'toString': function () {
51 return "Clipperz.PM.UI.Web.Components.RulerComponent component";
52 },
53
54 //-------------------------------------------------------------------------
55
56 'resetStatus': function (args) {
57 args = args || {};
58
59 if (this.currentStep() != 0) {
60 var shouldAnimateTransition;
61
62 shouldAnimateTransition = args.animateTransition || false;
63
64 if (shouldAnimateTransition) {
65 this.moveToFirstStep(MochiKit.Base.method(this, 'cursorMoved'));
66 } else {
67 this._currentStep = 0;
68 this.cursorMoved();
69 }
70 }
71 },
72
73 //-------------------------------------------------------------------------
74
75 'translationContext': function () {
76 return this._translationContext;
77 },
78
79 'steps': function () {
80 return this._steps;
81 },
82
83 'setSteps': function (aValue) {
84 this._steps = aValue;
85 this.renderStepsComponents();
86 this.resetStatus();
87 },
88
89 'translatedStepDescription': function (aStep) {
90 return Clipperz.PM.Strings.getValue(this.translationContext() + '.' + aStep + '.' + 'name');
91 },
92
93 //-------------------------------------------------------------------------
94
95 'renderSelf': function(/*aContainer, aPosition*/) {
96 this.setElement(this.append(MochiKit.DOM.currentDocument().body, [
97 {tag:'div', id:this.getId('rulerWrapper'), cls:'rulerWrapper fixed', children:[
98 {tag:'div', cls:'ruler', children:[
99 {tag:'a', href:'#', id:this.getId('exit'), cls:'exit', html:'&nbsp;'},
100 {tag:'a', href:'#', id:this.getId('smallPreviousButton'),cls:'smallButton previous', html:'&nbsp;'},
101 {tag:'a', href:'#', id:this.getId('smallNextButton'), cls:'smallButton next', html:'&nbsp;'},
102 {tag:'div', cls:'marker', id:this.getId('marker'), children:[
103 {tag:'div', cls:'previous', id:this.getId('previousButton')},
104 {tag:'div', cls:'markerBody'},
105 {tag:'div', cls:'next', id:this.getId('nextButton')}
106 ]},
107 {tag:'div', cls:'steps', id:this.getId('stepsFrame')},
108 // {tag:'div', cls:'steps' + ' ' + 'steps_' + this.steps().length, children:[
109 // {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this), this.steps())}
110 // ]},
111 {tag:'div', cls:'dots', id:this.getId('dotsFrame')}
112 // {tag:'div', cls:'dots' + ' ' + 'steps_' + this.steps().length, children:[
113 // {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}}, this.steps())}
114 // ]}
115 ]}
116 ]}
117 ]));
118//console.log("ELEMENT", this.element());
119
120 MochiKit.Signal.connect(this.getElement('exit'), 'onclick', this, 'handleExit');
121
122 MochiKit.Signal.connect(this.getElement('previousButton'), 'onclick', this, 'handlePrevious');
123 MochiKit.Signal.connect(this.getElement('smallPreviousButton'),'onclick', this, 'handlePrevious');
124
125 MochiKit.Signal.connect(this.getElement('nextButton'), 'onclick', this, 'handleNext');
126 MochiKit.Signal.connect(this.getElement('smallNextButton'), 'onclick', this, 'handleNext');
127
128 this.enablePrevious(false);
129 this.enableNext(false);
130
131 // this.cursorMoved();
132 },
133
134 //.........................................................................
135
136 'renderStepsComponents': function () {
137 varstepsFrame;
138 var dotsFrame;
139
140 stepsFrames = this.getElement('stepsFrame');
141 MochiKit.DOM.setElementClass(stepsFrames, 'steps');
142 MochiKit.DOM.addElementClass(stepsFrames, 'steps_' + this.steps().length);
143
144 stepsFrames.innerHTML = "";
145 this.append(stepsFrames, {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(
146 MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this),
147 this.steps())}
148 );
149
150 dotsFrames = this.getElement('dotsFrame');
151 MochiKit.DOM.setElementClass(dotsFrames, 'dots');
152 MochiKit.DOM.addElementClass(dotsFrames, 'steps_' + this.steps().length);
153
154 dotsFrames.innerHTML = "";
155 this.append(dotsFrames, {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(
156 function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}; },
157 this.steps())}
158 );
159 },
160
161 //-------------------------------------------------------------------------
162
163 'handleExit': function (anEvent) {
164 anEvent.preventDefault();
165
166 MochiKit.Signal.signal(this, 'exit');
167 },
168
169 //-------------------------------------------------------------------------
170
171 'handlePrevious': function (anEvent) {
172 anEvent.preventDefault();
173
174 // if (!MochiKit.DOM.hasElementClass(this.getElement('previousButton'), 'disabled')) {
175 // this.moveBackward();
176 // }
177
178 MochiKit.Signal.signal(this, 'moveBackward');
179 },
180
181 'handleNext': function (anEvent) {
182 anEvent.preventDefault();
183
184 // if (!MochiKit.DOM.hasElementClass(this.getElement('nextButton'), 'disabled')) {
185 // this.moveForward();
186 // }
187
188 MochiKit.Signal.signal(this, 'moveForward');
189 },
190
191 //-------------------------------------------------------------------------
192
193 'currentStep': function () {
194 return this._currentStep;
195 },
196
197 'markerInitialOffset': function () {
198 return -246;
199 },
200
201 'markerStepOffset': function () {
202 return 410 / (this.steps().length - 1);
203 // return 100;
204 },
205
206 //-------------------------------------------------------------------------
207
208 'moveToFirstStep': function (aCallback) {
209 varstepsToMove;
210
211 stepsToMove = this._currentStep;
212 this._currentStep = 0;
213
214 this.enablePrevious(false);
215 this.enableNext(false);
216 // MochiKit.Signal.signal(this, 'moveBackward');
217 MochiKit.Base.map(
218 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
219 MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
220 );
221 new MochiKit.Visual.Move(this.getElement('marker'), {
222 x:-(this.markerStepOffset() * stepsToMove),
223 mode:'relative',
224 duration:(0.5 * (stepsToMove/2)),
225 // afterFinish:MochiKit.Base.method(this, 'cursorMoved')
226 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
227 });
228 },
229
230 'moveBackward': function (aCallback) {
231 this._currentStep --;
232
233 this.enablePrevious(false);
234 this.enableNext(false);
235 // MochiKit.Signal.signal(this, 'moveBackward');
236 MochiKit.Base.map(
237 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
238 MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
239 );
240 new MochiKit.Visual.Move(this.getElement('marker'), {
241 x:-this.markerStepOffset(),
242 mode:'relative',
243 duration:0.5,
244 // afterFinish:MochiKit.Base.method(this, 'cursorMoved')
245 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
246 });
247 },
248
249 'moveForward': function (aCallback) {
250 this._currentStep ++;
251
252 if (this._currentStep < this.steps().length) {
253 this.enablePrevious(false);
254 this.enableNext(false);
255 // MochiKit.Signal.signal(this, 'moveForward');
256 MochiKit.Base.map(
257 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
258 MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
259 );
260 new MochiKit.Visual.Move(this.getElement('marker'), {
261 x:this.markerStepOffset(),
262 mode:'relative',
263 duration:0.5,
264 // afterFinish:MochiKit.Base.method(this, 'cursorMoved')
265 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
266 });
267 } else {
268 MochiKit.Signal.signal(this, 'done');
269 }
270 },
271
272 //-------------------------------------------------------------------------
273
274 'enablePrevious': function (aValue) {
275 if (aValue == true) {
276 MochiKit.DOM.removeElementClass(this.getElement('previousButton'), 'disabled');
277 MochiKit.DOM.removeElementClass(this.getElement('smallPreviousButton'), 'disabled');
278 } else {
279 MochiKit.DOM.addElementClass(this.getElement('previousButton'), 'disabled');
280 MochiKit.DOM.addElementClass(this.getElement('smallPreviousButton'), 'disabled');
281 }
282 },
283
284 //'disablePrevious': function () {
285 // MochiKit.DOM.addElementClass(this.getElement('previousButton'), 'disabled');
286 //},
287
288 //.........................................................................
289
290 'enableNext': function (aValue) {
291 if (aValue == true) {
292 MochiKit.DOM.removeElementClass(this.getElement('nextButton'), 'disabled');
293 MochiKit.DOM.removeElementClass(this.getElement('smallNextButton'), 'disabled');
294 } else {
295 MochiKit.DOM.addElementClass(this.getElement('nextButton'), 'disabled');
296 MochiKit.DOM.addElementClass(this.getElement('smallNextButton'), 'disabled');
297 }
298 },
299
300 //'disableNext': function () {
301 // MochiKit.DOM.addElementClass(this.getElement('nextButton'), 'disabled');
302 //},
303
304 //-------------------------------------------------------------------------
305
306 'cursorMoved': function () {
307 MochiKit.Style.setElementPosition(this.getElement('marker'), {x:this.markerStepOffset() * this.currentStep() + this.markerInitialOffset()})
308 MochiKit.Signal.signal(this, 'cursorMoved');
309
310 MochiKit.DOM.addElementClass(this.getElement('steps').childNodes[this.currentStep()], 'selected');
311 MochiKit.DOM.addElementClass(this.getElement('dots').childNodes[this.currentStep()], 'selected');
312 },
313
314 //-------------------------------------------------------------------------
315
316 'setDisplayMode': function (aValue) {
317 MochiKit.DOM.removeElementClass(this.getElement('rulerWrapper'), 'fixed');
318 MochiKit.DOM.removeElementClass(this.getElement('rulerWrapper'), 'scrollable');
319 MochiKit.DOM.addElementClass(this.getElement('rulerWrapper'), aValue);
320 },
321
322 //-------------------------------------------------------------------------
323 __syntaxFix__: "syntax fix"
324});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
new file mode 100644
index 0000000..39a1ccb
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
@@ -0,0 +1,193 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.TabSidePanel = function(args) {
32 args = args || {};
33 Clipperz.PM.UI.Web.Components.TabSidePanel.superclass.constructor.call(this, args);
34
35 this._element = args.element || null;
36
37 this._slots = {
38 };
39
40 return this;
41}
42
43//=============================================================================
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TabSidePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
46
47 //-------------------------------------------------------------------------
48
49 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.TabSidePanel component";
51 },
52
53 //-------------------------------------------------------------------------
54
55 'deselectAllTabs': function() {
56 var tabListItems;
57
58 tabListItems = [
59 'cardsLI',
60 // 'directLoginLI',
61 'accountLI',
62 'dataLI',
63 'toolsLI'
64 ];
65
66//Clipperz.log("=== TabSidePanel.tabSelected anEvent.src().id", anEvent.src().id);
67 for (var i in tabListItems) {
68//Clipperz.log("=== TabSidePanel.tabSelected aTabListItem", tabListItems[i]);
69 MochiKit.DOM.removeElementClass(this.getId(tabListItems[i]), 'selected');
70 }
71 },
72
73 'selectTab': function(aTabName) {
74 this.deselectAllTabs();
75 MochiKit.DOM.addElementClass(this.getId(this.listItemIdForTabNamed(aTabName)), 'selected');
76 MochiKit.Signal.signal(this, 'tabSelected', aTabName);
77 },
78
79 'tabNameForAnchorId': function(anId) {
80 var result;
81
82 switch(anId) {
83 case 'cards_tabSidePanel':
84 result = 'cards';
85 break;
86 // case 'directLogins_tabSidePanel':
87 // result = 'directLogins';
88 // break;
89 case 'account_tabSidePanel':
90 result = 'account';
91 break;
92 case 'data_tabSidePanel':
93 result = 'data';
94 break;
95 case 'tools_tabSidePanel':
96 result = 'tools';
97 break;
98 }
99
100 return result;
101 },
102
103 'listItemIdForTabNamed': function(aTabName) {
104 var result;
105
106 switch (aTabName) {
107 case 'cards':
108 result = 'cardsLI';
109 break;
110 // case 'directLogins':
111 // result = 'directLoginLI';
112 // break;
113 case 'account':
114 result = 'accountLI';
115 break;
116 case 'data':
117 result = 'dataLI';
118 break;
119 case 'tools':
120 result = 'toolsLI';
121 break;
122 }
123
124 return result;
125 },
126
127 'tabSelected': function (anEvent) {
128 this.selectTab(this.tabNameForAnchorId(anEvent.src().id));
129 // anEvent.stop();
130 anEvent.preventDefault();
131 },
132
133 //-------------------------------------------------------------------------
134
135 'addCard': function (anEvent) {
136 anEvent.stop();
137 MochiKit.Signal.signal(this, 'addCard', anEvent.src());
138 },
139
140 //-------------------------------------------------------------------------
141
142 'renderSelf': function(/*aContainer, aPosition*/) {
143 this.append(this.element(), [
144 {tag:'div', cls:'header'},
145 {tag:'div', cls:'body', children:[
146 {tag:'ul', cls:'mainTabs', children:[
147 {tag:'li', id:this.getId('cardsLI'), cls:'cards', children:[
148 {tag:'a', id:'cards_tabSidePanel', href:'#', html:"cards"},
149 {tag:'div', cls:'selectionHighlighter', children:[
150 {tag:'img', src:'./images/old/main/tabs/selectionHighligher.png'},
151 {tag:'a', id:this.getId('addCardA'), cls:'add', href:'#', children:[
152 {tag:'span', html:"add"},
153 {tag:'h3', html:"+"}
154 ]}
155 ]}
156 ]}
157 ]},
158 {tag:'ul', cls:'otherTabs', children:[
159 {tag:'li', id:this.getId('accountLI'), children:[
160 {tag:'a', id:'account_tabSidePanel', href:'#', html:"account"},
161 {tag:'div', cls:'selectionHighlighter', children:[
162 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
163 ]}
164 ]},
165 {tag:'li', id:this.getId('dataLI'), children:[
166 {tag:'a', id:'data_tabSidePanel', href:'#', html:"data"},
167 {tag:'div', cls:'selectionHighlighter', children:[
168 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
169 ]}
170 ]},
171 {tag:'li', id:this.getId('toolsLI'), children:[
172 {tag:'a', id:'tools_tabSidePanel', href:'#', html:"tools"},
173 {tag:'div', cls:'selectionHighlighter', children:[
174 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
175 ]}
176 ]}
177 ]}
178 ]},
179 {tag:'div', cls:'footer'}
180 ]);
181
182 MochiKit.Signal.connect('cards_tabSidePanel', 'onclick', this, 'tabSelected');
183 // MochiKit.Signal.connect('directLogins_tabSidePanel', 'onclick', this, 'tabSelected');
184 MochiKit.Signal.connect('account_tabSidePanel', 'onclick', this, 'tabSelected');
185 MochiKit.Signal.connect('data_tabSidePanel', 'onclick', this, 'tabSelected');
186 MochiKit.Signal.connect('tools_tabSidePanel', 'onclick', this, 'tabSelected');
187 MochiKit.Signal.connect(this.getId('addCardA'), 'onclick', this, 'addCard');
188 },
189
190 //-------------------------------------------------------------------------
191
192 __syntaxFix__: "syntax fix"
193});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
new file mode 100644
index 0000000..97e81b4
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
@@ -0,0 +1,53 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31//#############################################################################
32
33Clipperz.PM.UI.Web.Components.TextColumnManager = function(args) {
34 args = args || {};
35 Clipperz.PM.UI.Web.Components.TextColumnManager.superclass.constructor.call(this, args);
36
37 return this;
38}
39
40//=============================================================================
41
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TextColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43
44 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.TextColumnManager component";
46 },
47
48 //-----------------------------------------------------
49
50 '__syntax_fix__' : 'syntax fix'
51
52});
53
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
new file mode 100644
index 0000000..179c495
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
@@ -0,0 +1,113 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments);
35
36 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR';
37 this._tabPanelControllerConfiguration = {
38 'PASSWORD_GENERATOR': {
39 tab:'passwordGeneratorTab',
40 panel:'passwordGeneratorPanel'
41 },
42 'BOOKMARKLET': {
43 tab:'bookmarkletTab',
44 panel:'bookmarkletPanel'
45 },
46 'COMPACT_EDITION': {
47 tab:'compactEditionTab',
48 panel:'compactEditionPanel'
49 },
50 'HTTP_AUTH': {
51 tab:'httpAuthTab',
52 panel:'httpAuthPanel'
53 }
54 };
55
56 return this;
57}
58
59//=============================================================================
60
61Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
62
63 //-------------------------------------------------------------------------
64
65 'toString': function () {
66 return "Clipperz.PM.UI.Web.Components.ToolsPanel component";
67 },
68
69 //-------------------------------------------------------------------------
70
71 'renderSelf': function(/*aContainer, aPosition*/) {
72 this.append(this.element(), [
73 {tag:'div', cls:'header', children:[
74 {tag:'div', cls:'subPanelTabs', children:[
75 {tag:'ul', children:[
76 {tag:'li', id:this.getId('passwordGeneratorTab'),children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'},
77 {tag:'li', id:this.getId('bookmarkletTab'), children:[{tag:'a', href:'#', html:'Bookmarklet'}]},
78 {tag:'li', id:this.getId('compactEditionTab'), children:[{tag:'a', href:'#', html:'Compact edition'}]},
79 {tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]}
80 ]}
81 ]}
82 ]},
83 {tag:'div', cls:'body', children:[
84 {tag:'div', cls:'accountPanel', children:[
85 {tag:'div', cls:'subPanelContent', children:[
86 {tag:'ul', children:[
87 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[
88 {tag:'h3', html:"Password generator"}
89 ]},
90 {tag:'li', id:this.getId('bookmarkletPanel'),children:[
91 {tag:'h3', html:"Bookmarklet"}
92 ]},
93 {tag:'li', id:this.getId('compactEditionPanel'), children:[
94 {tag:'h3', html:"Compact edition"}
95 ]},
96 {tag:'li', id:this.getId('httpAuthPanel'), children:[
97 {tag:'h3', html:"HTTP Auth"}
98 ]}
99 ]}
100 ]}
101 ]}
102 ]},
103 {tag:'div', cls:'footer'}
104 ]);
105
106 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
107 },
108
109 //-------------------------------------------------------------------------
110
111
112 __syntaxFix__: "syntax fix"
113});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
new file mode 100644
index 0000000..5b9d522
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
@@ -0,0 +1,184 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.UnlockPasswordComponent = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.constructor.apply(this, arguments);
35
36 this._openFromElement = args.openFromElement || null;
37 this._onOkCloseToElement = args.onOkCloseToElement || null;
38 this._onCancelCloseToElement = args.onCancelCloseToElement|| null;
39
40 this._progressBarComponent = null;
41
42 return this;
43}
44
45//=============================================================================
46
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
48
49 //-------------------------------------------------------------------------
50
51 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.UnlockPasswordComponent component";
53 },
54
55 //-------------------------------------------------------------------------
56
57 'getPassphrase': function () {
58 /* var deferredResult;
59
60 if (this.passphrase() == null) {
61 this.deferredShowModal({'openFromElement': this.openFromElement()});
62 deferredResult = this.deferred();
63 } else {
64 deferredResult = MochiKit.Async.succeed(this.passphrase());
65 }
66
67 return deferredResult;
68*/
69
70 this.deferredShowModal({'openFromElement': this.openFromElement()});
71
72 return this.deferred();
73 },
74
75 //-------------------------------------------------------------------------
76
77 'deferredShowModal': function (someParameters) {
78 return Clipperz.Async.callbacks("UnlockPasswordComponent.deferredShowModal", [
79 MochiKit.Base.bind(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.deferredShowModal, this, someParameters),
80 MochiKit.Base.method(this, 'getElement', 'passphrase'),
81 MochiKit.Base.methodcaller('focus')
82 ], {trace:false})
83 },
84
85 //-------------------------------------------------------------------------
86
87 'openFromElement': function () {
88 return this._openFromElement;
89 },
90
91 'onOkCloseToElement': function () {
92 return this._onOkCloseToElement;
93 },
94
95 'onCancelCloseToElement': function () {
96 return this._onCancelCloseToElement;
97 },
98
99 //-------------------------------------------------------------------------
100
101 'renderSelf': function() {
102 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.renderSelf.apply(this, arguments);
103
104 this.append(this.getElement('container'), {tag:'div', cls:'passphrase', children: [
105 // {tag:'form', id:this.getId('passphraseForm'), children:[
106 {tag:'input', id:this.getId('passphrase'), type:'password', name:'passphrase', value:''}
107 // ]}
108 ]});
109
110 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn', this, 'userSuccessfullyLoggedInHandler');
111 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userLoginFailed', this, 'userLoginFailedHandler');
112
113
114 // MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('passphrase'), 'focus'));
115 // this.getElement('passphrase').select();
116 },
117
118 //-------------------------------------------------------------------------
119
120 'showProgressBar': function () {
121 varprogressBarElement;
122
123 this.getElement('container').innerHTML = '';
124
125 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
126 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
127
128 this.setButtons([{text:"Cancel", result:'CANCEL'}]);
129 },
130
131 //-------------------------------------------------------------------------
132
133 'showFailure': function () {
134 this.setType('ALERT');
135 this.setTitle("Login failed");
136 this.setText("Wrong passphrase; the unlock has failed.");
137 this.getElement('container').innerHTML = '';
138 this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
139 },
140
141 //-------------------------------------------------------------------------
142
143 'closeOk': function () {
144 var passphrase;
145
146 passphrase = this.getElement('passphrase').value;
147 this.showProgressBar();
148 // this.deferred().callback(passphrase);
149 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback', passphrase));
150 this._deferred = null;
151 },
152
153 'closeCancel': function () {
154 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
155 this.deferred().cancel();
156 this._deferred = null;
157 },
158
159 //-------------------------------------------------------------------------
160
161 'userSuccessfullyLoggedInHandler': function (anEvent) {
162 this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
163 },
164
165 'userLoginFailedHandler': function (anEvent) {
166//console.log("############### FAILED LOGIN ################");
167 this.showFailure();
168 },
169
170 //-------------------------------------------------------------------------
171/*
172 'deferredShow': function (someArgs, aResult) {
173 this.deferredShowModal(someArgs);
174
175 // this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
176 // this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
177 // this.deferred().addCallback(MochiKit.Async.succeed, aResult);
178
179 return this.deferred();
180 },
181*/
182 //-------------------------------------------------------------------------
183 __syntaxFix__: "syntax fix"
184});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
new file mode 100644
index 0000000..f26118e
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
@@ -0,0 +1,346 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30
31Clipperz.PM.UI.Web.Components.UserInfoBox = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Components.UserInfoBox.superclass.constructor.apply(this, arguments);
35
36 this._slots = {};
37 this._isLocked = false;
38 this._lockTooltip = null;
39
40 return this;
41}
42
43//=============================================================================
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UserInfoBox, Clipperz.PM.UI.Common.Components.BaseComponent, {
46
47 //-------------------------------------------------------------------------
48
49 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.UserInfoBox component";
51 },
52
53 //-------------------------------------------------------------------------
54
55 'handleLogout': function(anEvent) {
56//Clipperz.log(">>> UserInfoBox.handleLogout");
57 anEvent.preventDefault();
58 MochiKit.Signal.signal(this, 'logout');
59//Clipperz.log("<<< UserInfoBox.handleLogout");
60 },
61
62 //-------------------------------------------------------------------------
63
64 'lockTooltip': function () {
65 return this._lockTooltip;
66 },
67
68 //-------------------------------------------------------------------------
69
70 'isLocked': function () {
71 return this._isLocked;
72 },
73
74 'setIsLocked': function (aValue) {
75 this._isLocked = aValue;
76 },
77
78 'toggleLock': function(anEvent) {
79 var deferredResult;
80 var shouldLock;
81
82//console.log(">>> UserInfoBox.toggleLock [locked: " + this.isLocked() + "]");
83 anEvent.preventDefault();
84 this.lockTooltip().hide();
85
86 shouldLock = (this.isLocked() == false);
87
88 if (shouldLock) {
89 var maskElement;
90
91 this.setIsLocked(true);
92 maskElement = this.getId('modalDialogMask');
93 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [lock]", [
94 MochiKit.Base.partial(MochiKit.DOM.addElementClass, this.element(), 'locked'),
95 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.appear, maskElement, {from:0.0, to:0.75, duration:0.5}),
96 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this, 'askForPassphrase')),
97 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'lock')
98 ], {trace:false});
99 } else {
100 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [unlock]", [
101 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'unlock')
102 ], {trace:false});
103 }
104//console.log("<<< UserInfoBox.toggleLock");
105
106 return deferredResult;
107 },
108
109 //-------------------------------------------------------------------------
110
111 'unlock': function () {
112 var deferredResult;
113 var maskElement;
114
115 this.setIsLocked(false);
116 maskElement = this.getId('modalDialogMask');
117
118 deferredResult = Clipperz.Async.callbacks("UserInfoBox.unlock", [
119 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
120 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
121 MochiKit.Base.partial(MochiKit.DOM.removeElementClass, this.element(), 'locked')
122 ], {trace:false});
123 },
124
125 //-------------------------------------------------------------------------
126
127 'askForPassphrase': function () {
128 varunlockPasswordComponent;
129/*
130 vardeferredResult;
131
132 deferredResult = new Clipperz.Async.Deferred("UserInfoBox.askForPassphrase", {trace:false});
133 deferredResult.addCallback(MochiKit.Async.succeed, 'test');
134
135 deferredResult.callback();
136
137 return deferredResult;
138*/
139//console.log(">>> UserInfoBox.askForPassphrase");
140 unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
141 'title':"Unlock account",
142 'text': "Insert the passprase to unlock the account",
143 'type': 'INFO',
144 'buttons': [
145 {text:"Cancel",result:'CANCEL'},
146 {text:"Unlock", result:'OK',isDefault:true}
147 ],
148 'openFromElement': this.getElement('lock'),
149 'onOkCloseToElement': null,
150 'onCancelCloseToElement':this.getId('lock')
151 });
152//console.log("<<< UserInfoBox.askForPassphrase");
153
154 return unlockPasswordComponent.getPassphrase();
155 },
156
157 //=========================================================================
158
159 'renderSelf': function(/*aContainer, aPosition*/) {
160 this.append(this.element(), [
161 // {tag:'canvas', id:this.getId('canvas'), cls:'canvas', width:'188', height:'154'},
162 {tag:'div', cls:'header', children:[
163 {tag:'h1', html:"Welcome"},
164 {tag:'a', cls:'lockButton', href:'#', id:this.getId('lock'), html:'&nbsp;'}
165 ]},
166 {tag:'div', cls:'body', children:[
167 {tag:'h3', id:this.getId('username'), html:""},
168 {tag:'ul', children:[
169 {tag:'li', id:this.getId('cards'), children:[
170 {tag:'span', id:this.getId('cardsNumber'), cls:'number', html:"-"},
171 {tag:'span', id:this.getId('cardsLabel'), html:"cards"}
172 ]},
173 {tag:'li', id:this.getId('directLogins'), children:[
174 {tag:'span', id:this.getId('directLoginsNumber'), cls:'number', html:"-"},
175 {tag:'span', id:this.getId('directLoginsLabel'), html:"direct logins"}
176 ]}
177 ]},
178 {tag:'a', href:'#', id:this.getId('logout'), html:"logout >"}
179 ]},
180 {tag:'div', cls:'footer'}
181 ]);
182
183 MochiKit.Signal.connect(this.getElement('logout'), 'onclick', this, 'handleLogout');
184 MochiKit.Signal.connect(this.getElement('lock'), 'onclick', this, 'toggleLock');
185
186 this._lockTooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
187 element:this.getElement('lock'),
188 text: "Click here to lock/unlock your account.",
189 position:'RIGHT'
190 });
191
192 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
193 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper', children:[
194 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask userInfoBoxMask'}
195 ]}
196 );
197 MochiKit.Style.hideElement(this.getId('modalDialogMask'));
198
199 // this.drawUserInfoBackground(this.getElement('canvas'));
200 },
201
202 //-------------------------------------------------------------------------
203/*
204 'drawUserInfoBackground': function (canvas) {
205 var kMyDrawingFunctionWidth = 188.0;
206 var kMyDrawingFunctionHeight = 154.0;
207
208 var context = canvas.getContext("2d");
209 var color;
210 var resolution;
211 var alignStroke;
212 var path;
213 var pointX;
214 var pointY;
215 var controlPoint1X;
216 var controlPoint1Y;
217 var controlPoint2X;
218 var controlPoint2Y;
219 var gradient;
220 if (window.devicePixelRatio)
221 resolution = window.devicePixelRatio;
222 else
223 resolution = 1.0;
224 resolution *= 0.5 * (canvas.width / kMyDrawingFunctionWidth + canvas.height / kMyDrawingFunctionHeight);
225
226 context.save();
227 context.scale(canvas.width / kMyDrawingFunctionWidth, canvas.height / kMyDrawingFunctionHeight);
228 context.clearRect(0.0, 0.0, kMyDrawingFunctionWidth, kMyDrawingFunctionHeight);
229
230 // Setup for Shadow Effect
231 color = "rgba(0.0%, 0.0%, 0.0%, 0.667)";
232 context.save();
233 context.shadowColor = color;
234 context.shadowBlur = 3.0;
235 context.shadowOffsetX = 5.729 * Math.cos(7.592) * resolution;
236 context.shadowOffsetY = 5.729 * Math.sin(7.592) * resolution;
237
238 // Layer 1
239
240 alignStroke = 0.0;
241 context.beginPath();
242 pointX = 169.5;
243 pointY = 141.5;
244 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
245 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
246 context.moveTo(pointX, pointY);
247 pointX = 177.5;
248 pointY = 133.5;
249 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
250 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
251 controlPoint1X = 173.889;
252 controlPoint1Y = 141.5;
253 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
254 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
255 controlPoint2X = 177.5;
256 controlPoint2Y = 137.889;
257 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
258 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
259 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
260 pointX = 177.5;
261 pointY = 19.5;
262 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
263 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
264 context.lineTo(pointX, pointY);
265 pointX = 169.5;
266 pointY = 11.5;
267 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
268 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
269 controlPoint1X = 177.5;
270 controlPoint1Y = 15.111;
271 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
272 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
273 controlPoint2X = 173.889;
274 controlPoint2Y = 11.5;
275 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
276 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
277 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
278 pointX = 18.5;
279 pointY = 11.5;
280 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
281 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
282 context.lineTo(pointX, pointY);
283 pointX = 10.5;
284 pointY = 19.5;
285 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
286 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
287 controlPoint1X = 14.111;
288 controlPoint1Y = 11.5;
289 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
290 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
291 controlPoint2X = 10.5;
292 controlPoint2Y = 15.111;
293 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
294 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
295 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
296 pointX = 10.5;
297 pointY = 133.5;
298 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
299 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
300 context.lineTo(pointX, pointY);
301 pointX = 18.5;
302 pointY = 141.5;
303 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
304 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
305 controlPoint1X = 10.5;
306 controlPoint1Y = 137.889;
307 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
308 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
309 controlPoint2X = 14.111;
310 controlPoint2Y = 141.5;
311 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
312 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
313 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
314 pointX = 169.5;
315 pointY = 141.5;
316 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
317 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
318 context.lineTo(pointX, pointY);
319 context.closePath();
320 gradient = context.createLinearGradient(94.0, 11.5, 94.0, 141.5);
321 color = "#EE9B69";
322 gradient.addColorStop(0.0, color);
323 color = "#E38D62";
324 gradient.addColorStop(1.0, color);
325 context.fillStyle = gradient;
326 context.fill();
327
328 // Shadow Effect
329 context.restore();
330
331 context.restore();
332 },
333*/
334 //-------------------------------------------------------------------------
335
336 'updateUserDetails': function (someUserInfo) {
337 varelementName;
338
339 for (elementName in someUserInfo) {
340 this.getElement(elementName).innerHTML = someUserInfo[elementName];
341 }
342 },
343
344 //-------------------------------------------------------------------------
345 __syntaxFix__: "syntax fix"
346});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
new file mode 100644
index 0000000..05563bf
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
@@ -0,0 +1,329 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.AppController = function(args) {
32
33 this._user = null;
34 this._tabSlotNames = {
35 //tabName: slotName
36 'cards': 'cardGrid',
37 // 'directLogins':'directLoginGrid',
38 'account': 'accountPanel',
39 'data': 'dataPanel',
40 'tools': 'toolsPanel'
41 };
42
43 //controllers
44 this._cardsController= null;
45 //this._directLoginsController = null;
46 this._filterController = null; //new Clipperz.PM.UI.Web.Controllers.FilterController();
47
48 //components
49 this._appPage = null;
50 this._userInfoBox = null;
51 this._tabSidePanel = null;
52
53 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'editCard', this, 'handleEditCard');
54 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'deleteCard',this, 'handleDeleteCard');
55
56 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved',this, 'userDataSuccessfullySavedHandler');
57
58 return this;
59}
60
61MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, {
62
63 'toString': function() {
64 return "Clipperz.PM.UI.Web.Controllers.AppController";
65 },
66
67 //-----------------------------------------------------------------------------
68
69 'setUser': function(anUser) {
70 this._user = anUser;
71 },
72
73 'user': function() {
74 return this._user;
75 },
76
77 //-----------------------------------------------------------------------------
78 /*
79 'tabSlotNames': function() {
80 return this._tabSlotNames;
81 },
82*/
83 'slotNameForTab': function(aTabName) {
84 return this._tabSlotNames[aTabName];
85 },
86
87 'hideAllAppPageTabSlots': function() {
88 var aTabName;
89
90 for (aTabName in this._tabSlotNames) {
91 this.appPage().hideSlot(this.slotNameForTab(aTabName));
92 }
93 },
94
95 //-----------------------------------------------------------------------------
96
97 'appPage': function() {
98 if (this._appPage == null) {
99 this._appPage = new Clipperz.PM.UI.Web.Components.AppPage();
100 }
101
102 return this._appPage;
103 },
104
105 //-----------------------------------------------------------------------------
106
107 'tabSidePanel': function() {
108 if (this._tabSidePanel == null) {
109 this._tabSidePanel = new Clipperz.PM.UI.Web.Components.TabSidePanel();
110 }
111
112 return this._tabSidePanel;
113 },
114
115 //-----------------------------------------------------------------------------
116
117 'userInfoBox': function() {
118 if (this._userInfoBox == null) {
119 this._userInfoBox = new Clipperz.PM.UI.Web.Components.UserInfoBox();
120
121 MochiKit.Signal.connect(this._userInfoBox, 'logout',this, 'handleLogout');
122 MochiKit.Signal.connect(this._userInfoBox, 'lock', this, 'handleLock');
123 MochiKit.Signal.connect(this._userInfoBox, 'unlock',this, 'handleUnlock');
124 }
125
126 return this._userInfoBox;
127 },
128
129 //-----------------------------------------------------------------------------
130
131 'accountPanel': function () {
132 if (this._accountPanel == null) {
133 this._accountPanel = new Clipperz.PM.UI.Web.Components.AccountPanel(/*{selected:'Preferences'}*/);
134 }
135
136 return this._accountPanel;
137 },
138
139 //.........................................................................
140
141 'dataPanel': function () {
142 if (this._dataPanel == null) {
143 this._dataPanel = new Clipperz.PM.UI.Web.Components.DataPanel();
144 }
145
146 return this._dataPanel;
147 },
148
149 //.........................................................................
150
151 'toolsPanel': function () {
152 if (this._toolsPanel == null) {
153 this._toolsPanel = new Clipperz.PM.UI.Web.Components.ToolsPanel();
154 }
155
156 return this._toolsPanel;
157 },
158
159 //-----------------------------------------------------------------------------
160
161 'filterController': function () {
162 if (this._filterController == null) {
163 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
164 }
165
166 return this._filterController;
167 },
168
169 'cardsController': function() {
170 if (this._cardsController == null) {
171 this._cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':this._filterController});
172 }
173
174 return this._cardsController;
175 },
176
177 //-----------------------------------------------------------------------------
178/*
179 'directLoginsController': function() {
180//Clipperz.log(">>> AppController.directLoginsController");
181 if (this._directLoginsController == null) {
182 this._directLoginsController = new Clipperz.PM.UI.Web.Controllers.DirectLoginsController({'filterController':this._filterController});
183 }
184//Clipperz.log("<<< AppController.directLoginsController");
185
186 return this._directLoginsController;
187 },
188*/
189 //-----------------------------------------------------------------------------
190
191 'populateUserInfo': function() {
192 var deferredResult;
193
194 deferredResult = new Clipperz.Async.Deferred("AppController.populateUserInfo", {trace:false});
195 deferredResult.collectResults({
196 'username':MochiKit.Base.methodcaller('displayName'),
197 'cardsNumber':[
198 MochiKit.Base.methodcaller('getRecords'),
199 function (someResults) { return someResults.length; }
200 ],
201 'directLoginsNumber': [
202 MochiKit.Base.methodcaller('getDirectLogins'),
203 function (someResults) { return someResults.length; }
204 ]
205 })
206 deferredResult.addMethod(this.userInfoBox(), 'updateUserDetails');
207 deferredResult.callback(this.user());
208
209 return deferredResult;
210 },
211
212 //-----------------------------------------------------------------------------
213
214 'run': function(args) {
215 var deferredResult;
216 varslot;
217 varpage;
218 var user;
219
220 slot = args.slot;
221 user = args.user;
222
223 this.setUser(user);
224
225 slot.setContent(this.appPage());
226
227 this.appPage().slotNamed('userInfoBox').setContent(this.userInfoBox());
228 this.appPage().slotNamed('tabSidePanel').setContent(this.tabSidePanel());
229
230 this.appPage().slotNamed('accountPanel').setContent(this.accountPanel());
231 this.appPage().slotNamed('dataPanel').setContent(this.dataPanel());
232 this.appPage().slotNamed('toolsPanel').setContent(this.toolsPanel());
233
234 this.hideAllAppPageTabSlots();
235 this.appPage().showSlot(this.slotNameForTab('cards'));
236
237 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected',this, 'handleTabSelected');
238 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard');
239 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard');
240
241 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false});
242
243 deferredResult.addMethod(this.cardsController(), 'run', {slot:this.appPage().slotNamed('cardGrid'), user:user});
244 // deferredResult.addMethod(this.directLoginsController(), 'run', {slot:this.appPage().slotNamed('directLoginGrid'), user:user});
245 deferredResult.addMethod(this, 'populateUserInfo');
246
247 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0});
248 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN');
249 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards');
250 deferredResult.callback();
251 },
252
253 //-----------------------------------------------------------------------------
254
255 'handleTabSelected': function (selectedTabName) {
256 var aTabName;
257 var aSlotName;
258
259//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName);
260 this.hideAllAppPageTabSlots();
261 this.appPage().showSlot(this.slotNameForTab(selectedTabName));
262
263 switch (selectedTabName) {
264 case 'cards':
265 this.cardsController().focus();
266 break;
267 // case 'directLogins':
268 // this.directLoginsController().focus();
269 // break;
270 case 'data':
271 break;
272 case 'account':
273 break;
274 case 'tools':
275 break;
276 }
277//Clipperz.log("<-- AppController.handleTabSelected", aTabName);
278 },
279
280 //=============================================================================
281
282 'handleAddCard': function (aSourceElement) {
283//Clipperz.log("=== AppController.addCard", aSourceElement);
284 this.cardsController().addCard(aSourceElement);
285 },
286
287 //=============================================================================
288
289 'userDataSuccessfullySavedHandler': function (anEvent) {
290 this.populateUserInfo();
291 },
292
293 //=============================================================================
294
295 'handleLogout': function(anEvent) {
296 var deferredResult;
297
298 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false});
299 deferredResult.addMethod(this.user(), 'logout');
300 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout');
301 deferredResult.callback();
302
303 return deferredResult;
304 },
305
306 //-----------------------------------------------------------------------------
307
308 'handleLock': function (anEvent) {
309 return Clipperz.Async.callbacks("AppController.handleLock", [
310 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'),
311 MochiKit.Base.method(this.user(), 'lock')
312 ], {trace:false});
313 },
314
315 //.............................................................................
316
317 'handleUnlock': function (anEvent) {
318 return Clipperz.Async.callbacks("AppController.handleUnock", [
319 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'),
320 MochiKit.Base.method(this.user(), 'login'),
321 MochiKit.Base.method(this.cardsController(), 'focus'),
322 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'),
323 MochiKit.Base.method(this.userInfoBox(), 'unlock')
324 ], {trace:false});
325 },
326
327 //=============================================================================
328 __syntaxFix__: "syntax fix"
329});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
new file mode 100644
index 0000000..2340aeb
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
@@ -0,0 +1,652 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.CardDialogController = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Controllers.CardDialogController.superclass.constructor.call(this, args);
35
36 this._record = args.record || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._delegate = args.delegate || Clipperz.Base.exception.raise('MandatoryParameter');
38
39 this._referenceElement = null;
40 this._cardDialogComponent = null;
41
42 this._fieldsReferences = {};
43 this._directLoginReferences = {};
44
45 this._directLoginWizardController = null;
46 this._directLoginEditingComponent = null;
47 this._isDirectLoginEditingComponentVisible = false;
48
49 return this;
50};
51
52Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object, {
53
54 'toString': function() {
55 return "Clipperz.PM.UI.Web.Controllers.CardDialogController";
56 },
57
58 //-------------------------------------------------------------------------
59
60 'record': function () {
61 return this._record;
62 },
63
64 'delegate': function () {
65 return this._delegate;
66 },
67
68 //-------------------------------------------------------------------------
69
70 'fieldsReferences': function () {
71 return this._fieldsReferences;
72 },
73
74 'directLoginReferences': function () {
75 return this._directLoginReferences;
76 },
77
78 //-------------------------------------------------------------------------
79
80 'referenceElement': function () {
81 return this._referenceElement;
82 },
83
84 'setReferenceElement': function (anElement) {
85 this._referenceElement = anElement;
86 },
87
88 //-------------------------------------------------------------------------
89
90 'cardDialogComponent': function () {
91 if (this._cardDialogComponent == null) {
92 this._cardDialogComponent = new Clipperz.PM.UI.Web.Components.CardDialogComponent();
93
94 MochiKit.Signal.connect(this._cardDialogComponent, 'cancel', this, 'handleCancel');
95 MochiKit.Signal.connect(this._cardDialogComponent, 'save', this, 'handleSave');
96
97 MochiKit.Signal.connect(this._cardDialogComponent, 'addField', this, 'handleAddField');
98 MochiKit.Signal.connect(this._cardDialogComponent, 'changedValue',this, 'handleChangedValue');
99
100 MochiKit.Signal.connect(this._cardDialogComponent, 'addDirectLogin',this, 'handleAddDirectLogin');
101 MochiKit.Signal.connect(this._cardDialogComponent, 'keyPressed',this, 'handleCardDialogComponentKeyPressed');
102 }
103
104 return this._cardDialogComponent;
105 },
106
107 //=========================================================================
108
109 'directLoginWizardController': function () {
110 if (this._directLoginWizardController == null) {
111 this._directLoginWizardController = new Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController({
112 'cardLabel': this.cardDialogComponent().title(),
113 'directLoginEditingComponent': this.directLoginEditingComponent()
114 })
115
116 MochiKit.Signal.connect(this._directLoginWizardController, 'exit',this, 'handleHideDirectLoginEditingComponent');
117 MochiKit.Signal.connect(this._directLoginWizardController, 'done',this, 'handleCompleteDirectLoginEditingComponent');
118 }
119
120 return this._directLoginWizardController;
121 },
122
123 //-------------------------------------------------------------------------
124
125 'directLoginEditingComponent': function () {
126 if (this._directLoginEditingComponent == null) {
127 this._directLoginEditingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent();
128
129 this.cardDialogComponent().renderDirectLoginEditingComponent(this._directLoginEditingComponent);
130
131 // MochiKit.Signal.connect(this._directLoginEditingComponent, 'back', this, 'handleHideDirectLoginEditingComponent')
132 // MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue');
133 // MochiKit.Signal.connect(this.__directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed');
134 }
135
136 return this._directLoginEditingComponent;
137 },
138
139 //-------------------------------------------------------------------------
140
141 'isDirectLoginEditingComponentVisible': function () {
142 return this._isDirectLoginEditingComponentVisible;
143 },
144
145 'setIsDirectLoginEditingComponentVisible': function (aValue) {
146 this._isDirectLoginEditingComponentVisible = aValue;
147 },
148
149 //=========================================================================
150
151 'run': function (anElement) {
152 var deferredResult;
153
154 this.setReferenceElement(anElement);
155
156 deferredResult = new Clipperz.Async.Deferred("CardDialogController.run", {trace:false});
157 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':11});
158
159 deferredResult.addMethod(this.cardDialogComponent(), 'deferredShowModal', {openFromElement:this.referenceElement()});
160 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
161
162 deferredResult.addMethod(this.record(), 'label');
163 deferredResult.addMethod(this.cardDialogComponent(), 'setTitle');
164 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
165
166 deferredResult.addMethod(this, 'updateComponentState');
167 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
168 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone');
169
170 deferredResult.addMethod(this.cardDialogComponent(), 'fixRendering');
171 deferredResult.addMethod(this.cardDialogComponent(), 'hideProgressMask');
172
173 if (this.record().isBrandNew()) {
174 deferredResult.addMethod(this.cardDialogComponent(), 'setHintMode', 'ON');
175 deferredResult.addMethod(this.cardDialogComponent(), 'setFocusOnTitleField');
176 }
177
178 deferredResult.addErrback(MochiKit.Base.method(this.cardDialogComponent(), 'showError'));
179 deferredResult.callback();
180
181 return deferredResult;
182 },
183
184 //=========================================================================
185
186 'updateComponentState': function () {
187 return Clipperz.Async.callbacks("CardDialogController.updateComponentState", [
188 MochiKit.Base.method(this.record(), 'hasPendingChanges'),
189 MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving'),
190
191 MochiKit.Base.method(this.record(), 'label'),
192 MochiKit.Base.method(this.cardDialogComponent(), 'setTitle'),
193 MochiKit.Base.method(this.record(), 'notes'),
194 MochiKit.Base.method(this.cardDialogComponent(), 'setNotes'),
195
196 MochiKit.Base.method(this.record(), 'fields'),
197 MochiKit.Base.values,
198 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithField')),
199
200 MochiKit.Base.method(this.record(), 'directLogins'),
201 MochiKit.Base.values,
202 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin')),
203
204 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
205 MochiKit.Base.noop
206 ], {trace:false});
207 },
208
209 //-------------------------------------------------------------------------
210
211 'addCardDialogComponentWithField': function (aField) {
212 varfieldComponent;
213
214 fieldComponent = new Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent({reference: aField.reference()});
215 MochiKit.Signal.connect(fieldComponent, 'changedValue',this, 'handleChangedValue');
216 MochiKit.Signal.connect(fieldComponent, 'performAction',this, 'handlePerformFieldAction');
217 MochiKit.Signal.connect(fieldComponent, 'deleteField',this, 'handleDeleteField');
218
219 // this.fieldsReferences().push({'field':aField, 'component':fieldComponent});
220 this.fieldsReferences()[aField.reference()] = {'field':aField, 'component':fieldComponent};
221
222 return Clipperz.Async.callbacks("CardDialogController.addCardDialogComponentWithField", [
223 MochiKit.Base.method(this.cardDialogComponent(), 'addFieldRowComponent', fieldComponent),
224
225 MochiKit.Base.method(aField, 'label'),
226 MochiKit.Base.method(fieldComponent, 'setLabel'),
227 MochiKit.Base.method(aField, 'value'),
228 MochiKit.Base.method(fieldComponent, 'setValue'),
229 MochiKit.Base.method(aField, 'actionType'),
230 MochiKit.Base.method(fieldComponent, 'setActionType'),
231 MochiKit.Base.method(aField, 'isHidden'),
232 MochiKit.Base.method(fieldComponent, 'setIsHidden')
233 ], {trace:false});
234 },
235
236 //-------------------------------------------------------------------------
237
238 'addCardDialogComponentWithDirectLogin': function (aDirectLogin) {
239 var directLoginComponent;
240
241 directLoginComponent = new Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent({reference: aDirectLogin.reference()});
242 MochiKit.Signal.connect(directLoginComponent, 'changedValue', this, 'handleChangedValue');
243 MochiKit.Signal.connect(directLoginComponent, 'deleteDirectLogin',this, 'handleDeleteDirectLogin');
244 MochiKit.Signal.connect(directLoginComponent, 'editDirectLogin',this, 'handleEditDirectLogin');
245 MochiKit.Signal.connect(directLoginComponent, 'openDirectLogin',this, 'handleOpenDirectLogin');
246
247 this.directLoginReferences()[aDirectLogin.reference()] = {'directLogin':aDirectLogin, 'component':directLoginComponent};
248
249 return Clipperz.Async.callbacks("CardDialogController.addCardDialogComponentWithDirectLogin", [
250 MochiKit.Base.method(this.cardDialogComponent(), 'addDirectLoginComponent', directLoginComponent),
251 MochiKit.Base.method(this, 'refreshDirectLoginComponent', this.directLoginReferences()[aDirectLogin.reference()])
252 ], {trace:false});
253 },
254
255 //-------------------------------------------------------------------------
256
257 'refreshDirectLoginComponent': function (aDirectLoginReference) {
258 return Clipperz.Async.callbacks("CardDialogController.refreshDirectLoginComponent", [
259 MochiKit.Base.method(aDirectLoginReference['directLogin'],'favicon'),
260 // MochiKit.Base.method(aDirectLoginReference['directLogin'],'faviconData'),
261 MochiKit.Base.method(aDirectLoginReference['component'],'setFavicon'),
262 MochiKit.Base.method(aDirectLoginReference['directLogin'],'label'),
263 MochiKit.Base.method(aDirectLoginReference['component'],'setLabel')
264 ], {trace:false});
265 },
266
267 'refreshDirectLoginComponents': function () {
268 return Clipperz.Async.callbacks("CardDialogController.refreshDirectLoginComponents", [
269 MochiKit.Base.method(this, 'directLoginReferences'),
270 MochiKit.Base.values,
271 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'refreshDirectLoginComponent')),
272 Clipperz.Async.collectAll
273 ])
274 },
275
276 //-------------------------------------------------------------------------
277
278 'updateRecordValues': function () {
279 return Clipperz.Async.callbacks('CardDialogController.updateRecordValues', [
280 MochiKit.Base.method(this.cardDialogComponent(), 'title'),
281 MochiKit.Base.method(this.record(), 'setLabel'),
282 MochiKit.Base.method(this.cardDialogComponent(), 'notes'),
283 MochiKit.Base.method(this.record(), 'setNotes'),
284
285 MochiKit.Base.method(this, 'fieldsReferences'),
286 MochiKit.Base.values,
287 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordFieldValues')),
288
289 MochiKit.Base.method(this, 'directLoginReferences'),
290 MochiKit.Base.values,
291 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordDirectLoginValues')),
292
293 MochiKit.Base.method(this.directLoginEditingComponent(), 'directLoginReference'),
294 MochiKit.Base.method(this.record(), 'directLoginWithReference'),
295 MochiKit.Base.method(this, 'updateRecordDirectLoginDetails'),
296
297 MochiKit.Base.noop
298 ], {trace:false});
299 },
300
301 //-------------------------------------------------------------------------
302
303 'updateRecordFieldValues': function (aFieldReference) {
304 var deferredResult;
305
306 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordFieldValues', [
307 MochiKit.Base.method(aFieldReference['component'],'label'),
308 MochiKit.Base.method(aFieldReference['field'], 'setLabel'),
309
310 MochiKit.Base.method(aFieldReference['component'],'value'),
311 MochiKit.Base.method(aFieldReference['field'], 'setValue'),
312
313 MochiKit.Base.method(aFieldReference['component'],'isHidden'),
314 MochiKit.Base.method(aFieldReference['field'], 'setIsHidden'),
315
316 MochiKit.Base.method(aFieldReference['field'], 'actionType'),
317 MochiKit.Base.method(aFieldReference['component'],'setActionType')
318 ], {trace:false});
319
320 return deferredResult;
321 },
322
323 //-------------------------------------------------------------------------
324
325 'updateRecordDirectLoginValues': function (aDirectLoginReference) {
326 var deferredResult;
327
328 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordDirectLoginValues', [
329 MochiKit.Base.method(aDirectLoginReference['component'], 'label'),
330 MochiKit.Base.method(aDirectLoginReference['directLogin'], 'setLabel')
331 ], {trace:false});
332
333 return deferredResult;
334 },
335
336 //-------------------------------------------------------------------------
337
338 'updateRecordDirectLoginDetails': function (aDirectLogin) {
339 var result;
340
341 if (MochiKit.Base.isUndefinedOrNull(aDirectLogin)) {
342 result = MochiKit.Async.succeed();
343 } else {
344 result = Clipperz.Async.callbacks("CardDialogController.updateRecordDirectLoginDetails", [
345 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
346 MochiKit.Base.method(aDirectLogin, 'setLabel'),
347 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
348 MochiKit.Base.method(aDirectLogin, 'setFavicon')
349 ], {trace:false});
350 }
351
352 return result;
353 },
354
355 //=========================================================================
356
357 'addField': function () {
358 return this.record().addField({
359 'label':this.cardDialogComponent().newFieldLabel(),
360 'value':this.cardDialogComponent().newFieldValue(),
361 'isHidden':this.cardDialogComponent().newFieldIsHidden()
362 });
363 },
364
365 'handleAddField': function () {
366 return Clipperz.Async.callbacks("CardDialogController.handleAddField", [
367 MochiKit.Base.method(this, 'addField'),
368
369 MochiKit.Base.method(this, 'addCardDialogComponentWithField'),
370 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
371
372 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
373 MochiKit.Base.method(this, 'handleChangedValue')
374 ], {trace:false})
375 },
376
377 //-------------------------------------------------------------------------
378
379 'handlePerformFieldAction': function (aFieldID, aTargetElement) {
380//console.log("### targetElement", aTargetElement);
381 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
382 MochiKit.Base.method(this.record(), 'fields'),
383 MochiKit.Base.itemgetter(aFieldID),
384 Clipperz.Async.collectResults("CardDialogController.handleDeleteField <collect results>", {
385 'value':MochiKit.Base.methodcaller('value'),
386 'type': MochiKit.Base.methodcaller('actionType')
387 }, {trace:false}),
388 MochiKit.Base.bind(function (someValues) {
389 switch (someValues['type']) {
390 case 'NONE':
391 throw "this event handler should not be triggered for fields with type 'NONE'";
392 break;
393 case 'URL':
394 var url;
395
396 url = someValues['value'];
397 if (/^https?\:\/\//.test(url) == false) {
398 url = 'http://' + url;
399 }
400
401 window.open(url);
402 break;
403 case 'EMAIL':
404 var url;
405
406 url = 'mailto:' + someValues['value'];
407
408 MochiKit.DOM.currentWindow().location = url;
409 break;
410 case 'PASSWORD':
411//Clipperz.log("SHOW PASSWORD " + someValues['value']);
412 this.showPasswordTooltip(someValues['value'], aTargetElement);
413 break;
414 }
415 }, this)
416 ], {trace:false});
417 },
418
419 //-------------------------------------------------------------------------
420
421 'handleDeleteField': function (aFieldID) {
422 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
423 MochiKit.Base.method(this.record(), 'fields'),
424 MochiKit.Base.itemgetter(aFieldID),
425 MochiKit.Base.method(this.record(), 'removeField'),
426
427 MochiKit.Base.method(this, 'fieldsReferences'),
428 MochiKit.Base.itemgetter(aFieldID),
429 MochiKit.Base.itemgetter('component'),
430
431 function (aComponent) {
432 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField [fade and remove]", [
433 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
434 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
435 MochiKit.Base.method(aComponent, 'remove')
436 ], {trace:false});
437 },
438
439 MochiKit.Base.bind(function () {
440 delete this.fieldsReferences()[aFieldID];
441 }, this),
442
443 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
444 MochiKit.Base.method(this, 'handleChangedValue')
445 ], {trace:false});
446 },
447
448 //=========================================================================
449
450 'handleDeleteDirectLogin': function(aDirectLoginReference) {
451 var cardDialogComponent;
452
453 cardDialogComponent = this.cardDialogComponent();
454
455 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin", [
456 MochiKit.Base.method(this.record(), 'directLogins'),
457 MochiKit.Base.itemgetter(aDirectLoginReference),
458 MochiKit.Base.methodcaller('remove'),
459
460 MochiKit.Base.method(this, 'directLoginReferences'),
461 MochiKit.Base.itemgetter(aDirectLoginReference),
462 MochiKit.Base.itemgetter('component'),
463
464 function (aComponent) {
465 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin [fade and remove]", [
466 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),// Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
467 /// MochiKit.Base.method(aComponent, 'remove')
468 MochiKit.Base.method(cardDialogComponent, 'removeDirectLoginComponent', aComponent)
469 ], {trace:false});
470 },
471
472 MochiKit.Base.bind(function () {
473 delete this.directLoginReferences()[aDirectLoginReference];
474 }, this),
475
476 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
477 MochiKit.Base.method(this, 'handleChangedValue')
478 ], {trace:false});
479 },
480
481 //-------------------------------------------------------------------------
482
483 'handleOpenDirectLogin': function (aDirectLoginReference) {
484 return Clipperz.Async.callbacks("CardDialogController.handleOpenDirectLogin", [
485 MochiKit.Base.method(this.record(), 'directLoginWithReference', aDirectLoginReference),
486 Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin
487 ], {trace:false});
488 },
489
490 //-------------------------------------------------------------------------
491
492 'handleEditDirectLogin': function (aDirectLoginReference) {
493 return Clipperz.Async.callbacks("CardDialogController.handleEditDirectLogin", [
494 MochiKit.Base.method(this, 'setIsDirectLoginEditingComponentVisible', true),
495 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginReference', aDirectLoginReference),
496 MochiKit.Base.method(this.cardDialogComponent(), 'placeDirectLoginEditingComponent'),
497 MochiKit.Base.method(this.record(), 'directLoginWithReference', aDirectLoginReference),
498 MochiKit.Base.method(this.directLoginWizardController(), 'runWithDirectLogin'),
499 MochiKit.Base.method(this.directLoginWizardController(), 'fixRulerRendering', this.cardDialogComponent().displayMode()),
500 MochiKit.Base.method(this.cardDialogComponent(), 'showDirectLoginEditingComponent')
501 ], {trace:false});
502 },
503
504 //-------------------------------------------------------------------------
505
506 'handleHideDirectLoginEditingComponent': function () {
507 return Clipperz.Async.callbacks("CardDialogController.handleHideDirectLoginEditingComponent", [
508 MochiKit.Base.method(this, 'setIsDirectLoginEditingComponentVisible', false),
509 MochiKit.Base.method(this.directLoginWizardController(), 'hideRuler'),
510 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginReference', null),
511 MochiKit.Base.method(this, 'refreshDirectLoginComponents'),
512 MochiKit.Base.method(this.cardDialogComponent(), 'hideDirectLoginEditingComponent')
513 ], {trace:false})
514 },
515
516 'handleCompleteDirectLoginEditingComponent': function (someParameters) {
517 return Clipperz.Async.callbacks("CardDialogController.handleCompleteDirectLoginEditingComponent", [
518 MochiKit.Base.method(this, 'setIsDirectLoginEditingComponentVisible', false),
519 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginReference', null),
520 MochiKit.Base.partial(MochiKit.Async.succeed, someParameters['hasJustBeenAdded']),
521 Clipperz.Async.deferredIf("CardDialogController.handleCompleteDirectLoginEditingComponent - should addTheEditedDirectLogin", [
522 MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin', someParameters['directLogin'])
523 ], []),
524 MochiKit.Base.method(this, 'refreshDirectLoginComponents'),
525 MochiKit.Base.method(this, 'handleChangedValue'),
526 MochiKit.Base.method(this.cardDialogComponent(), 'hideDirectLoginEditingComponent')
527 ], {trace:false})
528 },
529
530 //=========================================================================
531
532 'handleChangedValue': function () {
533 return Clipperz.Async.callbacks("CardDialogController.handleChangedValue", [
534 MochiKit.Base.method(this, 'updateRecordValues'),
535 MochiKit.Base.method(this.record(), 'hasPendingChanges'),
536 MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving')
537 ], {trace:false});
538 },
539
540 //-------------------------------------------------------------------------
541
542 'handleSave': function () {
543 var deferredResult;
544
545 deferredResult = new Clipperz.Async.Deferred("CardDialogController.handleSave", {trace:false});
546 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':8});
547 deferredResult.addMethod(this.cardDialogComponent(), 'showProgressMask');
548 deferredResult.addMethod(this.cardDialogComponent(), 'newFieldHasPendingChanges');
549 deferredResult.addIf([
550 MochiKit.Base.method(this, 'addField')
551 ], [])
552 deferredResult.addMethod(this, 'saveChanges');
553 deferredResult.addMethod(this.cardDialogComponent(), 'deferredHideModal', {closeToElement:null});
554 deferredResult.addMethod(this.cardDialogComponent(), 'remove');
555 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed');
556
557 deferredResult.callback();
558
559 return deferredResult;
560 },
561
562 //.........................................................................
563
564 'saveChanges': function () {
565 var deferredResult;
566
567 deferredResult = new Clipperz.Async.Deferred("CardDialogController.handleSave", {trace:false});
568 deferredResult.addMethod(this.delegate(), 'saveChanges');
569deferredResult.addErrback(function (aValue) { Clipperz.log("SHIT HAPPENS!!"); return aValue; });
570
571 deferredResult.callback();
572
573 return deferredResult;
574 },
575
576 //-------------------------------------------------------------------------
577
578 'handleCancel': function () {
579 var deferredResult;
580
581 if (this.isDirectLoginEditingComponentVisible()) {
582 deferredResult = this.handleHideDirectLoginEditingComponent();
583 } else {
584 deferredResult = new Clipperz.Async.Deferred("CardDialogController.handleCancel", {trace:false});
585 // deferredResult.addMethod(this.record(), 'hasPendingChanges'),
586 deferredResult.addMethod(this.delegate(), 'hasPendingChanges'),
587 deferredResult.addIf([
588 MochiKit.Base.method(this.cardDialogComponent(), 'askConfirmationForLoosingPendingChanges')
589 ], [])
590 deferredResult.addMethod(this.delegate(), 'revertChanges');
591 deferredResult.addMethod(this.cardDialogComponent(), 'deferredHideModal', {closeToElement:this.referenceElement()});
592 deferredResult.addMethod(this.cardDialogComponent(), 'remove');
593 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed');
594
595 deferredResult.callback();
596 }
597
598 return deferredResult;
599 },
600
601 //-------------------------------------------------------------------------
602
603 'handleAddDirectLogin': function () {
604 return Clipperz.Async.callbacks("CardDialogController.handleAddDirectLogin", [
605 MochiKit.Base.method(this.record(), 'createNewDirectLogin'),
606 MochiKit.Base.bind(function (aDirectLogin) {
607 return Clipperz.Async.callbacks("CardDialogController.handleAddDirectLogin - directLogin", [
608 MochiKit.Base.method(this.cardDialogComponent(), 'newFieldHasPendingChanges'),
609 Clipperz.Async.deferredIf("cardDialogComponent.newFieldHasPendingChanges", [
610 MochiKit.Base.method(this, 'handleAddField')
611 ], []),
612
613 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginReference', aDirectLogin.reference()),
614 MochiKit.Base.method(this.cardDialogComponent(), 'placeDirectLoginEditingComponent'),
615 MochiKit.Base.method(this.directLoginWizardController(), 'runWithDirectLogin', aDirectLogin, true),
616 MochiKit.Base.method(this.directLoginWizardController(), 'fixRulerRendering', this.cardDialogComponent().displayMode()),
617 MochiKit.Base.method(this.cardDialogComponent(), 'showDirectLoginEditingComponent')
618 ], {trace:false});
619 }, this)
620 ], {trace:false});
621 },
622
623 //=========================================================================
624
625 'handleCardDialogComponentKeyPressed': function (anEvent) {
626 if ((anEvent.key().string == 'KEY_TAB') && this.cardDialogComponent().newFieldHasPendingChanges()) {
627 anEvent.preventDefault();
628
629 // MochiKit.Signal.signal(this.cardDialogComponent(), 'addField');
630 this.handleAddField()
631 this.cardDialogComponent().focusOnNewFieldLabel();
632 }
633 },
634
635 //=========================================================================
636
637 'showPasswordTooltip': function (aValue, anElement) {
638 varpasswordTooltip;
639
640 passwordTooltip = new Clipperz.PM.UI.Web.Components.PasswordTooltip({
641 'referebceElement': anElement,
642 'text': aValue
643 });
644
645 passwordTooltip.show();
646
647
648 },
649
650 //=========================================================================
651 __syntaxFix__: "syntax fix"
652});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
new file mode 100644
index 0000000..b1a34b2
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
@@ -0,0 +1,207 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.CardsController = function() {
32 Clipperz.PM.UI.Web.Controllers.CardsController.superclass.constructor.apply(this, arguments);
33
34 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed', this, 'handleHideCard');
35
36 return this;
37}
38
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardsController, Clipperz.PM.UI.Web.Controllers.GridController, {
40
41 'toString': function() {
42 return "Clipperz.PM.UI.Web.Controllers.CardsController";
43 },
44
45 'createGrid': function () {
46 var grid;
47
48 grid = new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
49 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
50 'name': 'Cards.favicon',
51 'selector': MochiKit.Base.methodcaller('favicon'),
52 'cssClass': 'favicon'
53 }),
54 new Clipperz.PM.UI.Web.Components.LinkColumnManager({
55 'name': 'Cards.title',
56 'selector': MochiKit.Base.methodcaller('label'),
57 'label': 'title',
58 'cssClass': 'title',
59 'comparator': Clipperz.Base.caseInsensitiveCompare,
60 'sortable': true,
61 'sorted': 'ASCENDING',
62 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'editCard', {objectData:anObject, element:anEvent.src()})}
63 'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
64 }),
65 new Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager({
66 'name': 'Cards.directLogins',
67 'selector': MochiKit.Base.methodcaller('directLoginReferences'),
68 'label': 'direct logins',
69 'cssClass': 'directLogin'
70 }),
71 new Clipperz.PM.UI.Web.Components.DateColumnManager({
72 'name': 'Cards.latestUpdate',
73 'selector': MochiKit.Base.methodcaller('updateDate'),
74 'label': 'latest update',
75 'cssClass': 'latestUpdate',
76 'format': 'd-m-Y',
77 'comparator': MochiKit.Base.compare,
78 'sortable': true,
79 'sorted': 'UNSORTED'
80 }),
81 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
82 'name': 'Cards.delete',
83 'selector': MochiKit.Base.noop,
84 'cssClass': 'delete',
85 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteCard', {objectData:anObject, element:anEvent.src()})}
86 'actionMethod': MochiKit.Base.method(this, 'handleDeleteCard')
87 })
88 ]});
89
90 grid.setComponentForSlotNamed(new Clipperz.PM.UI.Web.Components.BookmarkletComponent(), 'headerSlot');
91
92 return grid;
93 },
94
95 //-----------------------------------------------------------------------------
96
97 'getRows': function () {
98 //TODO relying on user() in GridController, bad code smell :|
99 return this.user().getRecords();
100 },
101
102 //=============================================================================
103
104 'displayEmptyContent': function () {
105 varemptyGridComponent;
106
107 emptyGridComponent = new Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent();
108
109 return Clipperz.Async.callbacks("CardsController.displayEmptyContent", [
110 MochiKit.Base.method(this.grid(), 'setNoRowsGridComponent', emptyGridComponent),
111 MochiKit.Base.bind(Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displayEmptyContent, this)
112 ], {trace:false});
113 },
114
115 'displaySelectedRows': function (aFilter) {
116 this.columnManagerWithName('Cards.directLogins').hideDirectLoginListPopup();
117
118 return Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displaySelectedRows.apply(this, arguments);
119 },
120
121 //=============================================================================
122
123 'handleShowCard': function (anObject, anEvent) {
124 var cardDialogController;
125
126 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject, delegate:this});
127 this.grid().selectRow(anObject);
128
129 cardDialogController.run(anEvent.src());
130 },
131
132 //.........................................................................
133
134 'handleHideCard': function () {
135 this.focus();
136 },
137
138 //-----------------------------------------------------------------------------
139
140 'addCard': function (aSourceElement) {
141 return Clipperz.Async.callbacks("CardsController.addCard", [
142 Clipperz.Async.collectResults("CardsController.addCard <inner results>", {
143 'record': MochiKit.Base.method(this.user(), 'createNewRecord'),
144 'delegate':MochiKit.Base.partial(MochiKit.Async.succeed, this)
145 }, {trace:false}),
146 function (someParameters) {
147 return new Clipperz.PM.UI.Web.Controllers.CardDialogController(someParameters);
148 },
149 MochiKit.Base.methodcaller('run', aSourceElement)
150 ], {trace:false});
151 },
152
153 //-----------------------------------------------------------------------------
154
155 'handleDeleteCard': function (anObject, anEvent) {
156 var deferredResult;
157 var confirmationDialog;
158
159 // confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
160 confirmationDialog = new Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar({
161 'title':"Delete Card",
162 'text': "Do you want to delete …",
163 'type': 'ALERT',
164 'buttons': [
165 {text:"Cancel",result:'CANCEL'},
166 {text:"Delete", result:'OK', isDefault:true}
167 ],
168 'canCancelWhileProcessing':false
169 });
170
171 deferredResult = new Clipperz.Async.Deferred("AppController.handleDeleteCard", {trace:false});
172 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':5}),
173 deferredResult.addMethod(this.grid(), 'selectRow', anObject);
174 deferredResult.addMethod(confirmationDialog, 'deferredShowModal', {
175 'openFromElement': anEvent.src(),
176 'onOkCloseToElement': null, //MochiKit.DOM.currentDocument().body,
177 'onCancelCloseToElement':anEvent.src()
178 });
179 // deferredResult.addCallback(function () { Clipperz.log("DELETE: " + anObject.toString(), anObject); });
180 deferredResult.addMethod(this.user(), 'deleteRecord', anObject);
181 deferredResult.addBothPass(MochiKit.Base.method(this.grid(), 'unselectRow', anObject));
182 deferredResult.addMethod(this, 'saveChanges');
183 deferredResult.addMethod(confirmationDialog, 'deferredDone');
184 deferredResult.addErrbackPass(function (anError) {
185 var result;
186
187 if (! (anError instanceof MochiKit.Async.CancelledError)) {
188 result = confirmationDialog.deferredError({
189 'type': 'ALERT',
190 'title':"Error",
191 'text': Clipperz.PM.Strings.errorDescriptionForException(anError),
192 'buttons':[{text:"Close", result:'CANCEL', isDefault:true}]
193 })
194 } else {
195 result = anError;
196 }
197
198 return result;
199 });
200 deferredResult.callback();
201
202 return deferredResult;
203 },
204
205 //=============================================================================
206 __syntaxFix__: "syntax fix"
207});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
new file mode 100644
index 0000000..38fdc08
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
@@ -0,0 +1,611 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController = function(args) {
32 this._directLoginEditingComponent = args.directLoginEditingComponent|| Clipperz.Base.exception.raise('MandatoryParameter');
33 this._cardLabel = args.cardLabel || Clipperz.Base.exception.raise('MandatoryParameter');
34
35 MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue');
36 MochiKit.Signal.connect(this._directLoginEditingComponent, 'moveForward',this, 'handleMoveForward');
37 MochiKit.Signal.connect(this._directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed');
38
39 this._directLogin = null;
40 this._directLoginHasJustBeenAdded = false;
41
42 this._rulerComponent = null;
43
44 this._steps = null;
45 this._currentStepIndex = 0;
46 this._isNextEnabled = false;
47
48 this._recordFields = null;
49 this._originalBindings = null;
50
51 this._bindingComponents = [];
52 this._formValueComponents = [];
53
54 return this;
55}
56
57MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.prototype, {
58
59 'toString': function() {
60 return "Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController";
61 },
62
63 //-------------------------------------------------------------------------
64
65 'directLogin': function () {
66 return this._directLogin;
67 },
68
69 //-------------------------------------------------------------------------
70
71 'directLoginHasJustBeenAdded': function () {
72 return this._directLoginHasJustBeenAdded;
73 },
74
75 'setDirectLoginHasJustBeenAdded': function (aValue) {
76 this._directLoginHasJustBeenAdded = aValue;
77 },
78
79 //-------------------------------------------------------------------------
80
81 'directLoginEditingComponent': function () {
82 return this._directLoginEditingComponent;
83 },
84
85 //=============================================================================
86
87 'cardLabel': function () {
88 return this._cardLabel;
89 },
90
91 //=============================================================================
92
93 'resetCurrentStepIndex': function () {
94 this._currentStepIndex = 0;
95 this.rulerComponent().resetStatus();
96 },
97
98 //-----------------------------------------------------------------------------
99
100 'enableNext': function (aValue) {
101 this.rulerComponent().enableNext(aValue);
102 this._isNextEnabled = aValue;
103 },
104
105 'isNextEnabled': function () {
106 return this._isNextEnabled;
107 },
108
109 //-----------------------------------------------------------------------------
110
111 'enablePrevious': function (aValue) {
112 this.rulerComponent().enablePrevious(aValue);
113 },
114
115 //=============================================================================
116
117 'bindingComponents': function () {
118 return this._bindingComponents;
119 },
120
121 'resetBindingComponents': function () {
122 this.directLoginEditingComponent().clearAllBindingsComponents();
123 this._bindingComponents = [];
124 },
125
126 //=============================================================================
127
128 'formValueComponents': function () {
129 return this._formValueComponents;
130 },
131
132 'resetFormValueComponents': function () {
133 this.directLoginEditingComponent().clearAllFormValueComponents();
134 this._formValueComponents = [];
135 },
136
137 //=============================================================================
138
139 'recordFields': function () {
140 return this._recordFields;
141 },
142
143 'setRecordFields': function (aValue) {
144 this._recordFields = aValue;
145 },
146
147 'recordFieldWithReference': function (aReference) {
148 var matchingValues;
149 var result;
150
151 matchingValues = MochiKit.Base.filter(function (aField) { return aField['reference'] == aReference; }, this.recordFields());
152
153 if (matchingValues.length == 0) {
154 result = null;
155 } else {
156 result = matchingValues[0];
157 }
158
159 return result;
160 },
161
162 //-----------------------------------------------------------------------------
163
164 'originalBindings': function () {
165 return this._originalBindings;
166 },
167
168 'setOriginalBindings': function (aValue) {
169//console.log("BINDINGS", aValue);
170 this._originalBindings = aValue;
171 },
172
173 //=============================================================================
174
175 'rulerComponent': function () {
176 if (this._rulerComponent == null) {
177 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
178 translationContext:'Wizards.DirectLoginWizard'
179 });
180 this._rulerComponent.render();
181
182 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
183 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
184 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward');
185 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward');
186 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved');
187 }
188
189 return this._rulerComponent;
190 },
191
192 //-----------------------------------------------------------------------------
193
194 'showRuler': function (someSteps) {
195 var rulerElement;
196
197 this.setSteps(someSteps);
198
199 rulerElement = this.rulerComponent().element();
200 this.directLoginEditingComponent().disableAllPanels();
201
202 MochiKit.Style.showElement(rulerElement);
203 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.directLoginEditingComponent().bottomMargin()});
204 new MochiKit.Visual.Move(rulerElement, {
205 x:0, y:this.directLoginEditingComponent().bottomMargin(),
206 mode:'absolute',
207 duration:1,
208 afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
209 });
210 },
211
212 'fixRulerRendering': function (aValue) {
213 this.rulerComponent().setDisplayMode(aValue);
214 },
215
216 //-----------------------------------------------------------------------------
217
218 'hideRuler': function () {
219 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:1});
220 },
221
222 'doneWithRuler': function () {
223 var rulerComponentElement;
224
225 rulerComponentElement = this.rulerComponent().element();
226 new MochiKit.Visual.Move(this.rulerComponent().element(), {
227 x:1000,
228 mode:'relative',
229 duration:1,
230 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
231 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
232 });
233 },
234
235 //=============================================================================
236
237 'addNewDirectLoginRulerSteps': function () {
238 return MochiKit.Base.concat([ 'LABEL'], this.editDirectLoginRulerSteps());
239
240 },
241
242 'editDirectLoginRulerSteps': function () {
243 return [ /*'TYPE',*/ 'CONFIGURATION', 'BINDINGS','FAVICON', 'DONE'];
244 },
245
246 //-------------------------------------------------------------------------
247
248 'runWithDirectLogin': function (aDirectLogin, hasJustBeenAdded) {
249 this._directLogin = aDirectLogin;
250 this.setDirectLoginHasJustBeenAdded(hasJustBeenAdded);
251
252 return Clipperz.Async.callbacks("DirectLoginWizardController.runWithDirectLogin", [
253 MochiKit.Base.method(aDirectLogin, 'label'),
254 MochiKit.Base.method(this.directLoginEditingComponent(), 'setLabel'),
255
256 MochiKit.Base.method(aDirectLogin, 'favicon'),
257 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
258
259 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
260 MochiKit.Base.method(this.directLoginEditingComponent(), 'setBookmarkletConfiguration'),
261
262 MochiKit.Base.method(aDirectLogin, 'bindings'),
263 MochiKit.Base.method(this, 'setOriginalBindings'),
264
265 MochiKit.Base.method(aDirectLogin, 'record'),
266 MochiKit.Base.methodcaller('fields'),
267 MochiKit.Base.values,
268 MochiKit.Base.partial(MochiKit.Base.map, Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", {
269 'reference': MochiKit.Base.methodcaller('reference'),
270 'label': MochiKit.Base.methodcaller('label'),
271 'isHidden': MochiKit.Base.methodcaller('isHidden'),
272 'value': MochiKit.Base.methodcaller('value')
273 }, {trace:false})),
274 Clipperz.Async.collectAll,
275
276 MochiKit.Base.method(this, 'setRecordFields'),
277
278 MochiKit.Base.partial(MochiKit.Async.succeed, hasJustBeenAdded),
279 Clipperz.Async.deferredIf("Direct login has just been added", [
280 MochiKit.Base.method(this, 'addNewDirectLoginRulerSteps')
281 ], [
282 MochiKit.Base.method(this, 'editDirectLoginRulerSteps')
283 ]),
284 MochiKit.Base.method(this, 'showRuler')
285 ], {trace:false});
286 },
287
288 //-----------------------------------------------------------------------------
289
290 'checkState': function () {
291 var enablePrevious;
292 var enableNext;
293
294 enablePrevious = true;
295 enableNext = false;
296
297 this.directLoginEditingComponent().disableAllPanels();
298
299 switch(this.currentStep()) {
300 case 'LABEL':
301 this.directLoginEditingComponent().enableLabelField();
302
303 enableNext = (this.directLoginEditingComponent().label() != '');
304 enablePrevious = false;
305 break;
306 case 'TYPE':
307 this.directLoginEditingComponent().enableTypeField();
308
309 enableNext = true;
310 enablePrevious = true;
311 break
312 case 'CONFIGURATION':
313 this.directLoginEditingComponent().enableConfigurationField();
314
315 enableNext = (this.directLoginEditingComponent().bookmarkletConfiguration() != '');
316
317 if (enableNext == true) {
318 try {
319 Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(this.directLoginEditingComponent().bookmarkletConfiguration());
320 this.directLoginEditingComponent().removeHighlightConfigurationSyntaxError();
321 } catch (e) {
322 this.directLoginEditingComponent().highlightConfigurationSyntaxError();
323 enableNext = false;
324 }
325 }
326 break;
327 case 'BINDINGS':
328 enableNext = MochiKit.Iter.every(this.bindingComponents(), function (aBindingComponent) { return aBindingComponent.selectedValue() != null; })
329 this.directLoginEditingComponent().enableBindingFields();
330 break;
331 case 'FAVICON':
332 enableNext = true;
333 this.directLoginEditingComponent().enableFaviconField();
334 break;
335 case 'DONE':
336 enableNext = true;
337 this.directLoginEditingComponent().enableDonePanel();
338 break;
339 }
340
341 if (this.currentStepIndex() > 0) {
342 this.enablePrevious(enablePrevious);
343 } else {
344 this.enablePrevious(false);
345 }
346 this.enableNext(enableNext);
347 },
348
349 //-----------------------------------------------------------------------------
350
351 'setFocus': function () {
352 switch(this.currentStep()) {
353 case 'LABEL':
354 this.directLoginEditingComponent().focusOnLabelElement();
355 break;
356 case 'TYPE':
357 break;
358 case 'CONFIGURATION':
359 this.directLoginEditingComponent().focusOnBookmarkletConfigurationElement();
360 break;
361 case 'BINDINGS':
362 // this.directLoginEditingComponent().getElement('???').focus();
363 break;
364 case 'FAVICON':
365 this.directLoginEditingComponent().focusOnFaviconElement();
366 break;
367 case 'DONE':
368 break;
369 }
370 },
371
372 //=============================================================================
373
374 'steps': function () {
375 return this._steps;
376 },
377
378 'setSteps': function (aValue) {
379 this._steps = aValue;
380
381 this.rulerComponent().setSteps(aValue);
382 this.resetCurrentStepIndex();
383 },
384
385 'currentStepIndex': function () {
386 return this._currentStepIndex;
387 },
388
389 'currentStep': function () {
390 return this.steps()[this.currentStepIndex()];
391 },
392
393 //=============================================================================
394
395 'handleExit': function () {
396 MochiKit.Signal.signal(this, 'exit');
397 },
398
399 'done': function () {
400 this.doneWithRuler();
401
402 Clipperz.Async.callbacks("DirectLoginWizardController.done", [
403 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
404 MochiKit.Base.method(this.directLogin(), 'setLabel'),
405
406 MochiKit.Base.method(this.directLoginEditingComponent(), 'bookmarkletConfiguration'),
407 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration'),
408
409 //Bindings
410 MochiKit.Base.method(this.directLoginEditingComponent(), 'bindingComponents'),
411 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.bind(function (aBindingComponent) {
412 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBindingComponent) {
413//console.log("aBindingComponent", aBindingComponent);
414 // this.directLogin().
415 return Clipperz.Async.callbacks("DirectLoginWizardController.done - update directLogin bindings", [
416 MochiKit.Base.method(this.directLogin(), 'bindings'),
417 MochiKit.Base.itemgetter(aBindingComponent.formFieldName()),
418 MochiKit.Base.methodcaller('setFieldKey', aBindingComponent.selectedValue())
419 ], {trace:false});
420 }, this)),
421
422 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
423 MochiKit.Base.method(this.directLogin(), 'setFavicon'),
424
425 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'done', {
426 'directLogin': this.directLogin(),
427 'hasJustBeenAdded':this.directLoginHasJustBeenAdded()
428 })
429 ], {trace:false});
430 },
431
432 //=============================================================================
433
434 'handleMoveBackward': function () {
435 if (this._currentStepIndex > 0) {
436 varafterMoveAction;
437
438 this._currentStepIndex --;
439 afterMoveAction = MochiKit.Base.noop;
440
441 switch(this.currentStep()) {
442 case 'LABEL':
443 break;
444 case 'TYPE':
445 break;
446 case 'CONFIGURATION':
447 break;
448 case 'BINDINGS':
449 break;
450 case 'FAVICON':
451 break;
452 case 'DONE':
453 break;
454 };
455
456 this.rulerComponent().moveBackward(afterMoveAction);
457 }
458
459 if (this._currentStepIndex == 0) {
460 this.enablePrevious(false);
461 }
462 },
463
464 'handleMoveForward': function () {
465 if (this.isNextEnabled()) {
466 varafterMoveAction;
467
468 this._currentStepIndex ++;
469 afterMoveAction = MochiKit.Base.noop;
470
471 switch(this.currentStep()) {
472 case 'LABEL':
473 break;
474 case 'TYPE':
475 break;
476 case 'CONFIGURATION':
477 break;
478 case 'BINDINGS':
479 this.resetBindingComponents();
480 this.resetFormValueComponents();
481
482 afterMoveAction = MochiKit.Base.partial(Clipperz.Async.callbacks, "DirectLoginWizardController.handleMoveForward - BINDINGS", [
483 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration', this.directLoginEditingComponent().bookmarkletConfiguration()),
484
485 MochiKit.Base.method(this.directLogin(), 'favicon'),
486 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
487
488 MochiKit.Base.method(this.directLogin(), 'bindings'),
489 MochiKit.Base.values,
490 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBinding) {
491 var bindingComponent;
492
493 bindingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent({
494 formFieldName: aBinding.key(),
495 fields: this.recordFields(),
496 selectedFieldKey: aBinding.fieldKey()
497 });
498
499 this.bindingComponents().push(bindingComponent);
500
501 MochiKit.Signal.connect(bindingComponent, 'bindChange', this, 'handleBindChange', bindingComponent);
502 this.directLoginEditingComponent().addBindingComponent(bindingComponent);
503
504 }, this)),
505
506 MochiKit.Base.method(this.directLogin(), 'formValues'),
507 MochiKit.Base.values,
508 Clipperz.Async.forEach(MochiKit.Base.bind(function (aFormValue) {
509 var formValueComponent;
510
511 formValueComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent({
512 'formFieldName': aFormValue.key(),
513 'fieldOptions': aFormValue.fieldOptions(),
514 'initialValue': aFormValue.value()
515 });
516
517 this.formValueComponents().push(formValueComponent);
518
519 MochiKit.Signal.connect(formValueComponent, 'formValueChange', this, 'handleFormValueChange', formValueComponent);
520 this.directLoginEditingComponent().addFormValueComponent(formValueComponent);
521 }, this))
522
523 ], {trace:false});
524
525 break;
526 case 'FAVICON':
527 break;
528 case 'DONE':
529 this.directLoginEditingComponent().setDoneDescriptionWithKeys({
530 '__cardName__': this.cardLabel(),
531 '__directLoginName__': this.directLoginEditingComponent().label()
532 });
533 break;
534 };
535
536 this.rulerComponent().moveForward(afterMoveAction);
537 };
538 },
539
540 'handleCursorMoved': function () {
541 this.checkState();
542 this.setFocus();
543 },
544
545 //-------------------------------------------------------------------------
546
547 'handleChangedValue': function (anEvent) {
548 this.checkState();
549 },
550
551 //.........................................................................
552
553 'handleBindChange': function (aDirectLoginEditingBindingComponent) {
554 varselectedField;
555
556 selectedField = this.recordFieldWithReference(aDirectLoginEditingBindingComponent.selectedValue());
557
558 return Clipperz.Async.callbacks("DirectLoginWizardController.handleBindChange", [
559 MochiKit.Base.method(this.directLogin(), 'bindings'),
560 MochiKit.Base.itemgetter(aDirectLoginEditingBindingComponent.formFieldName()),
561 MochiKit.Base.methodcaller('setFieldKey', selectedField['reference']),
562 function () {
563 if (selectedField != null) {
564 aDirectLoginEditingBindingComponent.setFieldValue(selectedField['value']);
565 aDirectLoginEditingBindingComponent.setIsHidden(selectedField['isHidden']);
566 } else {
567 aDirectLoginEditingBindingComponent.setFieldValue('');
568 aDirectLoginEditingBindingComponent.setIsHidden(false);
569 }
570 },
571 MochiKit.Base.method(this, 'checkState')
572 ], {trace:false});
573 },
574
575 //.........................................................................
576
577 'handleFormValueChange': function (someOptions) {
578 return Clipperz.Async.callbacks("DirectLoginWizardController.handleFormValueChange", [
579 MochiKit.Base.method(this.directLogin(), 'formValues'),
580 MochiKit.Base.itemgetter(someOptions['fieldName']),
581 MochiKit.Base.methodcaller('setValue', someOptions['selectedValue']),
582 MochiKit.Base.method(this, 'checkState')
583 ], {trace:false});
584 },
585
586 //-------------------------------------------------------------------------
587
588 'handleDirectLoginEditingComponentKeyPressed': function (anEvent) {
589 if (anEvent.key().string == 'KEY_ENTER') {
590 if (anEvent.target().nodeName != 'TEXTAREA') {
591 anEvent.preventDefault();
592 this.handleMoveForward();
593 }
594 } else if (anEvent.key().string == 'KEY_TAB') {
595 this.handleMoveForward();
596 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
597 anEvent.preventDefault();
598 }
599 } else if ((anEvent.key().string == 'KEY_ARROW_RIGHT') && (anEvent.modifier().meta == true)) {
600 this.handleMoveForward();
601 } else if ((anEvent.key().string == 'KEY_ARROW_LEFT') && (anEvent.modifier().meta == true)) {
602 this.handleMoveBackward();
603 } else if (anEvent.key().string == 'KEY_ESCAPE') {
604 anEvent.stop();
605 this.handleExit();
606 }
607 },
608
609 //=============================================================================
610 __syntaxFix__: "syntax fix"
611});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
new file mode 100644
index 0000000..28401a2
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
@@ -0,0 +1,145 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29/*
30Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
31
32Clipperz.PM.UI.Web.Controllers.DirectLoginsController = function() {
33 Clipperz.PM.UI.Web.Controllers.DirectLoginsController.superclass.constructor.apply(this, arguments);
34
35 return this;
36};
37
38Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.DirectLoginsController, Clipperz.PM.UI.Web.Controllers.GridController, {
39
40 'createGrid': function () {
41 return new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
42 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
43 'name': 'DirectLogins.favicon',
44 'selector': MochiKit.Base.methodcaller('favicon'),
45 'cssClass': 'favicon'
46 }),
47 // new Clipperz.PM.UI.Web.Components.LinkColumnManager({
48 new Clipperz.PM.UI.Web.Components.DirectLoginColumnManager({
49 'name': 'DirectLogins.title',
50 'selector': MochiKit.Base.methodcaller('label'),
51 'label': 'title',
52 'cssClass': 'title',
53 'comparator': Clipperz.Base.caseInsensitiveCompare,
54 'sortable': true,
55 'sorted': 'ASCENDING',
56 'actionMethod': MochiKit.Base.methodcaller('runDirectLogin')
57 }),
58 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
59 // 'label':'strength',
60 // 'cssClass':'title',
61 // 'selector': MochiKit.Base.methodcaller('label') //should be 'strength' or a strenght evaluation function
62 // }),
63 new Clipperz.PM.UI.Web.Components.LinkColumnManager({
64 'name': 'DirectLogins.cardTitle',
65 'selector': MochiKit.Base.compose(MochiKit.Base.methodcaller('label'), MochiKit.Base.methodcaller('record')),
66 'label': 'card',
67 'cssClass': 'cardTitle',
68 'comparator': Clipperz.Base.caseInsensitiveCompare,
69 'sortable': true,
70 'sorted': 'UNSORTED',
71 'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
72 }),
73 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
74 // 'label':'last access',
75 // 'cssClass':'title',
76 // 'selector': MochiKit.Base.methodcaller('label')
77 // // 'sortable': true,
78 // // 'sorted': 'UNSORTED'
79 // }),
80 // new Clipperz.PM.UI.Web.Components.TextColumnManager({
81 // 'label':'commands',
82 // 'cssClass':'title',
83 // 'selector': MochiKit.Base.methodcaller('label'), //should be a function for commands display
84 // }),
85 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
86 'name': 'DirectLogins.delete',
87 'selector': MochiKit.Base.noop,
88 'cssClass': 'delete',
89 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteDirectLogin', {objectData:anObject, element:anEvent.src()})}
90 'actionMethod': MochiKit.Base.method(this, 'handleDeleteDirectLogin')
91 })
92 ]});
93
94 },
95
96 //-----------------------------------------------------------------------------
97
98 'getRows': function () {
99 //TODO: relying on user() in GridController, bad code smell :|
100 return this.user().getDirectLogins();
101 },
102
103 //-----------------------------------------------------------------------------
104
105 'handleShowCard': function (anObject, anEvent) {
106 var cardDialogController;
107
108 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject.record()})
109 cardDialogController.run(anEvent.src());
110 },
111
112 //-----------------------------------------------------------------------------
113
114 'handleDeleteDirectLogin': function (anObject, anEvent) {
115 var deferredResult;
116 var confirmationDialog;
117
118 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
119 title:"Delete DirectLogin",
120 text:"Do you want to delete …",
121 type:'ALERT',
122 buttons: [
123 {text:"Cancel",result:'CANCEL', isDefault:true},
124 {text:"Delete", result:'OK'}
125 ]
126 });
127
128 deferredResult = new Clipperz.Async.Deferred("AppController.handleDeleteCard", {trace:false});
129 // deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()});
130 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
131 'openFromElement': anEvent.src(),
132 'onOkCloseToElement': null, //MochiKit.DOM.currentDocument().body,
133 'onCancelCloseToElement':anEvent.src()
134 });
135 deferredResult.addCallback(function () { Clipperz.log("DELETE: " + anObject.toString(), anObject); });
136 deferredResult.addErrbackPass(function () { Clipperz.log("skip deletion: " + anObject.toString(), anObject); });
137 deferredResult.callback();
138
139 return deferredResult;
140 },
141
142 //-----------------------------------------------------------------------------
143 __syntaxFix__: "syntax fix"
144});
145*/ \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
new file mode 100644
index 0000000..13e02bc
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
@@ -0,0 +1,158 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.FilterController = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Controllers.FilterController.superclass.constructor.call(this, args);
35
36 this._filterElements = [];
37 this._filter = "";
38
39 this._pendingSearchClicks = 0;
40
41 return this;
42};
43
44
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.FilterController, Object, {
46
47 //-----------------------------------------------------------------------------
48
49 'getFilter': function () {
50 return this._filter;
51 },
52
53 '_setFilter': function (aFilterElement, aFilter) {
54 if (aFilter != this._filter) {
55 this._filter = aFilter;
56 MochiKit.Signal.signal(this, 'filterUpdated', aFilter);
57 this.updateFilterElements(aFilterElement, aFilter);
58 }
59 },
60
61 'setFilter': function (aFilter) {
62 this._setFilter(null, aFilter);
63 },
64
65 //-----------------------------------------------------------------------------
66
67 'filterElements': function () {
68 return this._filterElements;
69 },
70
71 'registerFilterElement': function (aFilterElement) {
72//Clipperz.log("=== FilterController.registerFilterElement", aFilterElement);
73 this._filterElements.push(aFilterElement);
74 MochiKit.Signal.connect(aFilterElement, 'onkeydown', this, 'searchClickHandler');
75 MochiKit.Signal.connect(aFilterElement, 'onfocus', this, 'searchClickHandler');
76 },
77
78 'removeFilterElement': function (aFilterElement) {
79 var i;
80 var filterElements;
81 for (i=0; i < filterElements; i++) {
82 if (filterElements[i] == aFilterElement);
83 filterElements.splice(i, 1);
84 // TODO unregister/disconnect filterElement ??MochiKit.Signal.disconnect(this.grid().filterElement(), 'updateFilter', this.filterController(), 'handleUpdateFilter');
85 }
86 },
87
88 'updateFilterElements': function (aSourceElement, aFilterString) {
89 MochiKit.Iter.forEach(this.filterElements(),
90 function (aFilterElement) {
91 if (aFilterElement != aSourceElement) {
92 aFilterElement.value = aFilterString;
93 }
94 }
95 );
96
97 if (aSourceElement != null) {
98 aSourceElement.focus();
99 }
100 },
101
102 //-----------------------------------------------------------------------------
103
104 'run': function () {
105//Clipperz.log("=== FilterController.run");
106 },
107
108 //-----------------------------------------------------------------------------
109
110 'pendingSearchClicks': function () {
111 return this._pendingSearchClicks;
112 },
113
114 'incrementPendingSearchClicks': function () {
115 this._pendingSearchClicks++;
116 },
117
118 'decrementPendingSearchClicks': function () {
119 this._pendingSearchClicks--;
120 },
121
122 //-----------------------------------------------------------------------------
123
124 'searchClickHandler': function (anEvent) {
125 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) {
126 anEvent.preventDefault();
127 } else {
128 var value;
129
130 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) {
131 value = ""
132 } else if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ARROW_UP')) {
133 } else if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ARROW_DOWN')) {
134 } else {
135 value = null;
136 }
137
138 this.incrementPendingSearchClicks();
139 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, "searchClickDeferredHandler", anEvent.src(), value));
140 }
141 },
142
143 //.........................................................................
144
145 'searchClickDeferredHandler': function (aFilterElement, aValue) {
146 if (aValue != null) {
147 aFilterElement.value = aValue;
148 }
149
150 this.decrementPendingSearchClicks();
151 if (this.pendingSearchClicks()==0) {
152 this._setFilter(aFilterElement, aFilterElement.value);
153 }
154 },
155
156 //-----------------------------------------------------------------------------
157 'syntaxFix': 'syntax fix'
158}); \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
new file mode 100644
index 0000000..740a091
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
@@ -0,0 +1,374 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.GridController = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.Web.Controllers.GridController.superclass.constructor.call(this, args);
35
36 this._grid = null;
37 this._user = null;
38 this._sortedColumnManager = null;
39 this._cachedObjects = null;
40 this._filterController = args.filterController || null;
41
42 this._deferredDisplaySelectedRowsInvocation = null;
43
44 return this;
45};
46
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.GridController, Object, {
48
49 'toString': function() {
50 return "Clipperz.PM.UI.Web.Controllers.GridController";
51 },
52
53 //-----------------------------------------------------------------------------
54
55 'createGrid': function () {
56 throw Clipperz.Base.exception.AbstractMethod;
57 },
58
59 'setupWithGrid': function (aGrid) {
60 this._grid = aGrid;
61
62 if (this._grid != null) {
63 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
64 if (aColumnManager.isSortable()) {
65 if (aColumnManager.isSorted()) {
66 this.setSortedColumnManager(aColumnManager);
67 }
68 MochiKit.Signal.connect(aColumnManager, 'sort', this, 'handleColumnManagerSort');
69 }
70 MochiKit.Signal.connect(aColumnManager, 'selectRow', this, 'handleColumnManagerSelectRow');
71 MochiKit.Signal.connect(aColumnManager, 'unselectRow', this, 'handleColumnManagerUnselectRow');
72 }, this);
73 }
74 },
75
76 'grid': function() {
77 if (this._grid == null) {
78 this.setupWithGrid(this.createGrid());
79 }
80
81 return this._grid;
82 },
83
84 'filterController': function () {
85//Clipperz.log('GridController.filterController >>>', this._filterController);
86 if (this._filterController == null) {
87 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
88 }
89//Clipperz.log('GridController.filterController <<<', this._filterController);
90 return this._filterController;
91 },
92
93 //-----------------------------------------------------------------------------
94
95 'columnsManagers': function () {
96 return this.grid().columnsManagers();
97 },
98
99 'columnManagerWithName': function (aName) {
100 varmanagers;
101 var result;
102
103 managers = MochiKit.Base.filter(function (aManager) { return aManager.name() == aName; } , this.columnsManagers());
104
105 if (managers.length == 1) {
106 result = managers[0];
107 } else if (managers.length == 0) {
108 result = null;
109 } else {
110 throw "WTF!!!";
111 }
112
113 return result;
114 },
115
116 'sortedColumnManager': function () {
117 return this._sortedColumnManager;
118 },
119
120 'setSortedColumnManager': function(aValue) {
121 if (aValue.sorted() != 'UNSORTED') {
122 this._sortedColumnManager = aValue;
123 } else {
124 this._sortedColumnManager = null;
125 }
126 },
127
128 //-----------------------------------------------------------------------------
129
130 'handleColumnManagerSort': function(aSelectedColumnManager) {
131 MochiKit.Iter.forEach(this.columnsManagers(), function(aColumnManager) {
132 if (aSelectedColumnManager != aColumnManager) {
133 if (aColumnManager.isSortable()) {
134 aColumnManager.setSorted('UNSORTED');
135 }
136 }
137 });
138
139 aSelectedColumnManager.toggleSorting();
140 this.setSortedColumnManager(aSelectedColumnManager);
141
142 this.displaySelectedRows(this.filterController().getFilter());
143 },
144
145 'handleColumnManagerSelectRow': function (aRowObject) {
146 this.grid().selectRow(aRowObject);
147 },
148
149 'handleColumnManagerUnselectRow': function (aRowObject) {
150 this.grid().unselectRow(aRowObject);
151 },
152
153 //-----------------------------------------------------------------------------
154
155 'handleFilterUpdated': function (aFilter) {
156 if (this.grid().isActive()) {
157 this.displaySelectedRows(aFilter);
158 }
159 },
160
161 //-----------------------------------------------------------------------------
162 //TODO: relying on user() in GridController, bad code smell :|
163 //mhh: a controller should have access to business logic object too. Otherwise it will fail its controller role. [Giulio Cesare]
164
165 'setUser': function(anUser) {
166 this._user = anUser;
167 },
168
169 'user': function() {
170 return this._user;
171 },
172
173 //-----------------------------------------------------------------------------
174
175 'run': function(args) {
176//Clipperz.log("=== GridController.run");
177 var deferredResult;
178
179 this.setUser(args.user);
180 args.slot.setContent(this.grid());
181 this.filterController().registerFilterElement(this.grid().filterElement());
182 MochiKit.Signal.connect(this.filterController(), 'filterUpdated', this, 'handleFilterUpdated');
183
184 return this.displaySelectedRows();
185 },
186
187 //-----------------------------------------------------------------------------
188
189 'handleGenericError': function(anError) {
190 var result;
191
192 if (anError instanceof MochiKit.Async.CancelledError) {
193 result = anError;
194 } else {
195Clipperz.log("## GridController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
196 result = new MochiKit.Async.CancelledError(anError);
197 }
198
199 return result;
200 },
201
202 //-----------------------------------------------------------------------------
203
204 'getRows': function () {
205 throw Clipperz.Base.AbstractMethod;
206 },
207
208 //-----------------------------------------------------------------------------
209
210 'setDeferredDisplaySelectedRowsInvocation': function (aDeferred) {
211 if (this._deferredDisplaySelectedRowsInvocation != null) {
212 this._deferredDisplaySelectedRowsInvocation.cancel();
213 }
214
215 this._deferredDisplaySelectedRowsInvocation = aDeferred;
216 },
217
218 //-----------------------------------------------------------------------------
219
220 'resetDeferredDisplaySelectedRowsInvocation': function () {
221 if (this._deferredDisplaySelectedRowsInvocation != null) {
222 this._deferredDisplaySelectedRowsInvocation.cancel();
223 }
224 },
225
226 //-----------------------------------------------------------------------------
227
228 '_displaySelectedRows': function (aFilter, someRows) {
229 var result;
230 var delay;
231
232 if ((aFilter != null) && (aFilter != '')) {
233 var filter;
234 varfilterRegExp;
235
236 filter = aFilter.replace(/[^A-Za-z0-9]/g, "\\$&");
237 filterRegExp = new RegExp(filter, "i");
238 result = MochiKit.Base.filter(function (aCachedResult) { return filterRegExp.test(aCachedResult['_searchableContent'])}, someRows);
239 delay = 0.002*result.length;
240
241 this.setDeferredDisplaySelectedRowsInvocation(MochiKit.Async.callLater(delay, MochiKit.Base.method(this, "deferredDisplaySelectedRows", result)));
242 } else {
243 result = someRows;
244
245 this.resetDeferredDisplaySelectedRowsInvocation();
246 this.deferredDisplaySelectedRows(result);
247 }
248
249 },
250
251 //-----------------------------------------------------------------------------
252
253 'deferredDisplaySelectedRows': function (someRows) {
254 if (this.sortedColumnManager() != null) {
255 var comparator;
256 var fieldName;
257
258 fieldName = this.sortedColumnManager().name();
259 comparator = this.sortedColumnManager().comparator();
260 if (this.sortedColumnManager().sorted() == 'DESCENDING') {
261 comparator = Clipperz.Base.reverseComparator(comparator);
262 }
263
264 someRows.sort(MochiKit.Base.partial(function(aKey, aComparator, aObject, bObject){
265 return comparator(aObject[aKey], bObject[aKey]);
266 }, this.sortedColumnManager().name(), comparator));
267 }
268
269 this.grid().update(someRows);
270 this.grid().endSearch();
271 },
272
273 //-----------------------------------------------------------------------------
274
275 'getCachedValues': function () {
276 var deferredResult;
277
278 if (this._cachedObjects != null) {
279 deferredResult = MochiKit.Async.succeed(this._cachedObjects);
280 } else {
281 var objectCollectResultsConfiguration;
282
283 objectCollectResultsConfiguration = {
284 '_rowObject': MochiKit.Async.succeed,
285 '_reference': MochiKit.Base.methodcaller('reference'),
286 '_searchableContent':MochiKit.Base.methodcaller('searchableContent')
287 };
288
289 MochiKit.Base.map(function (aColumnManager) {
290 objectCollectResultsConfiguration[aColumnManager.name()] = aColumnManager.selector();
291 }, this.columnsManagers());
292
293 deferredResult = new Clipperz.Async.Deferred("GridController.getCachedValues", {trace:false});
294 deferredResult.addMethod(this, 'getRows');
295 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("GridController.getCachedValues - collectResults", objectCollectResultsConfiguration, {trace:false}));
296 deferredResult.addCallback(Clipperz.Async.collectAll);
297 deferredResult.addCallback(MochiKit.Base.bind(function (someRows) {
298 this._cachedObjects = someRows;
299 return this._cachedObjects;
300 }, this));
301 deferredResult.callback();
302 }
303
304 return deferredResult;
305 },
306
307 //-----------------------------------------------------------------------------
308
309 'hasPendingChanges': function () {
310 return this.user().hasPendingChanges();
311 },
312
313 'saveChanges': function () {
314 this._cachedObjects = null;
315
316 return Clipperz.Async.callbacks("GridController.saveChanges", [
317 MochiKit.Base.method(this.user(), 'saveChanges'),
318 MochiKit.Base.method(this, 'focus')
319 ], {trace:false});
320 },
321
322 'revertChanges': function () {
323 return this.user().revertChanges();
324 },
325
326 //-----------------------------------------------------------------------------
327
328 'displayEmptyContent': function () {
329 },
330
331 'hideEmptyContent': function () {
332 this.grid().removeNoRowsGridComponent();
333 },
334
335 'displaySelectedRows': function (aFilter) {
336 if ((aFilter != null) && (aFilter != '')){
337 this.grid().startSearch();
338 }
339
340 return Clipperz.Async.callbacks("GridController.displaySelectedrows", [
341 MochiKit.Base.method(this, 'getCachedValues'),
342 MochiKit.Base.itemgetter('length'),
343 Clipperz.Async.deferredIf("There are some items to show in the grid", [
344 MochiKit.Base.method(this, 'hideEmptyContent'),
345 MochiKit.Base.method(this, 'getCachedValues'),
346 MochiKit.Base.method(this, '_displaySelectedRows', aFilter)
347 ], [
348 MochiKit.Base.method(this, 'displayEmptyContent'),
349 MochiKit.Base.method(this.grid(), 'endSearch')
350 ])
351 ], {trace:false});
352 },
353
354 //-----------------------------------------------------------------------------
355
356 'focus': function () {
357 return Clipperz.Async.callbacks("GridController.focus", [
358 MochiKit.Base.method(this, 'displaySelectedRows', this.filterController().getFilter()),
359 MochiKit.Base.method(this.grid(), 'focus')
360 ], {trace:false})
361 //*##*/this.displaySelectedRows(this.filterController().getFilter());
362 // this.grid().focus();
363 },
364
365 //=============================================================================
366
367 'deleteAllCleanTextData': function () {
368 this._cachedObjects = null;
369 this.grid().drawEmpty();
370 },
371
372 //=============================================================================
373 __syntaxFix__: "syntax fix"
374});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
new file mode 100644
index 0000000..d88af41
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
@@ -0,0 +1,259 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.LoginController = function(args) {
32 this._args = args || {};
33
34 this._loginPage = null;
35
36 this._newUserWizardController = null;
37 this._newUserCreationComponent = null;
38
39 return this;
40}
41
42MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, {
43
44 'toString': function() {
45 return "Clipperz.PM.UI.Web.Controllers.LoginController";
46 },
47
48 'args': function () {
49 return this._args;
50 },
51
52 //-----------------------------------------------------------------------------
53
54 'loginPage': function() {
55 if (this._loginPage == null) {
56 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage();
57
58 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick')
59 }
60
61 return this._loginPage;
62 },
63
64 //-----------------------------------------------------------------------------
65
66 'run': function(args) {
67 varslot;
68 varloginPage;
69 varloginForm;
70
71 slot = args.slot;
72
73 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']});
74
75 slot.setContent(this.loginPage());
76 this.loginPage().slotNamed('loginForm').setContent(loginForm);
77
78 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
79 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
80 },
81
82 //-----------------------------------------------------------------------------
83
84 'doLogin': function(aLoginForm, anEvent) {
85 var deferredResult;
86 varparameters;
87 // varshouldUseOTP;
88 var loginProgress;
89 varuser;
90 var getPassphraseDelegate;
91
92 parameters = anEvent;
93 // shouldUseOTP = (typeof(parameters.passphrase) == 'undefined');
94
95 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase);
96 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')});
97
98 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress();
99
100 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false});
101 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
102 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate);
103 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()});
104 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
105 // if (shouldUseOTP == false) {
106 deferredResult.addMethod(user, 'login');
107 // } else {
108 // deferredResult.addMethod(user, 'loginUsingOTP', parameters.username, parameters.otp);
109 // }
110 deferredResult.addCallback(function(aLoginProgress, res) {
111 aLoginProgress.disableCancel();
112 return res;
113 }, loginProgress);
114 deferredResult.addCallback(function () {
115 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body}));
116 })
117 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm);
118 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress));
119
120 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()}));
121 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField'));
122 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate));
123 deferredResult.callback();
124
125 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel');
126
127 return deferredResult;
128 },
129
130 //-----------------------------------------------------------------------------
131
132 'userLoggedIn': function(aUser) {
133//Clipperz.log(">>> LoginController.userLoggedIn");
134 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser});
135//Clipperz.log("<<< LoginController.userLoggedIn");
136 },
137
138 //=========================================================================
139
140 'handleCreateNewAccountClick': function (aComponent) {
141 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user");
142 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [
143 //' MochiKit.Base.method(this, 'newUserCreationComponent'),
144 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}),
145 // MochiKit.Base.method(this.newUserWizardController(), 'run')
146
147
148 MochiKit.Base.method(this, 'newUserCreationComponent'),
149 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [
150 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}),
151 MochiKit.Base.method(this.newUserWizardController(), 'run')
152 ], {trace:false}),
153 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField')
154 ], {trace:false});
155 },
156
157 //-----------------------------------------------------------------------------
158
159 'newUserWizardController': function () {
160 if (this._newUserWizardController == null) {
161 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({
162 'newUserCreationComponent': this.newUserCreationComponent()
163 })
164
165 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent');
166 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent');
167 }
168
169 return this._newUserWizardController;
170 },
171
172 //-------------------------------------------------------------------------
173
174 'newUserCreationComponent': function () {
175 if (this._newUserCreationComponent == null) {
176 this._newUserCreationComponent = new Clipperz.PM.UI.Web.Components.NewUserCreationComponent();
177 }
178
179 return this._newUserCreationComponent;
180 },
181
182 'clearNewUserCreationComponent': function () {
183 if (this._newUserCreationComponent != null) {
184 this._newUserCreationComponent.clear();
185 }
186 this._newUserCreationComponent = null;
187 },
188
189 //-------------------------------------------------------------------------
190
191 'handleHideNewUserCreationComponent': function () {
192 this.clearNewUserCreationComponent();
193 },
194
195 'handleCompleteNewUserCreationComponent': function (someParameters) {
196 vardeferredResult;
197 varuser;
198 varnewUserCreationComponent;
199
200 user = someParameters.user;
201 newUserCreationComponent = this.newUserCreationComponent();
202 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(newUserCreationComponent, 'deferredHideModal', {closeToElement:MochiKit.DOM.currentDocument().body})),
203
204 deferredResult = new Clipperz.Async.Deferred("LoginController.handleCompleteNewUserCreationComponent", {trace:false});
205
206 deferredResult.addCallbackList([
207 MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'),
208 MochiKit.Base.method(user, 'login'),
209 MochiKit.Base.method(this, 'userLoggedIn', user),
210 MochiKit.Base.method(this, 'clearNewUserCreationComponent')
211 ]);
212 deferredResult.addErrback(function (aValue) { Clipperz.log("WTF!! Error doing the login after creating a new user" + aValue)});
213 deferredResult.callback();
214
215 return deferredResult;
216 },
217
218
219 //=========================================================================
220
221 'handleFailedLogin': function(aLoginProgress, anError) {
222 var result;
223
224//console.log("anError", anError);
225 if (anError instanceof MochiKit.Async.CancelledError) {
226 result = anError;
227 } else {
228 var deferredResult;
229
230MochiKit.Logging.logError("## MainController - FAILED LOGIN: " + anError);
231 deferredResult = new MochiKit.Async.Deferred();
232
233 aLoginProgress.showErrorMessage("failed login");
234 // Clipperz.NotificationCenter.register(loginProgress, 'cancelEvent', deferredResult, 'callback');
235 MochiKit.Signal.connect(aLoginProgress, 'cancelEvent', deferredResult, 'callback');
236 deferredResult.addCallback(MochiKit.Async.fail, anError)
237 result = deferredResult;
238 }
239
240 return result;
241 },
242
243 'handleGenericError': function(anError) {
244 var result;
245
246 if (anError instanceof MochiKit.Async.CancelledError) {
247 result = anError;
248 } else {
249MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
250//console.log(anError);
251 result = new MochiKit.Async.CancelledError(anError);
252 }
253
254 return result;
255 },
256
257 //-----------------------------------------------------------------------------
258 __syntaxFix__: "syntax fix"
259});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
new file mode 100644
index 0000000..aa0d6ad
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
@@ -0,0 +1,218 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.MainController = function(args) {
32 this._args = args;
33
34 //controllers
35 this._loginController =null;
36 this._appController =null;
37
38 //components
39 this._headerComponent = null;
40 this._pageComponent =null;
41 this._footerComponent = null;
42
43 this._passphraseDelegateLock = new MochiKit.Async.DeferredLock();
44 this._passphraseDelegateLock.acquire();
45//Clipperz.log('MainController init _passphraseDelegateLock', this._passphraseDelegateLock);
46 this._passphraseDelegate = null;
47
48 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestSent', this, 'handleRemoteRequestSent');
49 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestReceived',this, 'handleRemoteRequestReceived');
50
51 return this;
52}
53
54MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.MainController.prototype, {
55
56 'toString': function() {
57 return "Clipperz.PM.UI.Web.Controllers.MainController";
58 },
59
60 'args': function () {
61 return this._args;
62 },
63
64 //-----------------------------------------------------------------------------
65
66 'headerComponent': function() {
67 if (this._headerComponent == null) {
68 this._headerComponent = new Clipperz.PM.UI.Web.Components.PageHeader();
69 }
70
71 return this._headerComponent;
72 },
73
74 'footerComponent': function() {
75 if (this._footerComponent == null) {
76 this._footerComponent = new Clipperz.PM.UI.Web.Components.PageFooter();
77 }
78
79 return this._footerComponent;
80 },
81
82 //-----------------------------------------------------------------------------
83
84 'pageComponent': function() {
85 if (this._pageComponent == null) {
86 this._pageComponent = new Clipperz.PM.UI.Web.Components.Page({element:MochiKit.DOM.getElement('mainDiv')});
87 }
88
89 return this._pageComponent;
90 },
91
92 //-----------------------------------------------------------------------------
93
94 'loginController': function() {
95 if (this._loginController == null) {
96 this._loginController = new Clipperz.PM.UI.Web.Controllers.LoginController(this.args());
97
98 MochiKit.Signal.connect(this._loginController, 'userLoggedIn', this, 'loginControllerUserLoggedInCallback');
99 }
100
101 return this._loginController;
102 },
103
104 'appController': function() {
105 if (this._appController == null) {
106 this._appController = new Clipperz.PM.UI.Web.Controllers.AppController();
107
108 MochiKit.Signal.connect(this._appController, 'logout', this, 'handleLogout');
109 }
110
111 return this._appController;
112 },
113
114 //-----------------------------------------------------------------------------
115
116 'run': function(shoudShowRegistrationForm) {
117 this.pageComponent().slotNamed('header').setContent(this.headerComponent());
118 this.pageComponent().slotNamed('footer').setContent(this.footerComponent());
119
120 this.pageComponent().render();
121
122 this.loginController().run({slot:this.pageComponent().slotNamed('body')});
123
124 if (shoudShowRegistrationForm) {
125 MochiKit.Signal.signal(this.loginController().loginPage(), 'createNewAccountClick');
126 // this.loginController().handleCreateNewAccountClick();
127 }
128 },
129
130 //-----------------------------------------------------------------------------
131
132 'getPassphrase': function () {
133 var deferredResult;
134
135 deferredResult = new Clipperz.Async.Deferred("MainController.getPassphrase", {trace:false});
136
137 deferredResult.acquireLock(this._passphraseDelegateLock);
138 deferredResult.addMethod(this, 'invokePassphraseDelegate');
139 deferredResult.releaseLock(this._passphraseDelegateLock);
140 deferredResult.callback();
141
142 return deferredResult;
143 },
144
145 //.........................................................................
146
147 'invokePassphraseDelegate': function () {
148 return this._passphraseDelegate();
149 },
150
151 'passphraseDelegateLock': function () {
152 return this._passphraseDelegateLock;
153 },
154
155 //.........................................................................
156
157 'setPassphraseDelegate': function (aDelegate) {
158 var shouldReleaseLock;
159
160 shouldReleaseLock = (this._passphraseDelegate == null);
161
162 this._passphraseDelegate = aDelegate;
163
164 if (shouldReleaseLock) {
165 this._passphraseDelegateLock.release();
166 }
167 },
168
169 //.........................................................................
170
171 'removePassphraseDelegate': function (aDelegate) {
172 if (this._passphraseDelegate == aDelegate) {
173 this._passphraseDelegate = null;
174 this._passphraseDelegateLock.acquire();
175 }
176 },
177
178 //-------------------------------------------------------------------------
179
180 'loginControllerUserLoggedInCallback': function(anEvent) {
181//Clipperz.log(">>> loginControllerUserLoggedInCallback", anEvent);
182 // this.setUser(anEvent.parameters()['user']);
183//console.log("--- loginControllerUserLoggedInCallback - 1");
184
185//console.log("--- loginControllerUserLoggedInCallback - 2");
186 this.headerComponent().switchToLoggedMode();
187 this.appController().run({slot:this.pageComponent().slotNamed('body'), user:anEvent['user']});
188//Clipperz.log("<<< loginControllerUserLoggedInCallback");
189 },
190
191 //-----------------------------------------------------------------------------
192
193 'handleRemoteRequestSent': function () {
194//Clipperz.log("REMOTE REQUEST sent >>>");
195 },
196
197 'handleRemoteRequestReceived': function () {
198//Clipperz.log("REMOTE REQUEST received <<<");
199 },
200
201 //-----------------------------------------------------------------------------
202
203 'handleLogout': function(anEvent) {
204 this.exit('logout.html');
205 },
206
207 //-----------------------------------------------------------------------------
208
209 'exit': function(aPageName) {
210//Clipperz.log("### exit " + aPageName);
211 MochiKit.Async.wait(0).addCallback(function() {
212 window.location.href = "./" + aPageName + "?ln=" + Clipperz.PM.Strings.selectedLanguage;
213 });
214 },
215
216 //-----------------------------------------------------------------------------
217 __syntaxFix__: "syntax fix"
218});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
new file mode 100644
index 0000000..28d9d20
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
@@ -0,0 +1,469 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30
31Clipperz.PM.UI.Web.Controllers.NewUserWizardController = function(args) {
32 this._newUserCreationComponent = args.newUserCreationComponent|| Clipperz.Base.exception.raise('MandatoryParameter');
33
34 MochiKit.Signal.connect(this._newUserCreationComponent, 'changedValue',this, 'handleChangedValue');
35 MochiKit.Signal.connect(this._newUserCreationComponent, 'moveForward',this, 'handleMoveForward');
36 MochiKit.Signal.connect(this._newUserCreationComponent, 'keyPressed',this, 'handleNewUserCreationComponentKeyPressed');
37
38 this._rulerComponent = null;
39
40 this._steps = null;
41 this._currentStepIndex = 0;
42 this._isNextEnabled = false;
43
44 this._userCreationState = 'IDLE'; //'IN PROGRESS', 'DONE', 'FAILED'
45 this._user = null;
46 return this;
47}
48
49MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.NewUserWizardController.prototype, {
50
51 'toString': function() {
52 return "Clipperz.PM.UI.Web.Controllers.NewUserWizardController";
53 },
54
55 //-------------------------------------------------------------------------
56
57 'newUserCreationComponent': function () {
58 return this._newUserCreationComponent;
59 },
60
61 //=============================================================================
62
63 'user': function () {
64 return this._user;
65 },
66
67 'setUser': function (aValue) {
68 this._user = aValue;
69 },
70
71 //-----------------------------------------------------------------------------
72
73 'userCreationState': function () {
74 return this._userCreationState;
75 },
76
77 'setUserCreationState': function (aValue) {
78//console.log("+++ NewUserWizardController.setUserCreationState", aValue);
79 this._userCreationState = aValue;
80 this.checkState();
81 },
82
83 //=============================================================================
84
85 'resetCurrentStepIndex': function () {
86 this._currentStepIndex = 0;
87 this.rulerComponent().resetStatus({animateTransition:true});
88 },
89
90 //-----------------------------------------------------------------------------
91
92 'enableNext': function (aValue) {
93 this.rulerComponent().enableNext(aValue);
94 this._isNextEnabled = aValue;
95 },
96
97 'isNextEnabled': function () {
98 return this._isNextEnabled;
99 },
100
101 //-----------------------------------------------------------------------------
102
103 'enablePrevious': function (aValue) {
104 this.rulerComponent().enablePrevious(aValue);
105 },
106
107 //=============================================================================
108
109 'rulerComponent': function () {
110 if (this._rulerComponent == null) {
111 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
112 translationContext:'Wizards.NewUserWizard'
113 });
114 this._rulerComponent.render();
115
116 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
117 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
118 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward');
119 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward');
120 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved');
121 }
122
123 return this._rulerComponent;
124 },
125
126 'resetRuler': function () {
127 // if (this._rulerComponent != null) {
128 // this._rulerComponent.clear();
129 // }
130 // this._rulerComponent = null;
131 },
132
133 //-----------------------------------------------------------------------------
134
135 'showRuler': function (someSteps) {
136 var rulerElement;
137
138 this.setSteps(someSteps);
139
140 rulerElement = this.rulerComponent().element();
141 this.newUserCreationComponent().disableAllPanels();
142
143 MochiKit.Style.showElement(rulerElement);
144 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.newUserCreationComponent().bottomMargin()});
145 new MochiKit.Visual.Move(rulerElement, {
146 x:0, y:this.newUserCreationComponent().bottomMargin(),
147 mode:'absolute',
148 duration:0.5,
149 // afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
150 afterFinish:MochiKit.Base.method(this, 'handleRulerShowed')
151 });
152 },
153
154 //-----------------------------------------------------------------------------
155
156 'handleRulerShowed':function () {
157 return Clipperz.Async.callbacks("NewUserWizardController.handlerRulerShowed", [
158 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'),
159 MochiKit.Base.method(this, 'handleCursorMoved')
160 ], {trace:false});
161 },
162
163 //-----------------------------------------------------------------------------
164
165 'hideRuler': function () {
166 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:0.5});
167 },
168
169 'doneWithRuler': function () {
170 var rulerComponentElement;
171
172 rulerComponentElement = this.rulerComponent().element();
173 new MochiKit.Visual.Move(this.rulerComponent().element(), {
174 x:1000,
175 mode:'relative',
176 duration:1,
177 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
178 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
179 });
180 },
181
182 //=============================================================================
183
184 'createNewUserRulerSteps': function () {
185 return [ 'CREDENTIALS', 'CHECK_CREDENTIALS', 'TERMS_OF_SERVICE', 'CREATE_USER'/*, 'LOGIN' */];
186 },
187
188 //-------------------------------------------------------------------------
189
190 'run': function () {
191 return Clipperz.Async.callbacks("NewUserWizardController.run", [
192 MochiKit.Base.method(this, 'createNewUserRulerSteps'),
193 MochiKit.Base.method(this, 'showRuler')
194 ], {trace:false});
195 },
196
197 //-----------------------------------------------------------------------------
198
199 'checkState': function () {
200 var enablePrevious;
201 var enableNext;
202
203 enablePrevious = true;
204 enableNext = false;
205
206 this.newUserCreationComponent().disableAllPanels();
207
208 switch(this.currentStep()) {
209 case 'CREDENTIALS':
210 this.newUserCreationComponent().enableCredentialsPanel();
211
212 enableNext = (
213 (this.newUserCreationComponent().username() != '')
214 &&
215 (this.newUserCreationComponent().passphrase() != '')
216 );
217 // enablePrevious = false;
218 break;
219 case 'CHECK_CREDENTIALS':
220 this.newUserCreationComponent().enableCheckCredentialsPanel();
221
222 enableNext = (this.newUserCreationComponent().passphrase() == this.newUserCreationComponent().rePassphrase());
223 // enablePrevious = true;
224 break
225 case 'TERMS_OF_SERVICE':
226 this.newUserCreationComponent().enableTermsOfServicePanel();
227
228//console.log("awareOfUnrecoverablePassphrase", this.newUserCreationComponent().awareOfUnrecoverablePassphrase());
229//console.log("readTermsOfService", this.newUserCreationComponent().readTermsOfService());
230 enableNext = (
231 (this.newUserCreationComponent().awareOfUnrecoverablePassphrase() == 'on')
232 &&
233 (this.newUserCreationComponent().readTermsOfService() == 'on')
234 )
235 break;
236 case 'CREATE_USER':
237//console.log(">>> CREATE_USER", this.userCreationState());
238 this.newUserCreationComponent().enableCreateUserPanel();
239
240 switch (this.userCreationState()) {
241 case 'IDLE':
242 this.setUserCreationState('IN PROGRESS');
243 this.preformActualUserRegistration();
244
245 enablePrevious = false;
246 enableNext = false;
247 break;
248 case 'IN PROGRESS':
249 enablePrevious = false;
250 enableNext = false;
251 break;
252 case 'DONE':
253 enablePrevious = false;
254 enableNext = true;
255 break;
256 case 'FAILED':
257 enablePrevious = true;
258 enableNext = false;
259 break;
260 };
261 break;
262 // case 'LOGIN':
263 // this.newUserCreationComponent().enableLoginPanel();
264 // break;
265 }
266
267 if (this.currentStepIndex() > 0) {
268 this.enablePrevious(enablePrevious);
269 } else {
270 this.enablePrevious(false);
271 }
272 this.enableNext(enableNext);
273 },
274
275 //-----------------------------------------------------------------------------
276
277 'setFocus': function () {
278 switch(this.currentStep()) {
279 case 'CREDENTIALS':
280 this.newUserCreationComponent().focusOnUsernameElement();
281 break;
282 case 'CHECK_CREDENTIALS':
283 this.newUserCreationComponent().focusOnRePassphraseElement();
284 break
285 case 'TERMS_OF_SERVICE':
286 break;
287 case 'CREATE_USER':
288 break;
289 // case 'LOGIN':
290 // break;
291 }
292 },
293
294 //=============================================================================
295
296 'steps': function () {
297 return this._steps;
298 },
299
300 'setSteps': function (aValue) {
301 this._steps = aValue;
302
303 this.rulerComponent().setSteps(aValue);
304 this.resetCurrentStepIndex();
305 },
306
307 'currentStepIndex': function () {
308 return this._currentStepIndex;
309 },
310
311 'currentStep': function () {
312 return this.steps()[this.currentStepIndex()];
313 },
314
315 //=============================================================================
316
317 'handleExit': function () {
318 return Clipperz.Async.callbacks("NewUserWizardController.handleExit", [
319 // MochiKit.Base.method(this.newUserCreationComponent(), 'resetContent'),
320 Clipperz.Async.forkAndJoin("NewUserWizardController.handleExit - fork and join", [
321 MochiKit.Base.method(this, 'hideRuler'),
322 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredHideModal')
323 ], {trace:false}),
324 MochiKit.Base.method(this, 'resetRuler'),
325 // MochiKit.Base.method(this.newUserCreationComponent(), 'reset'),
326 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'exit')
327 ], {trace:false})
328 },
329
330 'done': function () {
331 this.doneWithRuler();
332 MochiKit.Signal.signal(this, 'done', {'user': this.user()});
333 },
334
335 //=============================================================================
336
337 'handleMoveBackward': function () {
338 if (this._currentStepIndex > 0) {
339 varafterMoveAction;
340
341 afterMoveAction = MochiKit.Base.noop;
342
343//console.log("<-- backward", this.currentStep());
344 switch(this.currentStep()) {
345 case 'CREDENTIALS':
346 case 'CHECK_CREDENTIALS':
347 case 'TERMS_OF_SERVICE':
348 this._currentStepIndex --;
349 this.rulerComponent().moveBackward(afterMoveAction);
350 break;
351 case 'CREATE_USER':
352 this.setUser(null);
353 this.newUserCreationComponent().hideAllProgeressStates();
354 this.resetCurrentStepIndex();
355 this.setUserCreationState('IDLE');
356 break;
357 // case 'LOGIN':
358 // break;
359 };
360
361 }
362
363 if (this._currentStepIndex == 0) {
364 this.enablePrevious(false);
365 }
366 },
367
368 'handleMoveForward': function () {
369 if (this.isNextEnabled()) {
370 varafterMoveAction;
371
372 this._currentStepIndex ++;
373 afterMoveAction = MochiKit.Base.noop;
374
375 switch(this.currentStep()) {
376 case 'CREDENTIALS':
377 break;
378 case 'CHECK_CREDENTIALS':
379 break
380 case 'TERMS_OF_SERVICE':
381 break;
382 case 'CREATE_USER':
383 break;
384 // case 'LOGIN':
385 // break;
386 };
387
388 this.rulerComponent().moveForward(afterMoveAction);
389 };
390 },
391
392 'handleCursorMoved': function () {
393 // this.checkState();
394 // this.setFocus();
395
396 return Clipperz.Async.callbacks("NewUserWizardController.handleCursorMoved", [
397 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'),
398 MochiKit.Base.method(this, 'checkState'),
399 MochiKit.Base.method(this, 'setFocus')
400 ], {trace:false});
401 },
402
403 //-------------------------------------------------------------------------
404
405 'handleChangedValue': function (anEvent) {
406 this.checkState();
407 },
408
409 //-------------------------------------------------------------------------
410
411 'handleNewUserCreationComponentKeyPressed': function (anEvent) {
412//console.log(">>> handleNewUserCreationComponentKeyPressed", anEvent.key().string);
413 if (anEvent.key().string == 'KEY_ENTER') {
414 if (anEvent.target().nodeName != 'TEXTAREA') {
415 anEvent.preventDefault();
416 this.handleMoveForward();
417 }
418 } else if (anEvent.key().string == 'KEY_TAB') {
419 if (anEvent.target() == this.newUserCreationComponent().usernameElement()) {
420 } else {
421 this.handleMoveForward();
422 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
423 anEvent.preventDefault();
424 }
425 }
426 } else if ((anEvent.key().string == 'KEY_ARROW_RIGHT') && (anEvent.modifier().meta == true)) {
427 this.handleMoveForward();
428 } else if ((anEvent.key().string == 'KEY_ARROW_LEFT') && (anEvent.modifier().meta == true)) {
429 this.handleMoveBackward();
430 } else if (anEvent.key().string == 'KEY_ESCAPE') {
431 anEvent.stop();
432 this.handleExit();
433 } else {
434 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'checkState'));
435 }
436 },
437
438 //=============================================================================
439
440 'preformActualUserRegistration': function () {
441 vardeferredResult;
442
443 deferredResult = new Clipperz.Async.Deferred("NewUSerWizardController.preformActualUserRegistration", {trace:false});
444 deferredResult.addMethod(this.newUserCreationComponent(), 'showProgressOnUserCreation');
445 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this.newUserCreationComponent(), 'passphrase'));
446 deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount,
447 this.newUserCreationComponent().username(),
448 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')
449 );
450 deferredResult.addMethod(this, 'setUser');
451 deferredResult.addMethod(this.newUserCreationComponent(), 'showUserCreationDone');
452 deferredResult.addMethod(this, 'setUserCreationState', 'DONE');
453
454 // deferredResult.addErrback(MochiKit.Base.method(this.newUserCreationComponent(), 'showUserCreationFailed'));
455 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUser', null));
456 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUserCreationState', 'FAILED'));
457 deferredResult.addErrback(MochiKit.Base.bind(function (aValue) {
458 this.newUserCreationComponent().showUserCreationFailed();
459 this.setUser(null);
460 this.setUserCreationState('FAILED');
461 }, this));
462 deferredResult.callback();
463
464 return deferredResult;
465 },
466
467 //=============================================================================
468 __syntaxFix__: "syntax fix"
469});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js
new file mode 100644
index 0000000..23fd236
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js
@@ -0,0 +1,166 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components');
30
31Clipperz.PM.UI.iPhone.Components.CardDetail = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.iPhone.Components.CardDetail.superclass.constructor.apply(this, arguments);
35
36 this._cardReference = null;
37
38 return this;
39}
40
41//=============================================================================
42
43Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.CardDetail, Clipperz.PM.UI.Common.Components.BaseComponent, {
44
45 //-------------------------------------------------------------------------
46
47 'toString': function () {
48 return "Clipperz.PM.UI.iPhone.Components.CardDetail component";
49 },
50
51 //-------------------------------------------------------------------------
52
53 'cardReference': function () {
54 return this._cardReference;
55 },
56
57 'setCardReference': function (aValue) {
58 this._cardReference = aValue;
59 },
60
61 //-------------------------------------------------------------------------
62
63 'renderSelf': function(/*aContainer, aPosition*/) {
64 this.append(this.element(), [
65 {tag:'div', cls:'cardDetail', id:this.getId('cardDetail'), children:[
66 {tag:'div', id:this.getId('progressBar')} //,
67 // {tag:'h1', cls:'loading', html:"loading"}
68 ]}
69 ]);
70
71 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
72 MochiKit.Signal.signal(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', 0);
73 },
74
75 //=========================================================================
76
77 'showCardDetails': function (someData) {
78 this.element().innerHTML = '';
79 this.append(this.element(), [
80 {tag:'fieldset', id:this.getId('fields'), children:MochiKit.Base.map(function (aFieldData) {
81 return {tag:'div', cls:'row', children:[
82 {tag:'label', html:aFieldData['label']},
83 // {tag:'span', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), html:aFieldData['value']}
84 {tag:'div', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), children:[
85 {tag:'div', children:[{tag:'p', html:aFieldData['value']}]}
86 ]}
87 // {tag:'input', type:'text', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), value:aFieldData['value'], disabled:true}
88
89 ]}
90 }, someData['fields'])}
91 ]);
92
93 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.element(), ['span.password']), MochiKit.Base.bind(function (aPasswordElement) {
94 MochiKit.Signal.connect(aPasswordElement, 'onclick', function (anEvent) { alert(MochiKit.DOM.scrapeText(anEvent.src())); })
95 }, this));
96
97 if (someData['directLogins'].length > 0) {
98 this.append(this.element(), [
99 {tag:'h2', html:"Direct logins"},
100 {tag:'fieldset', id:this.getId('directLogins'), children:MochiKit.Base.map(function (aDirectLoginData) {
101 return {tag:'div', cls:'row', id:('directLogin_' + aDirectLoginData['_reference']), children:[
102 {tag:'img', cls:'favicon', src:aDirectLoginData['favicon']},
103 // {tag:'input', cls:'directLogin', disabled:'disabled', type:'text', name:aDirectLoginData['label'], value:aDirectLoginData['label']}
104 {tag:'span', cls:'directLogin', html:aDirectLoginData['label']}
105 ]}
106 }, someData['directLogins'])}
107 ]);
108
109 MochiKit.Base.map(MochiKit.Base.bind(function (aRowNode) {
110 MochiKit.Signal.connect(aRowNode, 'onclick', this, 'directLoginClickHandler');
111 }, this),
112 MochiKit.Selector.findChildElements(this.getElement('directLogins'), ['div.row'])
113 )
114 };
115
116 if (someData['notes'] != '') {
117 this.append(this.element(), [
118 {tag:'h2', html:"Notes"},
119 {tag:'fieldset', id:this.getId('fieldset'), children:[
120 {tag:'div', cls:'row notes', children:[
121 {tag:'span', html:someData['notes']}
122 ]}
123 ]}
124 ]);
125 };
126
127 return true;
128 },
129
130 //-------------------------------------------------------------------------
131/*
132 'toggleClickHandler': function (anEvent) {
133 varnextState;
134 varfieldValue;
135
136//console.log("TOGGLE");
137 anEvent.preventDefault;
138 fieldValue = MochiKit.Selector.findChildElements(anEvent.src().parentNode.parentNode, ['span.password'])[0];
139
140 nextState = (MochiKit.DOM.getNodeAttribute(anEvent.src(), 'toggled') != 'true');
141 if (nextState) {
142 MochiKit.DOM.removeElementClass(fieldValue, 'clear');
143 } else {
144 MochiKit.DOM.addElementClass(fieldValue, 'clear');
145 }
146
147 MochiKit.DOM.setNodeAttribute(anEvent.src(), 'toggled', nextState);
148 },
149*/
150 //=========================================================================
151
152 'directLoginClickHandler': function (anEvent) {
153 anEvent.preventDefault();
154
155 if (/(directLogin_)/.test(anEvent.src().id)) {
156 var directLoginReference;
157
158 directLoginReference = anEvent.src().id.match(/(directLogin_)(.*)/)[2];
159 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', {cardReference:this.cardReference(), directLoginReference:directLoginReference});
160 }
161 },
162
163 //=========================================================================
164
165 __syntaxFix__: "syntax fix"
166});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js
new file mode 100644
index 0000000..770f983
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js
@@ -0,0 +1,204 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components');
30
31Clipperz.PM.UI.iPhone.Components.CardList = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.iPhone.Components.CardList.superclass.constructor.apply(this, arguments);
35
36 this._cardDetail = null;
37
38 return this;
39}
40
41//=============================================================================
42
43Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.CardList, Clipperz.PM.UI.Common.Components.BaseComponent, {
44
45 //-------------------------------------------------------------------------
46
47 'toString': function () {
48 return "Clipperz.PM.UI.iPhone.Components.CardList component";
49 },
50
51 //-------------------------------------------------------------------------
52
53 'renderSelf': function(/*aContainer, aPosition*/) {
54 this.append(this.element(), [
55 {tag:'div', cls:'toolbar', id:'toolbar', children:[
56 {tag:'h1', id:'pageTitle', html:"cards"},
57 {tag:'a', id:'backButton', cls:'button', href:'#', html:"cards"}
58 ]},
59 {tag:'div', cls:'cardList', id:this.getId('cardList'), children:[
60 {tag:'form', title:'search', cls:'panel cardListSearchForm', id:this.getId('cardListSearchForm'), children:[
61 {tag:'input', type:'search', name:'search', value:"", placeholder:"search", id:this.getId('searchField')}
62 ]},
63 {tag:'ul', cls:'panel cardListPanel', id:this.getId('cardListPanel'), children:[]}
64 ]},
65 {tag:'div', cls:'panel cardDetailPanel', id:this.getId('cardDetail')}
66 ]);
67
68 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onsubmit', this,'searchHandler');
69 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeydown', this,'searchHandler');
70 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeyup', this,'searchHandler');
71
72 MochiKit.Signal.connect(this.getElement('cardListPanel'), 'onclick', this,'cardListClickHandler');
73 MochiKit.Signal.connect('backButton', 'onclick', this,'backButtonClickHandler');
74
75 MochiKit.Style.hideElement('backButton');
76 MochiKit.Style.hideElement(this.getElement('cardDetail'));
77 },
78
79 //-------------------------------------------------------------------------
80
81 'searchHandler': function (anEvent) {
82 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) { //RETURN
83 anEvent.preventDefault();
84 } else {
85 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) {
86 anEvent.target().value = "";
87 }
88
89 if (anEvent.type() == 'keyup') {
90 MochiKit.Signal.signal(this, 'searchEvent', anEvent.target().value);
91 }
92 }
93 },
94
95 //-------------------------------------------------------------------------
96
97 'update': function (someObjects) {
98 varcardListPanel;
99 var i,c;
100
101 cardListPanel = this.getElement('cardListPanel');
102 cardListPanel.innerHTML = '';
103
104 c = someObjects.length;
105
106 for (i=0; i<c; i++) {
107 this.append(cardListPanel, {tag:'li', cls:'cardListItem', id:('cardListItem_' + someObjects[i]['_reference']), children:[
108 {tag:'img', src:(someObjects[i]['favicon'] ? someObjects[i]['favicon'] : 'data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=')},
109 {tag:'a', id:('cardListReference_' + someObjects[i]['_reference']), href:'#', html:someObjects[i]['label']}
110 ]})
111
112 MochiKit.Signal.connect('cardListItem_' + someObjects[i]['_reference'], 'onclick', this, 'cardListClickHandler');
113 }
114
115 },
116
117 'cardListClickHandler': function (anEvent) {
118 anEvent.preventDefault();
119
120 if (/(cardListReference_|cardListItem_)/.test(anEvent.target().id)) {
121 var cardListReference;
122
123 cardListReference = anEvent.target().id.match(/(cardListReference_|cardListItem_)(.*)/)[2];
124//console.log("Showing detail for card named", cardListReference);
125 MochiKit.Signal.signal(this, 'selectedCard', cardListReference);
126 }
127 },
128
129 //=========================================================================
130
131 'cardDetail': function (someData) {
132 if (this._cardDetail == null) {
133 this._cardDetail = new Clipperz.PM.UI.iPhone.Components.CardDetail({element:this.getElement('cardDetail')});
134 }
135
136 return this._cardDetail;
137 },
138
139 //-------------------------------------------------------------------------
140
141 'removeCardDetail': function () {
142 if (this._cardDetail != null) {
143 this._cardDetail.remove();
144 this._cardDetail = null;
145 }
146 },
147
148 //=========================================================================
149
150 'showCard': function (someData) {
151 vardeferredResult;
152 varoffset;
153
154 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
155 this.cardDetail().render();
156 this.cardDetail().setCardReference(someData['_reference']);
157 MochiKit.Style.setElementPosition(this.cardDetail().element(), {x:offset});
158 new MochiKit.Visual.Sequence([
159 // new MochiKit.Visual.Move(this.cardDetail().element(), {x:offset, y:45, mode:'absolute', duration:0, sync:true}),
160 new MochiKit.Visual.Parallel([
161 new MochiKit.Visual.Move(this.getElement('cardList'), {x:-offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
162 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:0, y:45, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}),
163 // new MochiKit.Visual.ScrollTo('toolbar', {sync:true}),
164 MochiKit.Visual.appear ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
165 ], {duration:1, sync:true}),
166 MochiKit.Visual.fade(this.getElement('cardList'), {duration:0, sync:true})
167 ], {})
168
169 MochiKit.DOM.getElement('pageTitle').innerHTML = someData['title'];
170
171 return true;
172 },
173
174 //-------------------------------------------------------------------------
175
176 'showCardDetails': function (someData) {
177 return this.cardDetail().showCardDetails(someData);
178 },
179
180 //=========================================================================
181
182 'backButtonClickHandler': function (anEvent) {
183 varoffset;
184
185 anEvent.preventDefault();
186
187 MochiKit.DOM.getElement('pageTitle').innerHTML = "cards";
188
189 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
190 MochiKit.Style.setElementPosition(this.getElement('cardList'), {x:-offset});
191 MochiKit.DOM.showElement(this.getElement('cardList'));
192
193 new MochiKit.Visual.Parallel([
194 new MochiKit.Visual.Move(this.getElement('cardList'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
195 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
196 MochiKit.Visual.fade (this.getElement('cardDetail'), { transition:MochiKit.Visual.Transitions.linear, sync:true}),
197 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
198 ], {duration:1, afterFinish:MochiKit.Base.method(this, 'removeCardDetail')})
199
200 },
201
202 //=========================================================================
203 __syntaxFix__: "syntax fix"
204});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js
new file mode 100644
index 0000000..eec83b0
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js
@@ -0,0 +1,181 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components');
30
31Clipperz.PM.UI.iPhone.Components.LoginForm = function(args) {
32 args = args || {};
33
34 Clipperz.PM.UI.iPhone.Components.LoginForm.superclass.constructor.apply(this, arguments);
35
36 return this;
37}
38
39//=============================================================================
40
41Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return "Clipperz.PM.UI.iPhone.Components.LoginForm component";
47 },
48
49 //-------------------------------------------------------------------------
50
51 'focusOnUsername': function () {
52 this.getElement('username').focus();
53 },
54
55 //-------------------------------------------------------------------------
56
57 'username': function () {
58 return this.getElement('username').value;
59 },
60
61 'passphrase': function () {
62 return this.getElement('passphrase').value;
63 },
64
65 //-------------------------------------------------------------------------
66
67 'renderSelf': function(/*aContainer, aPosition*/) {
68 this.append(this.element(), [
69 {tag:'div', cls:'toolbar iPhoneClipperzToolbar', children:[
70 {tag:'h1', id:'pageTitle', html:'Clipperz'},
71 {tag:'a', id:'backButton', cls:'button', href:'#', html:"back"}
72 ]},
73 {tag:'form', title:'Theaters', cls:'panel toolbarlessPanel loginForm', id:this.getId('loginFormPanel'), children:[
74 {tag:'fieldset', id:this.getId('fieldset'), children:[
75 {tag:'div', cls:'row', children:[
76 {tag:'label', html:"username"},
77 {tag:'input', type:'text', name:'username', value:"", autocorrect:'off', autocapitalize:'off', id:this.getId('username')}
78 ]},
79 {tag:'div', cls:'row', children:[
80 {tag:'label', html:"passphrase"},
81 {tag:'input', type:'password', name:'passphrase', value:"", id:this.getId('passphrase')}
82 ]}
83 ]},
84 {tag:'a', cls:'whiteButton', type:'submit', href:'#', html:"Login", id:this.getId('submit')}
85 ]},
86 {tag:'div', cls:'panel toolbarlessPanel loginProgressPanel', id:this.getId('loginProgressPanel'), children:[
87 {tag:'div', id:this.getId('progressBar')} //,
88 // {tag:'a', cls:'whiteButton', type:'submit', href:'#', html:"Cancel", id:this.getId('cancel')}
89 ]},
90 {tag:'div', cls:'panel loginErrorPanel', id:this.getId('loginErrorPanel'), children:[
91 {tag:'div', cls:'errorMessage', id:this.getId('errorMessageBox'), children:[
92 {tag:'h2', id:this.getId('errorMessage'), html:"Login failed"}
93 ]}
94 ]}
95 ]);
96
97 MochiKit.Signal.connect(this.getElement('submit'), 'onclick',this, 'submitHandler');
98 MochiKit.Signal.connect(this.getElement('loginFormPanel'), 'onsubmit',this, 'submitHandler');
99
100 // MochiKit.Signal.connect(this.getElement('cancel'), 'onclick',this, 'cancelHandler');
101 MochiKit.Signal.connect('backButton', 'onclick',this, 'backHandler');
102
103 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
104
105 // MochiKit.Style.hideElement(this.getElement('errorMessage'));
106
107 this.showLoginForm();
108 // MochiKit.Async.callLater(0.2, MochiKit.Base.method(this, 'focusOnUsername'));
109 },
110
111 //-------------------------------------------------------------------------
112
113 'showLoginForm': function () {
114 MochiKit.Style.showElement(this.getElement('loginFormPanel'));
115 MochiKit.Style.hideElement(this.getElement('loginProgressPanel'));
116 MochiKit.Style.hideElement(this.getElement('loginErrorPanel'));
117 MochiKit.Style.hideElement('backButton');
118 },
119
120 'slideInLoginForm': function () {
121 varoffset;
122
123 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
124
125 MochiKit.Style.showElement(this.getElement('loginFormPanel'));
126 MochiKit.Style.setElementPosition(this.getElement('loginFormPanel'), {x:-offset, y:0});
127
128 new MochiKit.Visual.Sequence([
129 new MochiKit.Visual.Parallel([
130 new MochiKit.Visual.Move(this.getElement('loginErrorPanel'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
131 new MochiKit.Visual.Move(this.getElement('loginFormPanel'), {x:0, y:0, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}),
132 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
133 ], {duration:0.5, sync:true}),
134 MochiKit.Visual.fade(this.getElement('loginErrorPanel'), {duration:0, sync:true})
135 ], {})
136 },
137
138 'showLoginProgress': function () {
139 MochiKit.Style.hideElement(this.getElement('loginFormPanel'));
140 MochiKit.Style.showElement(this.getElement('loginProgressPanel'));
141 },
142
143 'showLoginError': function (anError) {
144 this.getElement('errorMessage').innerHTML = "Login error";
145
146 MochiKit.Style.showElement('backButton');
147 MochiKit.Style.hideElement(this.getElement('loginProgressPanel'));
148 MochiKit.Style.showElement(this.getElement('loginErrorPanel'));
149 MochiKit.Style.setElementPosition(this.getElement('loginErrorPanel'), {x:0, y:45});
150 },
151
152 //-------------------------------------------------------------------------
153/*
154 'disableCancelButton': function () {
155 MochiKit.DOM.hideElement(this.getElement('cancel'));
156 },
157*/
158 //-------------------------------------------------------------------------
159
160 'submitHandler': function (anEvent) {
161 anEvent.preventDefault();
162
163 MochiKit.Signal.signal(this, 'doLogin', {'username':this.username(), 'passphrase':this.passphrase()});
164 },
165
166 'cancelHandler': function (anEvent) {
167 anEvent.preventDefault();
168
169//console.log("CANCEL");
170 },
171
172 'backHandler': function (anEvent) {
173 anEvent.preventDefault();
174
175 this.slideInLoginForm();
176 },
177
178 //-------------------------------------------------------------------------
179
180 __syntaxFix__: "syntax fix"
181});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js
new file mode 100644
index 0000000..b43d877
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js
@@ -0,0 +1,372 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.PM.UI.iPhone.Controllers');
30
31 //Some parts of this controller have been derived from the iUI library.
32
33Clipperz.PM.UI.iPhone.Controllers.MainController = function() {
34 this._loginForm = null;
35 this._cardList = null;
36 this._cachedValues =null;
37 this._user = null;
38
39 if (typeof window.onorientationchange == 'object') {
40 MochiKit.Signal.connect(window, 'onorientationchange', this, 'orientationChangeHandler');
41 MochiKit.Async.callLater(0, MochiKit.Base.method(this, 'orientationChangeHandler'));
42 } else {
43 this.setOrientation('portrait');
44 // this.setOrientation('landscape');
45 }
46
47 this.addMetaTag('viewport', 'width=devicewidth; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;');
48 this.addMetaTag('apple-mobile-web-app-capable', 'yes');
49 this.addMetaTag('apple-mobile-web-app-status-bar-style', 'black');
50
51 this.addLinkTag('apple-touch-icon', 'data:image/png;charset=utf-8;base64,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');
52 //this.addLinkTag('apple-touch-startup-image', 'default.png');
53
54 // if (!window.navigator.standalone)// not running as an installed app
55
56 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', this, 'selectedDirectLoginHandler');
57
58 MochiKit.DOM.addElementClass(document.body, 'iPhone');
59 return this;
60}
61
62MochiKit.Base.update(Clipperz.PM.UI.iPhone.Controllers.MainController.prototype, {
63
64 'toString': function () {
65 return "Clipperz.PM.UI.iPhone.Controllers.MainController";
66 },
67
68 //=========================================================================
69
70 'user': function () {
71 return this._user;
72 },
73
74 'setUser': function (aValue) {
75 this._user = aValue;
76 },
77
78 //=========================================================================
79
80 'loginForm': function() {
81 if (this._loginForm == null) {
82 MochiKit.DOM.removeElement('mainDiv');
83 this._loginForm = new Clipperz.PM.UI.iPhone.Components.LoginForm({element:MochiKit.DOM.currentDocument().body});
84 MochiKit.Signal.connect(this._loginForm, 'doLogin', this, 'doLoginHandler')
85 }
86
87 return this._loginForm;
88 },
89
90 'removeLoginForm': function () {
91 if (this._loginForm != null) {
92 this._loginForm.remove();
93 this._loginForm = null;
94 }
95 },
96
97 //-----------------------------------------------------------------------------
98
99 'cardList': function () {
100 if (this._cardList == null) {
101 this._cardList = new Clipperz.PM.UI.iPhone.Components.CardList({element:MochiKit.DOM.currentDocument().body});
102 MochiKit.Signal.connect(this._cardList, 'searchEvent',this, 'searchEventHandler')
103 MochiKit.Signal.connect(this._cardList, 'selectedCard',this, 'selecetedCardHandler')
104 }
105
106 return this._cardList;
107 },
108
109 //=========================================================================
110
111 'currentWidth': function () {
112 return this._currentWidth;
113 },
114
115 'setCurrentWidth': function (aValue) {
116 this._currentWidth = aValue;
117 },
118
119 //=========================================================================
120
121 'orientationChangeHandler': function () {
122 switch(window.orientation) {
123 case 0:
124 this.setOrientation('portrait');
125 break;
126 case 90:
127 case -90:
128 this.setOrientation('landscape');
129 break;
130 }
131 },
132
133 //-------------------------------------------------------------------------
134
135 'setOrientation': function (anOrientation) {
136 document.body.setAttribute('orientation', anOrientation);
137 setTimeout(scrollTo, 100, 0, 1);
138 },
139
140 //-------------------------------------------------------------------------
141
142 'slidePages': function (fromPage, toPage, backwards) {
143 var axis;
144 var slideDone;
145
146 slideDone = function () {
147 // console.log("slideDone");
148 if (!hasClass(toPage, "dialog")) {
149 fromPage.removeAttribute("selected");
150 }
151 checkTimer = setInterval(checkOrientAndLocation, 300);
152 setTimeout(updatePage, 0, toPage, fromPage);
153 fromPage.removeEventListener('webkitTransitionEnd', slideDone, false);
154 }
155
156 axis = (backwards ? fromPage : toPage).getAttribute("axis");
157
158 clearInterval(checkTimer);
159
160 if (canDoSlideAnim() && axis != 'y') {
161 slide2(fromPage, toPage, backwards, slideDone);
162 } else {
163 slide1(fromPage, toPage, backwards, axis, slideDone);
164 }
165 },
166
167 //-------------------------------------------------------------------------
168
169 'getCachedValues': function () {
170 var deferredResult;
171
172 if (this._cachedObjects != null) {
173 deferredResult = MochiKit.Async.succeed(this._cachedObjects);
174 } else {
175 deferredResult = new Clipperz.Async.Deferred("MainController.getCachedValues", {trace:false});
176 deferredResult.addMethod(this.user(), 'getRecords');
177 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.getCachedValues - collectResults", {
178 '_rowObject': MochiKit.Async.succeed,
179 '_reference': MochiKit.Base.methodcaller('reference'),
180 'label': MochiKit.Base.methodcaller('label'),
181 'favicon': MochiKit.Base.methodcaller('favicon'),
182 '_searchableContent':MochiKit.Base.methodcaller('searchableContent')
183 }, {trace:false}));
184 deferredResult.addCallback(Clipperz.Async.collectAll);
185 deferredResult.addCallback(MochiKit.Base.bind(function (someRows) {
186 this._cachedObjects = someRows;
187 return this._cachedObjects;
188 }, this));
189 deferredResult.callback();
190 }
191
192 return deferredResult;
193 },
194 //=========================================================================
195
196 'run': function(shouldShowRegistrationForm) {
197 this.loginForm().render();
198 MochiKit.Async.callLater(1, MochiKit.Base.method(this.loginForm(), 'focusOnUsername'));
199 },
200
201 //=========================================================================
202
203 'doLoginHandler': function (someArgs) {
204 var deferredResult;
205 varparameters;
206 varshouldUseOTP;
207 // var loginProgress;
208 varuser;
209 var getPassphraseDelegate;
210
211 parameters = someArgs;
212 shouldUseOTP = (typeof(parameters.passphrase) == 'undefined');
213
214 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase);
215 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':getPassphraseDelegate});
216
217 deferredResult = new Clipperz.Async.Deferred("MainController.doLogin", {trace:false});
218 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
219 deferredResult.addMethod(this.loginForm(), 'showLoginProgress');
220 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
221 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
222 deferredResult.addMethod(user, 'login');
223 deferredResult.addMethod(this, 'setUser', user);
224 deferredResult.addMethod(user, 'getRecords');
225 deferredResult.addMethod(this, 'removeLoginForm');
226 deferredResult.addMethod(this.cardList(), 'render');
227 deferredResult.addMethod(this, 'displaySelectedRecords', '');
228 deferredResult.addErrback(MochiKit.Base.method(this.loginForm(), 'showLoginError'));
229 deferredResult.callback();
230
231 return deferredResult;
232 },
233
234 //=========================================================================
235
236 'searchEventHandler': function (aValue) {
237//console.log("searching for ... " + aValue);
238 return this.displaySelectedRecords(aValue);
239 },
240
241 //=========================================================================
242
243 '_displaySelectedRows': function (aFilter, someRows) {
244 var result;
245
246 result = someRows;
247
248 if (aFilter != null) {
249 var filter;
250 varfilterRegExp;
251
252 filter = aFilter.replace(/[^A-Za-z0-9]/g, "\\$&");
253 filterRegExp = new RegExp(filter, "i");
254 result = MochiKit.Base.filter(function (aCachedResult) { return filterRegExp.test(aCachedResult['_searchableContent'])}, result);
255 }
256
257
258 result.sort(MochiKit.Base.partial(function (aKey, aComparator, aObject, bObject) {
259 return aComparator(aObject[aKey], bObject[aKey]);
260 }, 'label', Clipperz.Base.caseInsensitiveCompare));
261
262 this.cardList().update(result);
263 },
264
265 //-------------------------------------------------------------------------
266
267 'displaySelectedRecords': function (aFilter) {
268 return Clipperz.Async.callbacks("MainController.displaySelectedrows", [
269 MochiKit.Base.method(this, 'getCachedValues'),
270 MochiKit.Base.method(this, '_displaySelectedRows', aFilter)
271 ], {trace:false});
272 },
273
274 //=========================================================================
275
276 'selecetedCardHandler': function (aRecordReference) {
277 vardeferredResult;
278 varrecordData;
279
280 recordData = {};
281//console.log("Showing detail for card with reference", aRecordReference);
282 deferredResult = new Clipperz.Async.Deferred("MainController.selectedCardHandler", {trace:false});
283 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
284 deferredResult.collectResults({
285 '_reference':MochiKit.Base.methodcaller('reference'),
286 'title': MochiKit.Base.methodcaller('label'),
287 'favicon': MochiKit.Base.methodcaller('favicon')
288 });
289 deferredResult.addCallback(function (someData) {
290 MochiKit.Base.update(recordData, someData);
291 })
292 deferredResult.addMethod(this.cardList(), 'showCard', recordData);
293
294 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
295 deferredResult.addMethodcaller('notes');
296 deferredResult.addCallback(function (someNotes) {
297 recordData['notes'] = someNotes;
298 })
299
300 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
301 deferredResult.addMethodcaller('getCurrentRecordVersion');
302 deferredResult.addMethodcaller('fields');
303 deferredResult.addCallback(MochiKit.Base.values);
304 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.selectedCardHandler - fields", {
305 'label':MochiKit.Base.methodcaller('label'),
306 'value':MochiKit.Base.methodcaller('value'),
307 'isHidden':MochiKit.Base.methodcaller('isHidden')
308 }, {trace:false}));
309 deferredResult.addCallback(Clipperz.Async.collectAll);
310 deferredResult.addCallback(function (someData) {
311 recordData['fields'] = someData;
312 });
313
314 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
315 deferredResult.addMethodcaller('directLogins');
316 deferredResult.addCallback(MochiKit.Base.values);
317 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.selectedCardHandler - directLogins", {
318 'label': MochiKit.Base.methodcaller('label'),
319 'favicon': MochiKit.Base.methodcaller('favicon'),
320 '_reference':MochiKit.Base.methodcaller('reference')
321 }, {trace:false}));
322 deferredResult.addCallback(Clipperz.Async.collectAll);
323 deferredResult.addCallback(function (someData) {
324 recordData['directLogins'] = someData;
325 });
326
327 deferredResult.addMethod(this.cardList(), 'showCardDetails', recordData);
328 deferredResult.callback();
329
330 return deferredResult;
331 },
332
333 //=========================================================================
334
335 'selectedDirectLoginHandler': function (someData) {
336 vardeferredResult;
337
338//console.log("<<< signal - directLogin");
339 deferredResult = new Clipperz.Async.Deferred("MainController.selectedDirectLoginHandler", {trace:false});
340 deferredResult.addMethod(this.user(), 'getRecord', someData['cardReference']);
341 deferredResult.addMethodcaller('directLogins');
342 deferredResult.addCallback(MochiKit.Base.itemgetter(someData['directLoginReference']));
343 // deferredResult.addMethodcaller('runDirectLogin');
344 deferredResult.addCallback(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin);
345 deferredResult.callback();
346
347 return deferredResult;
348 },
349
350 //=========================================================================
351
352 'addMetaTag': function (aName, aContent) {
353 varmetaTag;
354
355 metaTag = document.createElement('meta');
356 metaTag.name = aName;
357 metaTag.content = aContent;
358 document.getElementsByTagName('head')[0].appendChild(metaTag);
359 },
360
361 'addLinkTag': function (aRel, anHref) {
362 var linkTag;
363
364 linkTag = document.createElement('link');
365 linkTag.rel = aRel;
366 linkTag.href = anHref;
367 document.getElementsByTagName('head')[0].appendChild(linkTag);
368 },
369
370 //=========================================================================
371 __syntaxFix__: "syntax fix"
372}); \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/Set.js b/frontend/gamma/js/Clipperz/Set.js
new file mode 100644
index 0000000..61e0769
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Set.js
@@ -0,0 +1,167 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29
30if (typeof(Clipperz) == 'undefined') {
31 Clipperz = {};
32}
33
34//#############################################################################
35
36Clipperz.Set = function(args) {
37 args = args || {};
38 //MochiKit.Base.bindMethods(this);
39
40 if (args.items != null) {
41 this._items = args.items.slice();
42 } else {
43 this._items = [];
44 }
45
46 return this;
47}
48
49//=============================================================================
50
51Clipperz.Set.prototype = MochiKit.Base.update(null, {
52
53 //-------------------------------------------------------------------------
54
55 'toString': function() {
56 return "Clipperz.Set";
57 },
58
59 //-------------------------------------------------------------------------
60
61 'items': function() {
62 return this._items;
63 },
64
65 //-------------------------------------------------------------------------
66
67 'popAnItem': function() {
68 var result;
69
70 if (this.size() > 0) {
71 result = this.items().pop();
72 } else {
73 result = null;
74 }
75
76 return result;
77 },
78
79 //-------------------------------------------------------------------------
80
81 'allItems': function() {
82 return this.items();
83 },
84
85 //-------------------------------------------------------------------------
86
87 'contains': function(anItem) {
88 return (this.indexOf(anItem) != -1);
89 },
90
91 //-------------------------------------------------------------------------
92
93 'indexOf': function(anItem) {
94 varresult;
95 vari, c;
96
97 result = -1;
98
99 c = this.items().length;
100 for (i=0; (i<c) && (result == -1); i++) {
101 if (this.items()[i] === anItem) {
102 result = i;
103 }
104 }
105
106 return result;
107 },
108
109 //-------------------------------------------------------------------------
110
111 'add': function(anItem) {
112 if (anItem.constructor == Array) {
113 MochiKit.Base.map(MochiKit.Base.bind(this,add, this), anItem);
114 } else {
115 if (! this.contains(anItem)) {
116 this.items().push(anItem);
117 }
118 }
119 },
120
121 //-------------------------------------------------------------------------
122
123 'debug': function() {
124 vari, c;
125
126 result = -1;
127
128 c = this.items().length;
129 for (i=0; i<c; i++) {
130 alert("[" + i + "] " + this.items()[i].label);
131 }
132 },
133
134 //-------------------------------------------------------------------------
135
136 'remove': function(anItem) {
137 if (anItem.constructor == Array) {
138 MochiKit.Base.map(MochiKit.Base.bind(this.remove, this), anItem);
139 } else {
140 varitemIndex;
141
142 itemIndex = this.indexOf(anItem);
143 if (itemIndex != -1) {
144 this.items().splice(itemIndex, 1);
145 }
146 }
147 },
148
149 //-------------------------------------------------------------------------
150
151 'size': function() {
152 return this.items().length;
153 },
154
155 //-------------------------------------------------------------------------
156
157 'empty': function() {
158 this.items().splice(0, this.items().length);
159 },
160
161 //-------------------------------------------------------------------------
162
163 __syntaxFix__: "syntax fix"
164
165 //-------------------------------------------------------------------------
166});
167
diff --git a/frontend/gamma/js/Clipperz/Signal.js b/frontend/gamma/js/Clipperz/Signal.js
new file mode 100644
index 0000000..b82499a
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Signal.js
@@ -0,0 +1,71 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Signal) == 'undefined') { Clipperz.Signal = {}; }
31
32Clipperz.Signal.VERSION = "0.1";
33Clipperz.Signal.NAME = "Clipperz.Signal";
34
35MochiKit.Base.update(Clipperz.Signal, {
36
37 //-------------------------------------------------------------------------
38
39 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]";
41 },
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return this.__repr__();
47 },
48
49 //-------------------------------------------------------------------------
50
51 'fireNativeEvent': function(element, eventName) {
52 if (element.fireEvent) {
53 // MSIE
54 element.fireEvent(eventName);
55 } else {
56 // W3C
57 var event;
58
59 event = document.createEvent("HTMLEvents");
60 event.initEvent(eventName.replace(/^on/, ""), true, true);
61 element.dispatchEvent(event);
62 }
63 },
64
65 //-------------------------------------------------------------------------
66 __syntaxFix__: "syntax fix"
67
68});
69
70Clipperz.Signal.NotificationCenter = {};
71
diff --git a/frontend/gamma/js/Clipperz/Style.js b/frontend/gamma/js/Clipperz/Style.js
new file mode 100644
index 0000000..3717f61
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Style.js
@@ -0,0 +1,94 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Style) == 'undefined') { Clipperz.Style = {}; }
31
32Clipperz.Style.VERSION = "0.1";
33Clipperz.Style.NAME = "Clipperz.DOM";
34
35MochiKit.Base.update(Clipperz.Style, {
36
37 //-------------------------------------------------------------------------
38
39 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]";
41 },
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return this.__repr__();
47 },
48
49 //-------------------------------------------------------------------------
50
51 'applyZebraStylesToTable': function(aTable) {
52 var tbody;
53 var tbodyRows;
54 var i,c;
55
56 tbody = MochiKit.DOM.getFirstElementByTagAndClassName('tbody', null, aTable);
57 tbodyRows = tbody.childNodes;
58 // tbodyRows = MochiKit.DOM.getElementsByTagAndClassName('tr', null, tbody)
59 c = tbodyRows.length;
60 for (i=0; i<c; i++) {
61 var element;
62
63 element = YAHOO.Element.get(tbodyRows[i]);
64 element.addClass(((i%2 == 0) ? "zebra_odd": "zebra_even"));
65 element.removeClass(((i%2 == 1) ? "zebra_odd": "zebra_even"));
66 }
67 },
68
69 //-------------------------------------------------------------------------
70
71 'getSizeAndPosition': function (anElement) {
72 var result;
73
74 if (anElement != null) {
75 result ={ dimensions:MochiKit.Style.getElementDimensions(anElement), position:MochiKit.Style.getElementPosition(anElement)};
76 } else {
77 result ={ dimensions:MochiKit.Style.getViewportDimensions(), position:MochiKit.Style.getViewportPosition()};
78 }
79
80 return result;
81 },
82
83 'setBackgroundGradient': function (anElement, someParameters) {
84 // background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
85 // background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
86 MochiKit.Style.setStyle(anElement, {'background': '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + someParameters['from'] + '), to(' + someParameters['to'] + '), color-stop(1,#333333))'});
87 MochiKit.Style.setStyle(anElement, {'background': '-moz-linear-gradient(0% 100% 90deg,' + someParameters['to'] + ', ' + someParameters['from'] + ')'});
88 },
89
90 //-------------------------------------------------------------------------
91 __syntaxFix__: "syntax fix"
92
93});
94
diff --git a/frontend/gamma/js/Clipperz/Visual.js b/frontend/gamma/js/Clipperz/Visual.js
new file mode 100644
index 0000000..b907d5c
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/Visual.js
@@ -0,0 +1,368 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; }
31
32Clipperz.Visual.VERSION = "0.1";
33Clipperz.Visual.NAME = "Clipperz.Visual";
34
35MochiKit.Base.update(Clipperz.Visual, {
36
37 //-------------------------------------------------------------------------
38
39 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]";
41 },
42
43 //-------------------------------------------------------------------------
44
45 'toString': function () {
46 return this.__repr__();
47 },
48
49 //-------------------------------------------------------------------------
50
51 'deferredResize': function (anElement, someOptions) {
52 var deferredResult;
53 var moveTransition;
54 var scaleTransition;
55 var duration;
56
57 duration = someOptions.duration || 0.5;
58
59 deferredResult = new Clipperz.Async.Deferred("Visual.deferredResize", {trace:false});
60 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
61
62 moveTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal;
63 scaleTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal;
64
65 MochiKit.Style.setElementPosition(anElement, {x:someOptions.from.position.x, y:someOptions.from.position.y }, 'px');
66
67 new MochiKit.Visual.Parallel([
68 new MochiKit.Visual.Move(anElement, {x:someOptions.to.position.x, y:someOptions.to.position.y, mode:'absolute', transition:moveTransition, sync:true}),
69 new Clipperz.Visual.Resize(anElement, {fromSize:{h:someOptions.from.dimensions.h, w:someOptions.from.dimensions.w}, toSize:{h:someOptions.to.dimensions.h, w:someOptions.to.dimensions.w}, transition:scaleTransition, scaleContent:false, scaleFromCenter:false, restoreAfterFinish:true, sync:true})
70 ], {duration:duration, afterFinish:MochiKit.Base.method(deferredResult, 'callback')})
71
72 return deferredResult;
73 },
74
75 //-------------------------------------------------------------------------
76
77 'deferredAnimation': function (anAnimation, someParameters, someOptions) {
78 vardeferredResult;
79 var afterFinishCallback;
80 var options;
81
82 deferredResult = new Clipperz.Async.Deferred("Clipperz.Visual.deferredAnimation", {trace:false});
83 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
84
85 if (MochiKit.Base.isUndefinedOrNull(someOptions)) {
86 options = {}
87 } else {
88 options = someOptions;
89 }
90
91 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) {
92 options['afterFinish'] = MochiKit.Base.noop;
93 }
94
95 MochiKit.Base.update(options, {
96 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback'))
97 });
98
99 new anAnimation(someParameters, options);
100
101 return deferredResult;
102 },
103
104 //-------------------------------------------------------------------------
105
106 'deferredAnimations': function (aSinchronizationType, someAnimations, someOptions) {
107 var deferredResult;
108 varoptions;
109
110 deferredResult = new Clipperz.Async.Deferred("Visual.deferredParallelAnimations", {trace:false});
111 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
112
113 options = someOptions;
114 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) {
115 options['afterFinish'] = MochiKit.Base.noop;
116 }
117 MochiKit.Base.update(options, {
118 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback'))
119 });
120
121 new aSinchronizationType(someAnimations, options)
122
123 return deferredResult;
124 },
125
126 //-------------------------------------------------------------------------
127 __syntaxFix__: "syntax fix"
128
129});
130
131//#############################################################################
132
133/** @id Clipperz.Visual.Resize */
134Clipperz.Visual.Resize = function (element, percent, options) {
135 var cls = arguments.callee;
136 if (!(this instanceof cls)) {
137 return new cls(element, percent, options);
138 }
139 this.__init__(element, percent, options);
140};
141
142Clipperz.Visual.Resize.prototype = new MochiKit.Visual.Base();
143
144MochiKit.Base.update(Clipperz.Visual.Resize.prototype, {
145 __class__ : Clipperz.Visual.Resize,
146
147 __init__: function (element, options) {
148 this.element = MochiKit.DOM.getElement(element);
149 options = MochiKit.Base.update({
150 scaleX: true,
151 scaleY: true,
152 scaleContent: true,
153 scaleFromCenter: false,
154 scaleMode: 'box', // 'box' or 'contents' or {} with provided values
155 syntax_fix: 'syntax fix'
156 }, options);
157
158 this.start(options);
159 },
160
161 setup: function () {
162 this.restoreAfterFinish = this.options.restoreAfterFinish || false;
163 this.elementPositioning = MochiKit.Style.getStyle(this.element, 'position');
164
165 var ma = MochiKit.Base.map;
166 var b = MochiKit.Base.bind;
167 this.originalStyle = {};
168 ma(b(function (k) { this.originalStyle[k] = this.element.style[k]; }, this), ['top', 'left', 'width', 'height', 'fontSize']);
169
170 this.originalTop = this.element.offsetTop;
171 this.originalLeft = this.element.offsetLeft;
172
173 var fontSize = MochiKit.Style.getStyle(this.element, 'font-size') || '100%';
174 ma(b(function (fontSizeType) {
175 if (fontSize.indexOf(fontSizeType) > 0) {
176 this.fontSize = parseFloat(fontSize);
177 this.fontSizeType = fontSizeType;
178 }
179 }, this), ['em', 'px', '%']);
180
181 this.factor = 1;
182
183 this.dims = [this.options.fromSize.h, this.options.fromSize.w];
184 },
185
186 update: function (position) {
187 this.setDimensions((this.options.toSize.h - this.options.fromSize.h) * position + this.options.fromSize.h,
188 (this.options.toSize.w - this.options.fromSize.w) * position + this.options.fromSize.w);
189 },
190
191 finish: function () {
192 if (this.restoreAfterFinish) {
193 MochiKit.Style.setStyle(this.element, this.originalStyle);
194 }
195 },
196
197 setDimensions: function (height, width) {
198 var d = {};
199 var r = Math.round;
200 if (/MSIE/.test(navigator.userAgent)) {
201 r = Math.ceil;
202 }
203 if (this.options.scaleX) {
204 d.width = r(width) + 'px';
205 }
206 if (this.options.scaleY) {
207 d.height = r(height) + 'px';
208 }
209 if (this.options.scaleFromCenter) {
210 var topd = (height - this.dims[0])/2;
211 var leftd = (width - this.dims[1])/2;
212 if (this.elementPositioning == 'absolute') {
213 if (this.options.scaleY) {
214 d.top = this.originalTop - topd + 'px';
215 }
216 if (this.options.scaleX) {
217 d.left = this.originalLeft - leftd + 'px';
218 }
219 } else {
220 if (this.options.scaleY) {
221 d.top = -topd + 'px';
222 }
223 if (this.options.scaleX) {
224 d.left = -leftd + 'px';
225 }
226 }
227 }
228 MochiKit.Style.setStyle(this.element, d);
229 }
230});
231
232//=============================================================================
233
234Clipperz.Visual.squize = function (element, /* optional */ options) {
235 var d = MochiKit.DOM;
236 var v = MochiKit.Visual;
237 var s = MochiKit.Style;
238
239 element = d.getElement(element);
240 options = MochiKit.Base.update({
241 moveTransition: v.Transitions.sinoidal,
242 scaleTransition: v.Transitions.sinoidal,
243 opacityTransition: v.Transitions.none,
244 scaleContent: true,
245 scaleFromCenter: false,
246 scaleX: true,
247 scaleY: true
248 }, options);
249 var oldStyle = {
250 top: element.style.top,
251 left: element.style.left,
252 height: element.style.height,
253 width: element.style.width,
254 opacity: s.getStyle(element, 'opacity')
255 };
256
257 var dims = s.getElementDimensions(element, true);
258 var moveX, moveY;
259
260 moveX = options.scaleX ? dims.w/2 : 0;
261 moveY = options.scaleY ? dims.h/2 : 0;
262
263 var elemClip;
264
265 var optionsParallel = MochiKit.Base.update({
266 beforeStartInternal: function (effect) {
267 s.makePositioned(effect.effects[0].element);
268 elemClip = s.makeClipping(effect.effects[0].element);
269 },
270 afterFinishInternal: function (effect) {
271 s.hideElement(effect.effects[0].element);
272 s.undoClipping(effect.effects[0].element, elemClip);
273 s.undoPositioned(effect.effects[0].element);
274 s.setStyle(effect.effects[0].element, oldStyle);
275 }
276 }, options);
277
278 return new v.Parallel(
279 [new v.Opacity(element, {
280 sync: true, to: 0.0, from: 1.0,
281 transition: options.opacityTransition
282 }),
283 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, {
284 scaleMode: {originalHeight: dims.h, originalWidth: dims.w},
285 sync: true, transition: options.scaleTransition,
286 scaleContent: options.scaleContent,
287 scaleFromCenter: options.scaleFromCenter,
288 restoreAfterFinish: true,
289 scaleX: options.scaleX,
290 scaleY: options.scaleY
291 }),
292 new v.Move(element, {
293 x: moveX, y: moveY, sync: true, transition: options.moveTransition
294 })
295 ], optionsParallel
296 );
297};
298
299//-----------------------------------------------------------------------------
300
301Clipperz.Visual.expand = function (element, /* optional */ options) {
302 var d = MochiKit.DOM;
303 var v = MochiKit.Visual;
304 var s = MochiKit.Style;
305
306 element = d.getElement(element);
307 options = MochiKit.Base.update({
308 // direction: 'center',
309 moveTransition: v.Transitions.sinoidal,
310 scaleTransition: v.Transitions.sinoidal,
311 opacityTransition: v.Transitions.none,
312 scaleContent: true,
313 scaleFromCenter: false,
314 scaleX: true,
315 scaleY: true
316 }, options);
317 var oldStyle = {
318 top: element.style.top,
319 left: element.style.left,
320 height: element.style.height,
321 width: element.style.width,
322 opacity: s.getStyle(element, 'opacity')
323 };
324
325 var dims = s.getElementDimensions(element, true);
326 var moveX, moveY;
327
328 moveX = options.scaleX ? dims.w/2 : 0;
329 moveY = options.scaleY ? dims.h/2 : 0;
330
331 var elemClip;
332
333 var optionsParallel = MochiKit.Base.update({
334 beforeStartInternal: function (effect) {
335 s.makePositioned(effect.effects[0].element);
336 elemClip = s.makeClipping(effect.effects[0].element);
337 },
338 afterFinishInternal: function (effect) {
339 s.hideElement(effect.effects[0].element);
340 s.undoClipping(effect.effects[0].element, elemClip);
341 s.undoPositioned(effect.effects[0].element);
342 s.setStyle(effect.effects[0].element, oldStyle);
343 }
344 }, options);
345
346 return new v.Parallel(
347 [new v.Opacity(element, {
348 sync: true, to: 0.0, from: 1.0,
349 transition: options.opacityTransition
350 }),
351 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, {
352 scaleMode: {originalHeight: dims.h, originalWidth: dims.w},
353 sync: true, transition: options.scaleTransition,
354 scaleContent: options.scaleContent,
355 scaleFromCenter: options.scaleFromCenter,
356 restoreAfterFinish: true,
357 scaleX: options.scaleX,
358 scaleY: options.scaleY
359 }),
360 new v.Move(element, {
361 x: moveX, y: moveY, sync: true, transition: options.moveTransition
362 })
363 ], optionsParallel
364 );
365};
366
367//=============================================================================
368
diff --git a/frontend/gamma/js/Clipperz/YUI/DomHelper.js b/frontend/gamma/js/Clipperz/YUI/DomHelper.js
new file mode 100644
index 0000000..dbd8c93
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/YUI/DomHelper.js
@@ -0,0 +1,481 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
31
32
33/**
34 * @class Clipperz.ext.DomHelper
35 * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM.
36 * For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
37 * @singleton
38 */
39Clipperz.YUI.DomHelper = new function(){
40 /**@private*/
41 var d = document;
42 var tempTableEl = null;
43 /** True to force the use of DOM instead of html fragments @type Boolean */
44 this.useDom = false;
45 var emptyTags = /^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i;
46 /**
47 * Applies a style specification to an element
48 * @param {String/HTMLElement} el The element to apply styles to
49 * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or
50 * a function which returns such a specification.
51 */
52 this.applyStyles = function(el, styles){
53 if(styles){
54 var D = YAHOO.util.Dom;
55 if (typeof styles == "string"){
56 var re = /\s?([a-z\-]*)\:([^;]*);?/gi;
57 var matches;
58 while ((matches = re.exec(styles)) != null){
59 D.setStyle(el, matches[1], matches[2]);
60 }
61 }else if (typeof styles == "object"){
62 for (var style in styles){
63 D.setStyle(el, style, styles[style]);
64 }
65 }else if (typeof styles == "function"){
66 Clipperz.YUI.DomHelper.applyStyles(el, styles.call());
67 }
68 }
69 };
70
71 // build as innerHTML where available
72 /** @ignore */
73 var createHtml = function(o){
74 var b = '';
75
76 if(typeof(o['html']) != 'undefined') {
77 o['html'] = Clipperz.Base.sanitizeString(o['html']);
78 } else if (typeof(o['htmlString']) != 'undefined') {
79 o['html'] = o['htmlString'];
80 delete o.htmlString;
81 }
82
83 if (MochiKit.Base.isArrayLike(o)) {
84 for (var i = 0, l = o.length; i < l; i++) {
85 b += createHtml(o[i]);
86 }
87 return b;
88 }
89
90 b += '<' + o.tag;
91 for(var attr in o){
92 if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue;
93 if(attr == 'style'){
94 var s = o['style'];
95 if(typeof s == 'function'){
96 s = s.call();
97 }
98 if(typeof s == 'string'){
99 b += ' style="' + s + '"';
100 }else if(typeof s == 'object'){
101 b += ' style="';
102 for(var key in s){
103 if(typeof s[key] != 'function'){
104 b += key + ':' + s[key] + ';';
105 }
106 }
107 b += '"';
108 }
109 }else{
110 if(attr == 'cls'){
111 b += ' class="' + o['cls'] + '"';
112 }else if(attr == 'htmlFor'){
113 b += ' for="' + o['htmlFor'] + '"';
114 }else{
115 b += ' ' + attr + '="' + o[attr] + '"';
116 }
117 }
118 }
119 if(emptyTags.test(o.tag)){
120 b += ' />';
121 }else{
122 b += '>';
123 if(o.children){
124 for(var i = 0, len = o.children.length; i < len; i++) {
125 b += createHtml(o.children[i], b);
126 }
127 }
128 if(o.html){
129 b += o.html;
130 }
131 b += '</' + o.tag + '>';
132 }
133 return b;
134 }
135
136 // build as dom
137 /** @ignore */
138 var createDom = function(o, parentNode){
139 var el = d.createElement(o.tag);
140 var useSet = el.setAttribute ? true : false; // In IE some elements don't have setAttribute
141 for(var attr in o){
142 if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue;
143 if(attr=='cls'){
144 el.className = o['cls'];
145 }else{
146 if(useSet) el.setAttribute(attr, o[attr]);
147 else el[attr] = o[attr];
148 }
149 }
150 Clipperz.YUI.DomHelper.applyStyles(el, o.style);
151 if(o.children){
152 for(var i = 0, len = o.children.length; i < len; i++) {
153 createDom(o.children[i], el);
154 }
155 }
156 if(o.html){
157 el.innerHTML = o.html;
158 }
159 if(parentNode){
160 parentNode.appendChild(el);
161 }
162 return el;
163 };
164
165 /**
166 * @ignore
167 * Nasty code for IE's broken table implementation
168 */
169 var insertIntoTable = function(tag, where, el, html){
170 if(!tempTableEl){
171 tempTableEl = document.createElement('div');
172 }
173 var nodes;
174 if(tag == 'table' || tag == 'tbody'){
175 tempTableEl.innerHTML = '<table><tbody>'+html+'</tbody></table>';
176 nodes = tempTableEl.firstChild.firstChild.childNodes;
177 }else{
178 tempTableEl.innerHTML = '<table><tbody><tr>'+html+'</tr></tbody></table>';
179 nodes = tempTableEl.firstChild.firstChild.firstChild.childNodes;
180 }
181 if (where == 'beforebegin') {
182 nodes.reverse();
183 // el.parentNode.insertBefore(node, el);
184 MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el)}, nodes);
185 } else if (where == 'afterbegin') {
186 nodes.reverse();
187 // el.insertBefore(node, el.firstChild);
188 MochiKit.Base.map(function(aNode) {el.insertBefore(aNode, el.firstChild)}, nodes);
189 } else if (where == 'beforeend') {
190 // el.appendChild(node);
191 MochiKit.Base.map(function(aNode) {el.appendChild(aNode)}, nodes);
192 } else if (where == 'afterend') {
193 // el.parentNode.insertBefore(node, el.nextSibling);
194 MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el.nextSibling)}, nodes);
195 }
196
197 return nodes;
198 }
199
200 /**
201 * Inserts an HTML fragment into the Dom
202 * @param {String} where Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd.
203 * @param {HTMLElement} el The context element
204 * @param {String} html The HTML fragmenet
205 * @return {HTMLElement} The new node
206 */
207 this.insertHtml = function(where, el, html){
208 where = where.toLowerCase();
209 // if(el.insertAdjacentHTML){
210 if(Clipperz_IEisBroken){
211 var tag = el.tagName.toLowerCase();
212 if(tag == 'table' || tag == 'tbody' || tag == 'tr'){
213 return insertIntoTable(tag, where, el, html);
214 }
215 switch(where){
216 case 'beforebegin':
217 el.insertAdjacentHTML(where, html);
218 return el.previousSibling;
219 case 'afterbegin':
220 el.insertAdjacentHTML(where, html);
221 return el.firstChild;
222 case 'beforeend':
223 el.insertAdjacentHTML(where, html);
224 return el.lastChild;
225 case 'afterend':
226 el.insertAdjacentHTML(where, html);
227 return el.nextSibling;
228 }
229 throw 'Illegal insertion point -> "' + where + '"';
230 }
231 var range = el.ownerDocument.createRange();
232 var frag;
233 switch(where){
234 case 'beforebegin':
235 range.setStartBefore(el);
236 frag = range.createContextualFragment(html);
237 el.parentNode.insertBefore(frag, el);
238 return el.previousSibling;
239 case 'afterbegin':
240 if(el.firstChild){ // faster
241 range.setStartBefore(el.firstChild);
242 }else{
243 range.selectNodeContents(el);
244 range.collapse(true);
245 }
246 frag = range.createContextualFragment(html);
247 el.insertBefore(frag, el.firstChild);
248 return el.firstChild;
249 case 'beforeend':
250 if(el.lastChild){
251 range.setStartAfter(el.lastChild); // faster
252 }else{
253 range.selectNodeContents(el);
254 range.collapse(false);
255 }
256 frag = range.createContextualFragment(html);
257 el.appendChild(frag);
258 return el.lastChild;
259 case 'afterend':
260 range.setStartAfter(el);
261 frag = range.createContextualFragment(html);
262 el.parentNode.insertBefore(frag, el.nextSibling);
263 return el.nextSibling;
264 }
265 throw 'Illegal insertion point -> "' + where + '"';
266 };
267
268 /**
269 * Creates new Dom element(s) and inserts them before el
270 * @param {String/HTMLElement/Element} el The context element
271 * @param {Object} o The Dom object spec (and children)
272 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
273 * @return {HTMLElement} The new node
274 */
275 this.insertBefore = function(el, o, returnElement){
276 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
277 var newNode;
278 if(this.useDom){
279 newNode = createDom(o, null);
280 el.parentNode.insertBefore(newNode, el);
281 }else{
282 var html = createHtml(o);
283 newNode = this.insertHtml('beforeBegin', el, html);
284 }
285 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
286 };
287
288 /**
289 * Creates new Dom element(s) and inserts them after el
290 * @param {String/HTMLElement/Element} el The context element
291 * @param {Object} o The Dom object spec (and children)
292 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
293 * @return {HTMLElement} The new node
294 */
295 this.insertAfter = function(el, o, returnElement){
296 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
297 var newNode;
298 if(this.useDom){
299 newNode = createDom(o, null);
300 el.parentNode.insertBefore(newNode, el.nextSibling);
301 }else{
302 var html = createHtml(o);
303 newNode = this.insertHtml('afterEnd', el, html);
304 }
305 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
306 };
307
308 /**
309 * Creates new Dom element(s) and appends them to el
310 * @param {String/HTMLElement/Element} el The context element
311 * @param {Object} o The Dom object spec (and children)
312 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
313 * @return {HTMLElement} The new node
314 */
315 this.append = function(el, o, returnElement){
316 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
317 var newNode;
318 if(this.useDom){
319 newNode = createDom(o, null);
320 el.appendChild(newNode);
321 }else{
322 var html = createHtml(o);
323 newNode = this.insertHtml('beforeEnd', el, html);
324 }
325 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
326 };
327
328 /**
329 * Creates new Dom element(s) and overwrites the contents of el with them
330 * @param {String/HTMLElement/Element} el The context element
331 * @param {Object} o The Dom object spec (and children)
332 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
333 * @return {HTMLElement} The new node
334 */
335 this.overwrite = function(el, o, returnElement){
336 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
337 el.innerHTML = createHtml(o);
338 return returnElement ? YAHOO.Element.get(el.firstChild, true) : el.firstChild;
339 };
340
341 /**
342 * Creates a new Clipperz.YUI.DomHelper.Template from the Dom object spec
343 * @param {Object} o The Dom object spec (and children)
344 * @return {Clipperz.YUI.DomHelper.Template} The new template
345 */
346 this.createTemplate = function(o){
347 var html = createHtml(o);
348 return new Clipperz.YUI.DomHelper.Template(html);
349 };
350}();
351
352/**
353* @class Clipperz.YUI.DomHelper.Template
354* Represents an HTML fragment template.
355* For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
356* <br>
357* <b>This class is also available as Clipperz.YUI.Template</b>.
358* @constructor
359* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('')
360*/
361Clipperz.YUI.DomHelper.Template = function(html){
362 if(html instanceof Array){
363 html = html.join('');
364 }else if(arguments.length > 1){
365 html = Array.prototype.join.call(arguments, '');
366 }
367 /**@private*/
368 this.html = html;
369};
370Clipperz.YUI.DomHelper.Template.prototype = {
371 /**
372 * Returns an HTML fragment of this template with the specified values applied
373 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
374 * @return {String}
375 */
376 applyTemplate : function(values){
377 if(this.compiled){
378 return this.compiled(values);
379 }
380 var empty = '';
381 var fn = function(match, index){
382 if(typeof values[index] != 'undefined'){
383 return values[index];
384 }else{
385 return empty;
386 }
387 }
388 return this.html.replace(this.re, fn);
389 },
390
391 /**
392 * The regular expression used to match template variables
393 * @type RegExp
394 * @property
395 */
396 re : /\{([\w|-]+)\}/g,
397
398 /**
399 * Compiles the template into an internal function, eliminating the RegEx overhead
400 */
401 compile : function(){
402 var body = ["this.compiled = function(values){ return ['"];
403 body.push(this.html.replace(this.re, "', values['$1'], '"));
404 body.push("'].join('');};");
405 eval(body.join(''));
406 return this;
407 },
408
409 /**
410 * Applies the supplied values to the template and inserts the new node(s) before el
411 * @param {String/HTMLElement/Element} el The context element
412 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
413 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
414 * @return {HTMLElement} The new node
415 */
416 insertBefore: function(el, values, returnElement){
417 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
418 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values));
419 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
420 },
421
422 /**
423 * Applies the supplied values to the template and inserts the new node(s) after el
424 * @param {String/HTMLElement/Element} el The context element
425 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
426 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
427 * @return {HTMLElement} The new node
428 */
429 insertAfter : function(el, values, returnElement){
430 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
431 var newNode = Clipperz.YUI.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values));
432 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
433 },
434
435 /**
436 * Applies the supplied values to the template and append the new node(s) to el
437 * @param {String/HTMLElement/Element} el The context element
438 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
439 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
440 * @return {HTMLElement} The new node
441 */
442 append : function(el, values, returnElement){
443 var sanitizedValues;
444 var key;
445
446 // sanitizedValues = MochiKit.Base.map(sanitizedValues)
447//console.log("values", values);
448 sanitizedValues = {};
449 for (key in values) {
450 sanitizedValues[key] = Clipperz.Base.sanitizeString(values[key]);
451 }
452//console.log("sanitizedValues", sanitizedValues);
453// el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
454 el = (typeof el == 'string') ? YAHOO.util.Dom.get(el) : el;
455//Clipperz.log(this.applyTemplate(sanitizedValues));
456 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(sanitizedValues));
457// return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
458 return newNode;
459 },
460
461 /**
462 * Applies the supplied values to the template and overwrites the content of el with the new node(s)
463 * @param {String/HTMLElement/Element} el The context element
464 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
465 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
466 * @return {HTMLElement} The new node
467 */
468 overwrite : function(el, values, returnElement){
469 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
470 el.innerHTML = '';
471 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values));
472 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
473 }
474};
475/**
476 * Alias for applyTemplate
477 * @method
478 */
479Clipperz.YUI.DomHelper.Template.prototype.apply = Clipperz.YUI.DomHelper.Template.prototype.applyTemplate;
480
481Clipperz.YUI.Template = Clipperz.YUI.DomHelper.Template;
diff --git a/frontend/gamma/js/Clipperz/YUI/DomQuery.js b/frontend/gamma/js/Clipperz/YUI/DomQuery.js
new file mode 100644
index 0000000..4a143ab
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/YUI/DomQuery.js
@@ -0,0 +1,714 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
31
32
33/*
34 * yui-ext 0.40
35 * Copyright(c) 2006, Jack Slocum.
36 */
37
38/**
39 * @class Clipperz.YUI.DomQuery
40 * Provides high performance selector/xpath processing by compiling queries into reusable functions.
41 * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in).
42 * @singleton
43 */
44Clipperz.YUI.DomQuery = function(){
45 var cache = {}, simpleCache = {}, valueCache = {};
46 var nonSpace = /\S/;
47 var trimRe = /^\s*(.*?)\s*$/;
48 var tplRe = /\{(\d+)\}/g;
49 var modeRe = /^(\s?[\/>]\s?|\s|$)/;
50 var clsRes = {};
51
52 function child(p, index){
53 var i = 0;
54 var n = p.firstChild;
55 while(n){
56 if(n.nodeType == 1){
57 i++;
58 if(i == index){
59 return n;
60 }
61 }
62 n = n.nextSibling;
63 }
64 return null;
65 };
66
67 function next(d){
68 var n = d.nextSibling;
69 while(n && n.nodeType != 1){
70 n = n.nextSibling;
71 }
72 return n;
73 };
74
75 function prev(d){
76 var n = d.previousSibling;
77 while(n && n.nodeType != 1){
78 n = n.previousSibling;
79 }
80 return n;
81 };
82
83 function clean(d){
84 var n = d.firstChild, ni = -1;
85 while(n){
86 var nx = n.nextSibling;
87 if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
88 d.removeChild(n);
89 }else{
90 n.nodeIndex = ++ni;
91 }
92 n = nx;
93 }
94 return this;
95 };
96
97 function byClassName(c, a, v){
98 if(!v){
99 return c;
100 }
101 var re = clsRes[v];
102 if(!re){
103 re = new RegExp('(?:^|\\s)(?:' + v + ')(?:\\s|$)');
104 clsRes[v] = re;
105 }
106 var r = [];
107 for(var i = 0, ci; ci = c[i]; i++){
108 if(re.test(ci.className)){
109 r[r.length] = ci;
110 }
111 }
112 return r;
113 };
114
115 function convert(c){
116 if(c.slice){
117 return c;
118 }
119 var r = [];
120 for(var i = 0, l = c.length; i < l; i++){
121 r[r.length] = c[i];
122 }
123 return r;
124 };
125
126 function attrValue(n, attr){
127 if(!n.tagName && typeof n.length != 'undefined'){
128 n = n[0];
129 }
130 if(!n){
131 return null;
132 }
133 if(attr == 'for'){
134 return n.htmlFor;
135 }
136 if(attr == 'class' || attr == 'className'){
137 return n.className;
138 }
139 return n.getAttribute(attr) || n[attr];
140
141 };
142
143 function getNodes(ns, mode, tagName){
144 var result = [], cs;
145 if(!ns){
146 return result;
147 }
148 mode = mode ? mode.replace(trimRe, '$1') : '';
149 tagName = tagName || '*';
150 if(ns.tagName || ns == document){
151 ns = [ns];
152 }
153 if(mode != '/' && mode != '>'){
154 for(var i = 0, ni; ni = ns[i]; i++){
155 cs = ni.getElementsByTagName(tagName);
156 result = concat(result, cs);
157 }
158 }else{
159 for(var i = 0, ni; ni = ns[i]; i++){
160 var cn = ni.getElementsByTagName(tagName);
161 for(var j = 0, cj; cj = cn[j]; j++){
162 if(cj.parentNode == ni){
163 result[result.length] = cj;
164 }
165 }
166 }
167
168 }
169 return result;
170 };
171
172 function concat(a, b){
173 if(b.slice){
174 return a.concat(b);
175 }
176 for(var i = 0, l = b.length; i < l; i++){
177 a[a.length] = b[i];
178 }
179 return a;
180 }
181
182 function byTag(cs, tagName){
183 if(cs.tagName || cs == document){
184 cs = [cs];
185 }
186 if(!tagName){
187 return cs;
188 }
189 var r = []; tagName = tagName.toLowerCase();
190 for(var i = 0, ci; ci = cs[i]; i++){
191 if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){
192 r[r.length] = ci;
193 }
194 }
195 return r;
196 };
197
198 function byId(cs, attr, id){
199 if(cs.tagName || cs == document){
200 cs = [cs];
201 }
202 if(!id){
203 return cs;
204 }
205 var r = [];
206 for(var i = 0, l = cs.length; i < l; i++){
207 var ci = cs[i];
208 if(ci && ci.id == id){
209 r[r.length] = ci;
210 }
211 }
212 return r;
213 };
214
215 function byAttribute(cs, attr, value, op, custom){
216 var r = [], st = custom=='{';
217 var f = Clipperz.YUI.DomQuery.operators[op];
218 for(var i = 0, l = cs.length; i < l; i++){
219 var a;
220 if(st){
221 a = Clipperz.YUI.DomQuery.getStyle(cs[i], attr);
222 }
223 else if(attr == 'class' || attr == 'className'){
224 a = cs[i].className;
225 }else if(attr == 'for'){
226 a = cs[i].htmlFor;
227 }else{
228 a = cs[i].getAttribute(attr);
229 }
230 if((f && f(a, value)) || (!f && a)){
231 r[r.length] = cs[i];
232 }
233 }
234 return r;
235 };
236
237 function byPseudo(cs, name, value){
238 return Clipperz.YUI.DomQuery.pseudos[name](cs, value);
239 };
240
241 // This is for IE MSXML which does not support expandos.
242 // IE runs the same speed using setAttribute, however FF slows way down
243 // and Safari completely fails so they need to continue to use expandos.
244 // Branched at load time for faster execution.
245 var isIE = window.ActiveXObject;
246 var addAttr = isIE ?
247 function(n, a, v){
248 n.setAttribute(a, v);
249 } :
250 function(n, a, v){
251 n[a] = v;
252 };
253 var getAttr = isIE ?
254 function(n, a){
255 return n.getAttribute(a);
256 } :
257 function(n, a){
258 return n[a];
259 };
260 var clearAttr = isIE ?
261 function(n, a){
262 n.removeAttribute(a);
263 } :
264 function(n, a, v){
265 delete n[a];
266 };
267
268 function nodup(cs){
269 if(!cs.length){
270 return cs;
271 }
272 addAttr(cs[0], '_nodup', true);
273 var r = [cs[0]];
274 for(var i = 1, len = cs.length; i < len; i++){
275 var c = cs[i];
276 if(!getAttr(c, '_nodup')){
277 addAttr(c, '_nodup', true);
278 r[r.length] = c;
279 }
280 }
281 for(var i = 0, len = cs.length; i < len; i++){
282 clearAttr(cs[i], '_nodup');
283 }
284 return r;
285 }
286
287 function quickDiff(c1, c2){
288 if(!c1.length){
289 return c2;
290 }
291 for(var i = 0, len = c1.length; i < len; i++){
292 addAttr(c1[i], '_qdiff', true);
293 }
294 var r = [];
295 for(var i = 0, len = c2.length; i < len; i++){
296 if(!getAttr(c2[i], '_qdiff')){
297 r[r.length] = c2[i];
298 }
299 }
300 for(var i = 0, len = c1.length; i < len; i++){
301 clearAttr(c1[i], '_qdiff');
302 }
303 return r;
304 }
305
306 function quickId(ns, mode, root, id){
307 if(ns == root){
308 var d = root.ownerDocument || root;
309 return d.getElementById(id);
310 }
311 ns = getNodes(ns, mode, '*');
312 return byId(ns, null, id);
313 }
314
315 return {
316 getStyle : function(el, name){
317 return YAHOO.util.Dom.getStyle(el, name);
318 },
319 /**
320 * Compiles a selector/xpath query into a reusable function. The returned function
321 * takes one parameter "root" (optional), which is the context node from where the query should start.
322 * @param {String} selector The selector/xpath query
323 * @param {String} type (optional) Either 'select' (the default) or 'simple' for a simple selector match
324 * @return {Function}
325 */
326 compile : function(path, type){
327 // strip leading slashes
328 while(path.substr(0, 1)=='/'){
329 path = path.substr(1);
330 }
331 type = type || 'select';
332
333 var fn = ['var f = function(root){\n var mode; var n = root || document;\n'];
334 var q = path, mode, lq;
335 var tk = Clipperz.YUI.DomQuery.matchers;
336 var tklen = tk.length;
337 var mm;
338 while(q && lq != q){
339 lq = q;
340 var tm = q.match(/^(#)?([\w-\*]+)/);
341 if(type == 'select'){
342 if(tm){
343 if(tm[1] == '#'){
344 fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';
345 }else{
346 fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';
347 }
348 q = q.replace(tm[0], '');
349 }else{
350 fn[fn.length] = 'n = getNodes(n, mode, "*");';
351 }
352 }else{
353 if(tm){
354 if(tm[1] == '#'){
355 fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';
356 }else{
357 fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';
358 }
359 q = q.replace(tm[0], '');
360 }
361 }
362 while(!(mm = q.match(modeRe))){
363 var matched = false;
364 for(var j = 0; j < tklen; j++){
365 var t = tk[j];
366 var m = q.match(t.re);
367 if(m){
368 fn[fn.length] = t.select.replace(tplRe, function(x, i){
369 return m[i];
370 });
371 q = q.replace(m[0], '');
372 matched = true;
373 break;
374 }
375 }
376 // prevent infinite loop on bad selector
377 if(!matched){
378 throw 'Error parsing selector, parsing failed at "' + q + '"';
379 }
380 }
381 if(mm[1]){
382 fn[fn.length] = 'mode="'+mm[1]+'";';
383 q = q.replace(mm[1], '');
384 }
385 }
386 fn[fn.length] = 'return nodup(n);\n}';
387 eval(fn.join(''));
388 return f;
389 },
390
391 /**
392 * Selects a group of elements.
393 * @param {String} selector The selector/xpath query
394 * @param {Node} root (optional) The start of the query (defaults to document).
395 * @return {Array}
396 */
397 select : function(path, root, type){
398 if(!root || root == document){
399 root = document;
400 }
401 if(typeof root == 'string'){
402 root = document.getElementById(root);
403 }
404 var paths = path.split(',');
405 var results = [];
406 for(var i = 0, len = paths.length; i < len; i++){
407 var p = paths[i].replace(trimRe, '$1');
408 if(!cache[p]){
409 cache[p] = Clipperz.YUI.DomQuery.compile(p);
410 if(!cache[p]){
411 throw p + ' is not a valid selector';
412 }
413 }
414 var result = cache[p](root);
415 if(result && result != document){
416 results = results.concat(result);
417 }
418 }
419 return results;
420 },
421
422 /**
423 * Selects a single element.
424 * @param {String} selector The selector/xpath query
425 * @param {Node} root (optional) The start of the query (defaults to document).
426 * @return {Element}
427 */
428 selectNode : function(path, root){
429 return Clipperz.YUI.DomQuery.select(path, root)[0];
430 },
431
432 /**
433 * Selects the value of a node, optionally replacing null with the defaultValue.
434 * @param {String} selector The selector/xpath query
435 * @param {Node} root (optional) The start of the query (defaults to document).
436 * @param {String} defaultValue
437 */
438 selectValue : function(path, root, defaultValue){
439 path = path.replace(trimRe, '$1');
440 if(!valueCache[path]){
441 valueCache[path] = Clipperz.YUI.DomQuery.compile(path, 'simple');
442 }
443 var n = valueCache[path](root);
444 n = n[0] ? n[0] : n;
445 var v = (n && n.firstChild ? n.firstChild.nodeValue : null);
446 return (v === null ? defaultValue : v);
447 },
448
449 /**
450 * Selects the value of a node, parsing integers and floats.
451 * @param {String} selector The selector/xpath query
452 * @param {Node} root (optional) The start of the query (defaults to document).
453 * @param {Number} defaultValue
454 * @return {Number}
455 */
456 selectNumber : function(path, root, defaultValue){
457 var v = Clipperz.YUI.DomQuery.selectValue(path, root, defaultValue || 0);
458 return parseFloat(v);
459 },
460
461 /**
462 * Returns true if the passed element(s) match the passed simple selector (e.g. div.some-class or span:first-child)
463 * @param {String/HTMLElement/Array} el An element id, element or array of elements
464 * @param {String} selector The simple selector to test
465 * @return {Boolean}
466 */
467 is : function(el, ss){
468 if(typeof el == 'string'){
469 el = document.getElementById(el);
470 }
471 var isArray = (el instanceof Array);
472 var result = Clipperz.YUI.DomQuery.filter(isArray ? el : [el], ss);
473 return isArray ? (result.length == el.length) : (result.length > 0);
474 },
475
476 /**
477 * Filters an array of elements to only include matches of a simple selector (e.g. div.some-class or span:first-child)
478 * @param {Array} el An array of elements to filter
479 * @param {String} selector The simple selector to test
480 * @param {Boolean} nonMatches If true, it returns the elements that DON'T match
481 * the selector instead of the ones that match
482 * @return {Array}
483 */
484 filter : function(els, ss, nonMatches){
485 ss = ss.replace(trimRe, '$1');
486 if(!simpleCache[ss]){
487 simpleCache[ss] = Clipperz.YUI.DomQuery.compile(ss, 'simple');
488 }
489 var result = simpleCache[ss](els);
490 return nonMatches ? quickDiff(result, els) : result;
491 },
492
493 /**
494 * Collection of matching regular expressions and code snippets.
495 */
496 matchers : [{
497 re: /^\.([\w-]+)/,
498 select: 'n = byClassName(n, null, "{1}");'
499 }, {
500 re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
501 select: 'n = byPseudo(n, "{1}", "{2}");'
502 },{
503 re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
504 select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'
505 }, {
506 re: /^#([\w-]+)/,
507 select: 'n = byId(n, null, "{1}");'
508 },{
509 re: /^@([\w-]+)/,
510 select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
511 }
512 ],
513
514 /**
515 * Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *= and %=.
516 * New operators can be added as long as the match the format <i>c</i>= where <i>c<i> is any character other than space, &gt; &lt;.
517 */
518 operators : {
519 '=' : function(a, v){
520 return a == v;
521 },
522 '!=' : function(a, v){
523 return a != v;
524 },
525 '^=' : function(a, v){
526 return a && a.substr(0, v.length) == v;
527 },
528 '$=' : function(a, v){
529 return a && a.substr(a.length-v.length) == v;
530 },
531 '*=' : function(a, v){
532 return a && a.indexOf(v) !== -1;
533 },
534 '%=' : function(a, v){
535 return (a % v) == 0;
536 }
537 },
538
539 /**
540 * Collection of "pseudo class" processors. Each processor is passed the current nodeset (array)
541 * and the argument (if any) supplied in the selector.
542 */
543 pseudos : {
544 'first-child' : function(c){
545 var r = [];
546 for(var i = 0, l = c.length; i < l; i++){
547 var ci = c[i];
548 if(!prev(ci)){
549 r[r.length] = ci;
550 }
551 }
552 return r;
553 },
554
555 'last-child' : function(c){
556 var r = [];
557 for(var i = 0, l = c.length; i < l; i++){
558 var ci = c[i];
559 if(!next(ci)){
560 r[r.length] = ci;
561 }
562 }
563 return r;
564 },
565
566 'nth-child' : function(c, a){
567 var r = [];
568 if(a != 'odd' && a != 'even'){
569 for(var i = 0, ci; ci = c[i]; i++){
570 var m = child(ci.parentNode, a);
571 if(m == ci){
572 r[r.length] = m;
573 }
574 }
575 return r;
576 }
577 var p;
578 // first let's clean up the parent nodes
579 for(var i = 0, l = c.length; i < l; i++){
580 var cp = c[i].parentNode;
581 if(cp != p){
582 clean(cp);
583 p = cp;
584 }
585 }
586 // then lets see if we match
587 for(var i = 0, l = c.length; i < l; i++){
588 var ci = c[i], m = false;
589 if(a == 'odd'){
590 m = ((ci.nodeIndex+1) % 2 == 1);
591 }else if(a == 'even'){
592 m = ((ci.nodeIndex+1) % 2 == 0);
593 }
594 if(m){
595 r[r.length] = ci;
596 }
597 }
598 return r;
599 },
600
601 'only-child' : function(c){
602 var r = [];
603 for(var i = 0, l = c.length; i < l; i++){
604 var ci = c[i];
605 if(!prev(ci) && !next(ci)){
606 r[r.length] = ci;
607 }
608 }
609 return r;
610 },
611
612 'empty' : function(c){
613 var r = [];
614 for(var i = 0, l = c.length; i < l; i++){
615 var ci = c[i];
616 if(!ci.firstChild){
617 r[r.length] = ci;
618 }
619 }
620 return r;
621 },
622
623 'contains' : function(c, v){
624 var r = [];
625 for(var i = 0, l = c.length; i < l; i++){
626 var ci = c[i];
627 if(ci.innerHTML.indexOf(v) !== -1){
628 r[r.length] = ci;
629 }
630 }
631 return r;
632 },
633
634 'checked' : function(c){
635 var r = [];
636 for(var i = 0, l = c.length; i < l; i++){
637 if(c[i].checked == 'checked'){
638 r[r.length] = c[i];
639 }
640 }
641 return r;
642 },
643
644 'not' : function(c, ss){
645 return Clipperz.YUI.DomQuery.filter(c, ss, true);
646 },
647
648 'odd' : function(c){
649 return this['nth-child'](c, 'odd');
650 },
651
652 'even' : function(c){
653 return this['nth-child'](c, 'even');
654 },
655
656 'nth' : function(c, a){
657 return c[a-1];
658 },
659
660 'first' : function(c){
661 return c[0];
662 },
663
664 'last' : function(c){
665 return c[c.length-1];
666 },
667
668 'has' : function(c, ss){
669 var s = Clipperz.YUI.DomQuery.select;
670 var r = [];
671 for(var i = 0, ci; ci = c[i]; i++){
672 if(s(ss, ci).length > 0){
673 r[r.length] = ci;
674 }
675 }
676 return r;
677 },
678
679 'next' : function(c, ss){
680 var is = Clipperz.YUI.DomQuery.is;
681 var r = [];
682 for(var i = 0, ci; ci = c[i]; i++){
683 var n = next(ci);
684 if(n && is(n, ss)){
685 r[r.length] = ci;
686 }
687 }
688 return r;
689 },
690
691 'prev' : function(c, ss){
692 var is = Clipperz.YUI.DomQuery.is;
693 var r = [];
694 for(var i = 0, ci; ci = c[i]; i++){
695 var n = prev(ci);
696 if(n && is(n, ss)){
697 r[r.length] = ci;
698 }
699 }
700 return r;
701 }
702 }
703 };
704}();
705
706/**
707 * Selects an array of DOM nodes by CSS/XPath selector. Shorthand of {@link Clipperz.YUI.DomQuery#select}
708 * @param {String} path The selector/xpath query
709 * @param {Node} root (optional) The start of the query (defaults to document).
710 * @return {Array}
711 * @member Ext
712 * @method query
713 */
714Clipperz.YUI.query = Clipperz.YUI.DomQuery.select;
diff --git a/frontend/gamma/js/Clipperz/YUI/Utils.js b/frontend/gamma/js/Clipperz/YUI/Utils.js
new file mode 100644
index 0000000..4d4a5f9
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/YUI/Utils.js
@@ -0,0 +1,98 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof YAHOO == 'undefined') { YAHOO = {}; };
30if (typeof YAHOO.util == 'undefined') { YAHOO.util = {}; };
31if (typeof YAHOO.util.Dom == 'undefined') { YAHOO.util.Dom = {}; };
32
33YAHOO.extend = function(subc, superc, overrides) {
34 var F = function() {};
35 F.prototype=superc.prototype;
36 subc.prototype=new F();
37 subc.prototype.constructor=subc;
38 subc.superclass=superc.prototype;
39 if (superc.prototype.constructor == Object.prototype.constructor) {
40 superc.prototype.constructor=superc;
41 }
42
43 if (overrides) {
44 for (var i in overrides) {
45 subc.prototype[i]=overrides[i];
46 }
47 }
48};
49
50YAHOO.override = function(origclass, overrides){
51 if(overrides){
52 var p = origclass.prototype;
53 for(var method in overrides){
54 p[method] = overrides[method];
55 }
56 }
57};
58
59YAHOO.extendX = function(subclass, superclass, overrides){
60 YAHOO.extend(subclass, superclass);
61 subclass.override = function(o){
62 YAHOO.override(subclass, o);
63 };
64 if(!subclass.prototype.override){
65 subclass.prototype.override = function(o){
66 for(var method in o){
67 this[method] = o[method];
68 }
69 };
70 }
71 if(overrides){
72 subclass.override(overrides);
73 };
74
75};
76
77YAHOO.util.Dom.get = function(el) {
78 if (!el) { return null; } // nothing to work with
79
80 if (typeof el != 'string' && !(el instanceof Array) ) { // assuming HTMLElement or HTMLCollection, so pass back as is
81 return el;
82 }
83
84 if (typeof el == 'string') { // ID
85 return document.getElementById(el);
86 }
87 else { // array of ID's and/or elements
88 var collection = [];
89 for (var i = 0, len = el.length; i < len; ++i) {
90 collection[collection.length] = YAHOO.util.Dom.get(el[i]);
91 }
92
93 return collection;
94 }
95
96 return null; // safety, should never happen
97};
98
diff --git a/frontend/gamma/js/JSON/json2.js b/frontend/gamma/js/JSON/json2.js
new file mode 100644
index 0000000..b67e167
--- a/dev/null
+++ b/frontend/gamma/js/JSON/json2.js
@@ -0,0 +1,481 @@
1/*
2 http://www.JSON.org/json2.js
3 2008-09-01
4
5 Public Domain.
6
7 NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
8
9 See http://www.JSON.org/js.html
10
11 This file creates a global JSON object containing two methods: stringify
12 and parse.
13
14 JSON.stringify(value, replacer, space)
15 value any JavaScript value, usually an object or array.
16
17 replacer an optional parameter that determines how object
18 values are stringified for objects. It can be a
19 function or an array of strings.
20
21 space an optional parameter that specifies the indentation
22 of nested structures. If it is omitted, the text will
23 be packed without extra whitespace. If it is a number,
24 it will specify the number of spaces to indent at each
25 level. If it is a string (such as '\t' or '&nbsp;'),
26 it contains the characters used to indent at each level.
27
28 This method produces a JSON text from a JavaScript value.
29
30 When an object value is found, if the object contains a toJSON
31 method, its toJSON method will be called and the result will be
32 stringified. A toJSON method does not serialize: it returns the
33 value represented by the name/value pair that should be serialized,
34 or undefined if nothing should be serialized. The toJSON method
35 will be passed the key associated with the value, and this will be
36 bound to the object holding the key.
37
38 For example, this would serialize Dates as ISO strings.
39
40 Date.prototype.toJSON = function (key) {
41 function f(n) {
42 // Format integers to have at least two digits.
43 return n < 10 ? '0' + n : n;
44 }
45
46 return this.getUTCFullYear() + '-' +
47 f(this.getUTCMonth() + 1) + '-' +
48 f(this.getUTCDate()) + 'T' +
49 f(this.getUTCHours()) + ':' +
50 f(this.getUTCMinutes()) + ':' +
51 f(this.getUTCSeconds()) + 'Z';
52 };
53
54 You can provide an optional replacer method. It will be passed the
55 key and value of each member, with this bound to the containing
56 object. The value that is returned from your method will be
57 serialized. If your method returns undefined, then the member will
58 be excluded from the serialization.
59
60 If the replacer parameter is an array of strings, then it will be used to
61 select the members to be serialized. It filters the results such
62 that only members with keys listed in the replacer array are
63 stringified.
64
65 Values that do not have JSON representations, such as undefined or
66 functions, will not be serialized. Such values in objects will be
67 dropped; in arrays they will be replaced with null. You can use
68 a replacer function to replace those with JSON values.
69 JSON.stringify(undefined) returns undefined.
70
71 The optional space parameter produces a stringification of the
72 value that is filled with line breaks and indentation to make it
73 easier to read.
74
75 If the space parameter is a non-empty string, then that string will
76 be used for indentation. If the space parameter is a number, then
77 the indentation will be that many spaces.
78
79 Example:
80
81 text = JSON.stringify(['e', {pluribus: 'unum'}]);
82 // text is '["e",{"pluribus":"unum"}]'
83
84
85 text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
86 // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
87
88 text = JSON.stringify([new Date()], function (key, value) {
89 return this[key] instanceof Date ?
90 'Date(' + this[key] + ')' : value;
91 });
92 // text is '["Date(---current time---)"]'
93
94
95 JSON.parse(text, reviver)
96 This method parses a JSON text to produce an object or array.
97 It can throw a SyntaxError exception.
98
99 The optional reviver parameter is a function that can filter and
100 transform the results. It receives each of the keys and values,
101 and its return value is used instead of the original value.
102 If it returns what it received, then the structure is not modified.
103 If it returns undefined then the member is deleted.
104
105 Example:
106
107 // Parse the text. Values that look like ISO date strings will
108 // be converted to Date objects.
109
110 myData = JSON.parse(text, function (key, value) {
111 var a;
112 if (typeof value === 'string') {
113 a =
114/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
115 if (a) {
116 return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
117 +a[5], +a[6]));
118 }
119 }
120 return value;
121 });
122
123 myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
124 var d;
125 if (typeof value === 'string' &&
126 value.slice(0, 5) === 'Date(' &&
127 value.slice(-1) === ')') {
128 d = new Date(value.slice(5, -1));
129 if (d) {
130 return d;
131 }
132 }
133 return value;
134 });
135
136
137 This is a reference implementation. You are free to copy, modify, or
138 redistribute.
139
140 This code should be minified before deployment.
141 See http://javascript.crockford.com/jsmin.html
142
143 USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
144 NOT CONTROL.
145*/
146
147/*jslint evil: true */
148
149/*global JSON */
150
151/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", call,
152 charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, getUTCMinutes,
153 getUTCMonth, getUTCSeconds, hasOwnProperty, join, lastIndex, length,
154 parse, propertyIsEnumerable, prototype, push, replace, slice, stringify,
155 test, toJSON, toString, valueOf
156*/
157
158// Create a JSON object only if one does not already exist. We create the
159// methods in a closure to avoid creating global variables.
160
161if (!this.JSON) {
162 JSON = {};
163}
164(function () {
165
166 function f(n) {
167 // Format integers to have at least two digits.
168 return n < 10 ? '0' + n : n;
169 }
170
171 if (typeof Date.prototype.toJSON !== 'function') {
172
173 Date.prototype.toJSON = function (key) {
174
175 return this.getUTCFullYear() + '-' +
176 f(this.getUTCMonth() + 1) + '-' +
177 f(this.getUTCDate()) + 'T' +
178 f(this.getUTCHours()) + ':' +
179 f(this.getUTCMinutes()) + ':' +
180 f(this.getUTCSeconds()) + 'Z';
181 };
182
183 String.prototype.toJSON =
184 Number.prototype.toJSON =
185 Boolean.prototype.toJSON = function (key) {
186 return this.valueOf();
187 };
188 }
189
190 var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
191 escapeable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
192 gap,
193 indent,
194 meta = { // table of character substitutions
195 '\b': '\\b',
196 '\t': '\\t',
197 '\n': '\\n',
198 '\f': '\\f',
199 '\r': '\\r',
200 '"' : '\\"',
201 '\\': '\\\\'
202 },
203 rep;
204
205
206 function quote(string) {
207
208// If the string contains no control characters, no quote characters, and no
209// backslash characters, then we can safely slap some quotes around it.
210// Otherwise we must also replace the offending characters with safe escape
211// sequences.
212
213 escapeable.lastIndex = 0;
214 return escapeable.test(string) ?
215 '"' + string.replace(escapeable, function (a) {
216 var c = meta[a];
217 if (typeof c === 'string') {
218 return c;
219 }
220 return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
221 }) + '"' :
222 '"' + string + '"';
223 }
224
225
226 function str(key, holder) {
227
228// Produce a string from holder[key].
229
230 var i, // The loop counter.
231 k, // The member key.
232 v, // The member value.
233 length,
234 mind = gap,
235 partial,
236 value = holder[key];
237
238// If the value has a toJSON method, call it to obtain a replacement value.
239
240 if (value && typeof value === 'object' &&
241 typeof value.toJSON === 'function') {
242 value = value.toJSON(key);
243 }
244
245// If we were called with a replacer function, then call the replacer to
246// obtain a replacement value.
247
248 if (typeof rep === 'function') {
249 value = rep.call(holder, key, value);
250 }
251
252// What happens next depends on the value's type.
253
254 switch (typeof value) {
255 case 'string':
256 return quote(value);
257
258 case 'number':
259
260// JSON numbers must be finite. Encode non-finite numbers as null.
261
262 return isFinite(value) ? String(value) : 'null';
263
264 case 'boolean':
265 case 'null':
266
267// If the value is a boolean or null, convert it to a string. Note:
268// typeof null does not produce 'null'. The case is included here in
269// the remote chance that this gets fixed someday.
270
271 return String(value);
272
273// If the type is 'object', we might be dealing with an object or an array or
274// null.
275
276 case 'object':
277
278// Due to a specification blunder in ECMAScript, typeof null is 'object',
279// so watch out for that case.
280
281 if (!value) {
282 return 'null';
283 }
284
285// Make an array to hold the partial results of stringifying this object value.
286
287 gap += indent;
288 partial = [];
289
290// If the object has a dontEnum length property, we'll treat it as an array.
291
292 if (typeof value.length === 'number' &&
293 !value.propertyIsEnumerable('length')) {
294
295// The object is an array. Stringify every element. Use null as a placeholder
296// for non-JSON values.
297
298 length = value.length;
299 for (i = 0; i < length; i += 1) {
300 partial[i] = str(i, value) || 'null';
301 }
302
303// Join all of the elements together, separated with commas, and wrap them in
304// brackets.
305
306 v = partial.length === 0 ? '[]' :
307 gap ? '[\n' + gap +
308 partial.join(',\n' + gap) + '\n' +
309 mind + ']' :
310 '[' + partial.join(',') + ']';
311 gap = mind;
312 return v;
313 }
314
315// If the replacer is an array, use it to select the members to be stringified.
316
317 if (rep && typeof rep === 'object') {
318 length = rep.length;
319 for (i = 0; i < length; i += 1) {
320 k = rep[i];
321 if (typeof k === 'string') {
322 v = str(k, value);
323 if (v) {
324 partial.push(quote(k) + (gap ? ': ' : ':') + v);
325 }
326 }
327 }
328 } else {
329
330// Otherwise, iterate through all of the keys in the object.
331
332 for (k in value) {
333 if (Object.hasOwnProperty.call(value, k)) {
334 v = str(k, value);
335 if (v) {
336 partial.push(quote(k) + (gap ? ': ' : ':') + v);
337 }
338 }
339 }
340 }
341
342// Join all of the member texts together, separated with commas,
343// and wrap them in braces.
344
345 v = partial.length === 0 ? '{}' :
346 gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
347 mind + '}' : '{' + partial.join(',') + '}';
348 gap = mind;
349 return v;
350 }
351 }
352
353// If the JSON object does not yet have a stringify method, give it one.
354
355 if (typeof JSON.stringify !== 'function') {
356 JSON.stringify = function (value, replacer, space) {
357
358// The stringify method takes a value and an optional replacer, and an optional
359// space parameter, and returns a JSON text. The replacer can be a function
360// that can replace values, or an array of strings that will select the keys.
361// A default replacer method can be provided. Use of the space parameter can
362// produce text that is more easily readable.
363
364 var i;
365 gap = '';
366 indent = '';
367
368// If the space parameter is a number, make an indent string containing that
369// many spaces.
370
371 if (typeof space === 'number') {
372 for (i = 0; i < space; i += 1) {
373 indent += ' ';
374 }
375
376// If the space parameter is a string, it will be used as the indent string.
377
378 } else if (typeof space === 'string') {
379 indent = space;
380 }
381
382// If there is a replacer, it must be a function or an array.
383// Otherwise, throw an error.
384
385 rep = replacer;
386 if (replacer && typeof replacer !== 'function' &&
387 (typeof replacer !== 'object' ||
388 typeof replacer.length !== 'number')) {
389 throw new Error('JSON.stringify');
390 }
391
392// Make a fake root object containing our value under the key of ''.
393// Return the result of stringifying the value.
394
395 return str('', {'': value});
396 };
397 }
398
399
400// If the JSON object does not yet have a parse method, give it one.
401
402 if (typeof JSON.parse !== 'function') {
403 JSON.parse = function (text, reviver) {
404
405// The parse method takes a text and an optional reviver function, and returns
406// a JavaScript value if the text is a valid JSON text.
407
408 var j;
409
410 function walk(holder, key) {
411
412// The walk method is used to recursively walk the resulting structure so
413// that modifications can be made.
414
415 var k, v, value = holder[key];
416 if (value && typeof value === 'object') {
417 for (k in value) {
418 if (Object.hasOwnProperty.call(value, k)) {
419 v = walk(value, k);
420 if (v !== undefined) {
421 value[k] = v;
422 } else {
423 delete value[k];
424 }
425 }
426 }
427 }
428 return reviver.call(holder, key, value);
429 }
430
431
432// Parsing happens in four stages. In the first stage, we replace certain
433// Unicode characters with escape sequences. JavaScript handles many characters
434// incorrectly, either silently deleting them, or treating them as line endings.
435
436 cx.lastIndex = 0;
437 if (cx.test(text)) {
438 text = text.replace(cx, function (a) {
439 return '\\u' +
440 ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
441 });
442 }
443
444// In the second stage, we run the text against regular expressions that look
445// for non-JSON patterns. We are especially concerned with '()' and 'new'
446// because they can cause invocation, and '=' because it can cause mutation.
447// But just to be safe, we want to reject all unexpected forms.
448
449// We split the second stage into 4 regexp operations in order to work around
450// crippling inefficiencies in IE's and Safari's regexp engines. First we
451// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
452// replace all simple value tokens with ']' characters. Third, we delete all
453// open brackets that follow a colon or comma or that begin the text. Finally,
454// we look to see that the remaining characters are only whitespace or ']' or
455// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
456
457 if (/^[\],:{}\s]*$/.
458test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
459replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
460replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
461
462// In the third stage we use the eval function to compile the text into a
463// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
464// in JavaScript: it can begin a block or an object literal. We wrap the text
465// in parens to eliminate the ambiguity.
466
467 j = eval('(' + text + ')');
468
469// In the optional fourth stage, we recursively walk the new structure, passing
470// each name/value pair to a reviver function for possible transformation.
471
472 return typeof reviver === 'function' ?
473 walk({'': j}, '') : j;
474 }
475
476// If the text is not JSON parseable, then a SyntaxError is thrown.
477
478 throw new SyntaxError('JSON.parse');
479 };
480 }
481})(); \ No newline at end of file
diff --git a/frontend/gamma/js/MochiKit/Async.js b/frontend/gamma/js/MochiKit/Async.js
new file mode 100644
index 0000000..c7408e7
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Async.js
@@ -0,0 +1,640 @@
1/***
2
3MochiKit.Async 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Async', '1.5', ['Base']);
12
13/** @id MochiKit.Async.Deferred */
14MochiKit.Async.Deferred = function (/* optional */ canceller) {
15 this.chain = [];
16 this.id = this._nextId();
17 this.fired = -1;
18 this.paused = 0;
19 this.results = [null, null];
20 this.canceller = canceller;
21 this.silentlyCancelled = false;
22 this.chained = false;
23};
24
25MochiKit.Async.Deferred.prototype = {
26 /** @id MochiKit.Async.Deferred.prototype.repr */
27 repr: function () {
28 var state;
29 if (this.fired == -1) {
30 state = 'unfired';
31 } else if (this.fired === 0) {
32 state = 'success';
33 } else {
34 state = 'error';
35 }
36 return 'Deferred(' + this.id + ', ' + state + ')';
37 },
38
39 toString: MochiKit.Base.forwardCall("repr"),
40
41 _nextId: MochiKit.Base.counter(),
42
43 /** @id MochiKit.Async.Deferred.prototype.cancel */
44 cancel: function () {
45 var self = MochiKit.Async;
46 if (this.fired == -1) {
47 if (this.canceller) {
48 this.canceller(this);
49 } else {
50 this.silentlyCancelled = true;
51 }
52 if (this.fired == -1) {
53 this.errback(new self.CancelledError(this));
54 }
55 } else if ((this.fired === 0) && (this.results[0] instanceof self.Deferred)) {
56 this.results[0].cancel();
57 }
58 },
59
60 _resback: function (res) {
61 /***
62
63 The primitive that means either callback or errback
64
65 ***/
66 this.fired = ((res instanceof Error) ? 1 : 0);
67 this.results[this.fired] = res;
68 this._fire();
69 },
70
71 _check: function () {
72 if (this.fired != -1) {
73 if (!this.silentlyCancelled) {
74 throw new MochiKit.Async.AlreadyCalledError(this);
75 }
76 this.silentlyCancelled = false;
77 return;
78 }
79 },
80
81 /** @id MochiKit.Async.Deferred.prototype.callback */
82 callback: function (res) {
83 this._check();
84 if (res instanceof MochiKit.Async.Deferred) {
85 throw new Error("Deferred instances can only be chained if they are the result of a callback");
86 }
87 this._resback(res);
88 },
89
90 /** @id MochiKit.Async.Deferred.prototype.errback */
91 errback: function (res) {
92 this._check();
93 var self = MochiKit.Async;
94 if (res instanceof self.Deferred) {
95 throw new Error("Deferred instances can only be chained if they are the result of a callback");
96 }
97 if (!(res instanceof Error)) {
98 res = new self.GenericError(res);
99 }
100 this._resback(res);
101 },
102
103 /** @id MochiKit.Async.Deferred.prototype.addBoth */
104 addBoth: function (fn) {
105 if (arguments.length > 1) {
106 fn = MochiKit.Base.partial.apply(null, arguments);
107 }
108 return this.addCallbacks(fn, fn);
109 },
110
111 /** @id MochiKit.Async.Deferred.prototype.addCallback */
112 addCallback: function (fn) {
113 if (arguments.length > 1) {
114 fn = MochiKit.Base.partial.apply(null, arguments);
115 }
116 return this.addCallbacks(fn, null);
117 },
118
119 /** @id MochiKit.Async.Deferred.prototype.addErrback */
120 addErrback: function (fn) {
121 if (arguments.length > 1) {
122 fn = MochiKit.Base.partial.apply(null, arguments);
123 }
124 return this.addCallbacks(null, fn);
125 },
126
127 /** @id MochiKit.Async.Deferred.prototype.addCallbacks */
128 addCallbacks: function (cb, eb) {
129 if (this.chained) {
130 throw new Error("Chained Deferreds can not be re-used");
131 }
132 this.chain.push([cb, eb]);
133 if (this.fired >= 0) {
134 this._fire();
135 }
136 return this;
137 },
138
139 _fire: function () {
140 /***
141
142 Used internally to exhaust the callback sequence when a result
143 is available.
144
145 ***/
146 var chain = this.chain;
147 var fired = this.fired;
148 var res = this.results[fired];
149 var self = this;
150 var cb = null;
151 while (chain.length > 0 && this.paused === 0) {
152 // Array
153 var pair = chain.shift();
154 var f = pair[fired];
155 if (f === null) {
156 continue;
157 }
158 try {
159 res = f(res);
160 fired = ((res instanceof Error) ? 1 : 0);
161 if (res instanceof MochiKit.Async.Deferred) {
162 cb = function (res) {
163 self._resback(res);
164 self.paused--;
165 if ((self.paused === 0) && (self.fired >= 0)) {
166 self._fire();
167 }
168 };
169 this.paused++;
170 }
171 } catch (err) {
172 fired = 1;
173 if (!(err instanceof Error)) {
174 err = new MochiKit.Async.GenericError(err);
175 }
176 res = err;
177 }
178 }
179 this.fired = fired;
180 this.results[fired] = res;
181 if (cb && this.paused) {
182 // this is for "tail recursion" in case the dependent deferred
183 // is already fired
184 res.addBoth(cb);
185 res.chained = true;
186 }
187 }
188};
189
190MochiKit.Base.update(MochiKit.Async, {
191 /** @id MochiKit.Async.evalJSONRequest */
192 evalJSONRequest: function (req) {
193 return MochiKit.Base.evalJSON(req.responseText);
194 },
195
196 /** @id MochiKit.Async.succeed */
197 succeed: function (/* optional */result) {
198 var d = new MochiKit.Async.Deferred();
199 d.callback.apply(d, arguments);
200 return d;
201 },
202
203 /** @id MochiKit.Async.fail */
204 fail: function (/* optional */result) {
205 var d = new MochiKit.Async.Deferred();
206 d.errback.apply(d, arguments);
207 return d;
208 },
209
210 /** @id MochiKit.Async.getXMLHttpRequest */
211 getXMLHttpRequest: function () {
212 var self = arguments.callee;
213 if (!self.XMLHttpRequest) {
214 var tryThese = [
215 function () { return new XMLHttpRequest(); },
216 function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
217 function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
218 function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
219 function () {
220 throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest");
221 }
222 ];
223 for (var i = 0; i < tryThese.length; i++) {
224 var func = tryThese[i];
225 try {
226 self.XMLHttpRequest = func;
227 return func();
228 } catch (e) {
229 // pass
230 }
231 }
232 }
233 return self.XMLHttpRequest();
234 },
235
236 _xhr_onreadystatechange: function (d) {
237 // MochiKit.Logging.logDebug('this.readyState', this.readyState);
238 var m = MochiKit.Base;
239 if (this.readyState == 4) {
240 // IE SUCKS
241 try {
242 this.onreadystatechange = null;
243 } catch (e) {
244 try {
245 this.onreadystatechange = m.noop;
246 } catch (e) {
247 }
248 }
249 var status = null;
250 try {
251 status = this.status;
252 if (!status && m.isNotEmpty(this.responseText)) {
253 // 0 or undefined seems to mean cached or local
254 status = 304;
255 }
256 } catch (e) {
257 // pass
258 // MochiKit.Logging.logDebug('error getting status?', repr(items(e)));
259 }
260 // 200 is OK, 201 is CREATED, 204 is NO CONTENT
261 // 304 is NOT MODIFIED, 1223 is apparently a bug in IE
262 if (status == 200 || status == 201 || status == 204 ||
263 status == 304 || status == 1223) {
264 d.callback(this);
265 } else {
266 var err = new MochiKit.Async.XMLHttpRequestError(this, "Request failed");
267 if (err.number) {
268 // XXX: This seems to happen on page change
269 d.errback(err);
270 } else {
271 // XXX: this seems to happen when the server is unreachable
272 d.errback(err);
273 }
274 }
275 }
276 },
277
278 _xhr_canceller: function (req) {
279 // IE SUCKS
280 try {
281 req.onreadystatechange = null;
282 } catch (e) {
283 try {
284 req.onreadystatechange = MochiKit.Base.noop;
285 } catch (e) {
286 }
287 }
288 req.abort();
289 },
290
291
292 /** @id MochiKit.Async.sendXMLHttpRequest */
293 sendXMLHttpRequest: function (req, /* optional */ sendContent) {
294 if (typeof(sendContent) == "undefined" || sendContent === null) {
295 sendContent = "";
296 }
297
298 var m = MochiKit.Base;
299 var self = MochiKit.Async;
300 var d = new self.Deferred(m.partial(self._xhr_canceller, req));
301
302 try {
303 req.onreadystatechange = m.bind(self._xhr_onreadystatechange,
304 req, d);
305 req.send(sendContent);
306 } catch (e) {
307 try {
308 req.onreadystatechange = null;
309 } catch (ignore) {
310 // pass
311 }
312 d.errback(e);
313 }
314
315 return d;
316
317 },
318
319 /** @id MochiKit.Async.doXHR */
320 doXHR: function (url, opts) {
321 /*
322 Work around a Firefox bug by dealing with XHR during
323 the next event loop iteration. Maybe it's this one:
324 https://bugzilla.mozilla.org/show_bug.cgi?id=249843
325 */
326 var self = MochiKit.Async;
327 return self.callLater(0, self._doXHR, url, opts);
328 },
329
330 _doXHR: function (url, opts) {
331 var m = MochiKit.Base;
332 opts = m.update({
333 method: 'GET',
334 sendContent: ''
335 /*
336 queryString: undefined,
337 username: undefined,
338 password: undefined,
339 headers: undefined,
340 mimeType: undefined
341 */
342 }, opts);
343 var self = MochiKit.Async;
344 var req = self.getXMLHttpRequest();
345 if (opts.queryString) {
346 var qs = m.queryString(opts.queryString);
347 if (qs) {
348 url += "?" + qs;
349 }
350 }
351 // Safari will send undefined:undefined, so we have to check.
352 // We can't use apply, since the function is native.
353 if ('username' in opts) {
354 req.open(opts.method, url, true, opts.username, opts.password);
355 } else {
356 req.open(opts.method, url, true);
357 }
358 if (req.overrideMimeType && opts.mimeType) {
359 req.overrideMimeType(opts.mimeType);
360 }
361 req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
362 if (opts.headers) {
363 var headers = opts.headers;
364 if (!m.isArrayLike(headers)) {
365 headers = m.items(headers);
366 }
367 for (var i = 0; i < headers.length; i++) {
368 var header = headers[i];
369 var name = header[0];
370 var value = header[1];
371 req.setRequestHeader(name, value);
372 }
373 }
374 return self.sendXMLHttpRequest(req, opts.sendContent);
375 },
376
377 _buildURL: function (url/*, ...*/) {
378 if (arguments.length > 1) {
379 var m = MochiKit.Base;
380 var qs = m.queryString.apply(null, m.extend(null, arguments, 1));
381 if (qs) {
382 return url + "?" + qs;
383 }
384 }
385 return url;
386 },
387
388 /** @id MochiKit.Async.doSimpleXMLHttpRequest */
389 doSimpleXMLHttpRequest: function (url/*, ...*/) {
390 var self = MochiKit.Async;
391 url = self._buildURL.apply(self, arguments);
392 return self.doXHR(url);
393 },
394
395 /** @id MochiKit.Async.loadJSONDoc */
396 loadJSONDoc: function (url/*, ...*/) {
397 var self = MochiKit.Async;
398 url = self._buildURL.apply(self, arguments);
399 var d = self.doXHR(url, {
400 'mimeType': 'text/plain',
401 'headers': [['Accept', 'application/json']]
402 });
403 d = d.addCallback(self.evalJSONRequest);
404 return d;
405 },
406
407 /** @id MochiKit.Async.wait */
408 wait: function (seconds, /* optional */value) {
409 var d = new MochiKit.Async.Deferred();
410 var m = MochiKit.Base;
411 if (typeof(value) != 'undefined') {
412 d.addCallback(function () { return value; });
413 }
414 var timeout = setTimeout(
415 m.bind("callback", d),
416 Math.floor(seconds * 1000));
417 d.canceller = function () {
418 try {
419 clearTimeout(timeout);
420 } catch (e) {
421 // pass
422 }
423 };
424 return d;
425 },
426
427 /** @id MochiKit.Async.callLater */
428 callLater: function (seconds, func) {
429 var m = MochiKit.Base;
430 var pfunc = m.partial.apply(m, m.extend(null, arguments, 1));
431 return MochiKit.Async.wait(seconds).addCallback(
432 function (res) { return pfunc(); }
433 );
434 }
435});
436
437
438/** @id MochiKit.Async.DeferredLock */
439MochiKit.Async.DeferredLock = function () {
440 this.waiting = [];
441 this.locked = false;
442 this.id = this._nextId();
443};
444
445MochiKit.Async.DeferredLock.prototype = {
446 __class__: MochiKit.Async.DeferredLock,
447 /** @id MochiKit.Async.DeferredLock.prototype.acquire */
448 acquire: function () {
449 var d = new MochiKit.Async.Deferred();
450 if (this.locked) {
451 this.waiting.push(d);
452 } else {
453 this.locked = true;
454 d.callback(this);
455 }
456 return d;
457 },
458 /** @id MochiKit.Async.DeferredLock.prototype.release */
459 release: function () {
460 if (!this.locked) {
461 throw TypeError("Tried to release an unlocked DeferredLock");
462 }
463 this.locked = false;
464 if (this.waiting.length > 0) {
465 this.locked = true;
466 this.waiting.shift().callback(this);
467 }
468 },
469 _nextId: MochiKit.Base.counter(),
470 repr: function () {
471 var state;
472 if (this.locked) {
473 state = 'locked, ' + this.waiting.length + ' waiting';
474 } else {
475 state = 'unlocked';
476 }
477 return 'DeferredLock(' + this.id + ', ' + state + ')';
478 },
479 toString: MochiKit.Base.forwardCall("repr")
480
481};
482
483/** @id MochiKit.Async.DeferredList */
484MochiKit.Async.DeferredList = function (list, /* optional */fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) {
485
486 // call parent constructor
487 MochiKit.Async.Deferred.apply(this, [canceller]);
488
489 this.list = list;
490 var resultList = [];
491 this.resultList = resultList;
492
493 this.finishedCount = 0;
494 this.fireOnOneCallback = fireOnOneCallback;
495 this.fireOnOneErrback = fireOnOneErrback;
496 this.consumeErrors = consumeErrors;
497
498 var cb = MochiKit.Base.bind(this._cbDeferred, this);
499 for (var i = 0; i < list.length; i++) {
500 var d = list[i];
501 resultList.push(undefined);
502 d.addCallback(cb, i, true);
503 d.addErrback(cb, i, false);
504 }
505
506 if (list.length === 0 && !fireOnOneCallback) {
507 this.callback(this.resultList);
508 }
509
510};
511
512MochiKit.Async.DeferredList.prototype = new MochiKit.Async.Deferred();
513
514MochiKit.Async.DeferredList.prototype._cbDeferred = function (index, succeeded, result) {
515 this.resultList[index] = [succeeded, result];
516 this.finishedCount += 1;
517 if (this.fired == -1) {
518 if (succeeded && this.fireOnOneCallback) {
519 this.callback([index, result]);
520 } else if (!succeeded && this.fireOnOneErrback) {
521 this.errback(result);
522 } else if (this.finishedCount == this.list.length) {
523 this.callback(this.resultList);
524 }
525 }
526 if (!succeeded && this.consumeErrors) {
527 result = null;
528 }
529 return result;
530};
531
532/** @id MochiKit.Async.gatherResults */
533MochiKit.Async.gatherResults = function (deferredList) {
534 var d = new MochiKit.Async.DeferredList(deferredList, false, true, false);
535 d.addCallback(function (results) {
536 var ret = [];
537 for (var i = 0; i < results.length; i++) {
538 ret.push(results[i][1]);
539 }
540 return ret;
541 });
542 return d;
543};
544
545/** @id MochiKit.Async.maybeDeferred */
546MochiKit.Async.maybeDeferred = function (func) {
547 var self = MochiKit.Async;
548 var result;
549 try {
550 var r = func.apply(null, MochiKit.Base.extend([], arguments, 1));
551 if (r instanceof self.Deferred) {
552 result = r;
553 } else if (r instanceof Error) {
554 result = self.fail(r);
555 } else {
556 result = self.succeed(r);
557 }
558 } catch (e) {
559 result = self.fail(e);
560 }
561 return result;
562};
563
564
565MochiKit.Async.__new__ = function () {
566 var m = MochiKit.Base;
567 var ne = m.partial(m._newNamedError, this);
568
569 ne("AlreadyCalledError",
570 /** @id MochiKit.Async.AlreadyCalledError */
571 function (deferred) {
572 /***
573
574 Raised by the Deferred if callback or errback happens
575 after it was already fired.
576
577 ***/
578 this.deferred = deferred;
579 }
580 );
581
582 ne("CancelledError",
583 /** @id MochiKit.Async.CancelledError */
584 function (deferred) {
585 /***
586
587 Raised by the Deferred cancellation mechanism.
588
589 ***/
590 this.deferred = deferred;
591 }
592 );
593
594 ne("BrowserComplianceError",
595 /** @id MochiKit.Async.BrowserComplianceError */
596 function (msg) {
597 /***
598
599 Raised when the JavaScript runtime is not capable of performing
600 the given function. Technically, this should really never be
601 raised because a non-conforming JavaScript runtime probably
602 isn't going to support exceptions in the first place.
603
604 ***/
605 this.message = msg;
606 }
607 );
608
609 ne("GenericError",
610 /** @id MochiKit.Async.GenericError */
611 function (msg) {
612 this.message = msg;
613 }
614 );
615
616 ne("XMLHttpRequestError",
617 /** @id MochiKit.Async.XMLHttpRequestError */
618 function (req, msg) {
619 /***
620
621 Raised when an XMLHttpRequest does not complete for any reason.
622
623 ***/
624 this.req = req;
625 this.message = msg;
626 try {
627 // Strange but true that this can raise in some cases.
628 this.number = req.status;
629 } catch (e) {
630 // pass
631 }
632 }
633 );
634
635 m.nameFunctions(this);
636};
637
638MochiKit.Async.__new__();
639
640MochiKit.Base._exportSymbols(this, MochiKit.Async);
diff --git a/frontend/gamma/js/MochiKit/Base.js b/frontend/gamma/js/MochiKit/Base.js
new file mode 100644
index 0000000..d33c269
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Base.js
@@ -0,0 +1,1452 @@
1/***
2
3MochiKit.Base 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11if (typeof(MochiKit) == 'undefined') {
12 MochiKit = {};
13}
14if (typeof(MochiKit.__export__) == "undefined") {
15 MochiKit.__export__ = true;
16}
17if (typeof(MochiKit.Base) == 'undefined') {
18 MochiKit.Base = {};
19}
20
21/**
22 * Registers a new MochiKit module. This function will insert a new
23 * property into the "MochiKit" object, making sure that all
24 * dependency modules have already been inserted. It will also make
25 * sure that the appropriate properties and default module functions
26 * are defined.
27 *
28 * @param {String} name the module name, e.g. "Base"
29 * @param {String} version the module version, e.g. "1.5"
30 * @param {Array} deps the array of module dependencies (as strings)
31 */
32MochiKit.Base._module = function (name, version, deps) {
33 if (!(name in MochiKit)) {
34 MochiKit[name] = {};
35 }
36 var module = MochiKit[name];
37 module.NAME = "MochiKit." + name;
38 module.VERSION = version;
39 module.__repr__ = function () {
40 return "[" + this.NAME + " " + this.VERSION + "]";
41 };
42 module.toString = function () {
43 return this.__repr__();
44 };
45 for (var i = 0; i < deps.length; i++) {
46 if (!(deps[i] in MochiKit)) {
47 throw 'MochiKit.' + name + ' depends on MochiKit.' + deps[i] + '!';
48 }
49 }
50}
51
52MochiKit.Base._module("Base", "1.5", []);
53
54/** @id MochiKit.Base.update */
55MochiKit.Base.update = function (self, obj/*, ... */) {
56 if (self === null || self === undefined) {
57 self = {};
58 }
59 for (var i = 1; i < arguments.length; i++) {
60 var o = arguments[i];
61 if (typeof(o) != 'undefined' && o !== null) {
62 for (var k in o) {
63 self[k] = o[k];
64 }
65 }
66 }
67 return self;
68};
69
70MochiKit.Base.update(MochiKit.Base, {
71 /** @id MochiKit.Base.camelize */
72 camelize: function (selector) {
73 /* from dojo.style.toCamelCase */
74 var arr = selector.split('-');
75 var cc = arr[0];
76 for (var i = 1; i < arr.length; i++) {
77 cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
78 }
79 return cc;
80 },
81
82 /** @id MochiKit.Base.counter */
83 counter: function (n/* = 1 */) {
84 if (arguments.length === 0) {
85 n = 1;
86 }
87 return function () {
88 return n++;
89 };
90 },
91
92 /** @id MochiKit.Base.clone */
93 clone: function (obj) {
94 var me = arguments.callee;
95 if (arguments.length == 1) {
96 me.prototype = obj;
97 return new me();
98 }
99 },
100
101 _flattenArray: function (res, lst) {
102 for (var i = 0; i < lst.length; i++) {
103 var o = lst[i];
104 if (o instanceof Array) {
105 arguments.callee(res, o);
106 } else {
107 res.push(o);
108 }
109 }
110 return res;
111 },
112
113 /** @id MochiKit.Base.flattenArray */
114 flattenArray: function (lst) {
115 return MochiKit.Base._flattenArray([], lst);
116 },
117
118 /** @id MochiKit.Base.flattenArguments */
119 flattenArguments: function (lst/* ...*/) {
120 var res = [];
121 var m = MochiKit.Base;
122 var args = m.extend(null, arguments);
123 while (args.length) {
124 var o = args.shift();
125 if (o && typeof(o) == "object" && typeof(o.length) == "number") {
126 for (var i = o.length - 1; i >= 0; i--) {
127 args.unshift(o[i]);
128 }
129 } else {
130 res.push(o);
131 }
132 }
133 return res;
134 },
135
136 /** @id MochiKit.Base.extend */
137 extend: function (self, obj, /* optional */skip) {
138 // Extend an array with an array-like object starting
139 // from the skip index
140 if (!skip) {
141 skip = 0;
142 }
143 if (obj) {
144 // allow iterable fall-through, but skip the full isArrayLike
145 // check for speed, this is called often.
146 var l = obj.length;
147 if (typeof(l) != 'number' /* !isArrayLike(obj) */) {
148 if (typeof(MochiKit.Iter) != "undefined") {
149 obj = MochiKit.Iter.list(obj);
150 l = obj.length;
151 } else {
152 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
153 }
154 }
155 if (!self) {
156 self = [];
157 }
158 for (var i = skip; i < l; i++) {
159 self.push(obj[i]);
160 }
161 }
162 // This mutates, but it's convenient to return because
163 // it's often used like a constructor when turning some
164 // ghetto array-like to a real array
165 return self;
166 },
167
168
169 /** @id MochiKit.Base.updatetree */
170 updatetree: function (self, obj/*, ...*/) {
171 if (self === null || self === undefined) {
172 self = {};
173 }
174 for (var i = 1; i < arguments.length; i++) {
175 var o = arguments[i];
176 if (typeof(o) != 'undefined' && o !== null) {
177 for (var k in o) {
178 var v = o[k];
179 if (typeof(self[k]) == 'object' && typeof(v) == 'object') {
180 arguments.callee(self[k], v);
181 } else {
182 self[k] = v;
183 }
184 }
185 }
186 }
187 return self;
188 },
189
190 /** @id MochiKit.Base.setdefault */
191 setdefault: function (self, obj/*, ...*/) {
192 if (self === null || self === undefined) {
193 self = {};
194 }
195 for (var i = 1; i < arguments.length; i++) {
196 var o = arguments[i];
197 for (var k in o) {
198 if (!(k in self)) {
199 self[k] = o[k];
200 }
201 }
202 }
203 return self;
204 },
205
206 /** @id MochiKit.Base.keys */
207 keys: function (obj) {
208 var rval = [];
209 for (var prop in obj) {
210 rval.push(prop);
211 }
212 return rval;
213 },
214
215 /** @id MochiKit.Base.values */
216 values: function (obj) {
217 var rval = [];
218 for (var prop in obj) {
219 rval.push(obj[prop]);
220 }
221 return rval;
222 },
223
224 /** @id MochiKit.Base.items */
225 items: function (obj) {
226 var rval = [];
227 var e;
228 for (var prop in obj) {
229 var v;
230 try {
231 v = obj[prop];
232 } catch (e) {
233 continue;
234 }
235 rval.push([prop, v]);
236 }
237 return rval;
238 },
239
240
241 _newNamedError: function (module, name, func) {
242 func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name);
243 module[name] = func;
244 },
245
246
247 /** @id MochiKit.Base.operator */
248 operator: {
249 // unary logic operators
250 /** @id MochiKit.Base.truth */
251 truth: function (a) { return !!a; },
252 /** @id MochiKit.Base.lognot */
253 lognot: function (a) { return !a; },
254 /** @id MochiKit.Base.identity */
255 identity: function (a) { return a; },
256
257 // bitwise unary operators
258 /** @id MochiKit.Base.not */
259 not: function (a) { return ~a; },
260 /** @id MochiKit.Base.neg */
261 neg: function (a) { return -a; },
262
263 // binary operators
264 /** @id MochiKit.Base.add */
265 add: function (a, b) { return a + b; },
266 /** @id MochiKit.Base.sub */
267 sub: function (a, b) { return a - b; },
268 /** @id MochiKit.Base.div */
269 div: function (a, b) { return a / b; },
270 /** @id MochiKit.Base.mod */
271 mod: function (a, b) { return a % b; },
272 /** @id MochiKit.Base.mul */
273 mul: function (a, b) { return a * b; },
274
275 // bitwise binary operators
276 /** @id MochiKit.Base.and */
277 and: function (a, b) { return a & b; },
278 /** @id MochiKit.Base.or */
279 or: function (a, b) { return a | b; },
280 /** @id MochiKit.Base.xor */
281 xor: function (a, b) { return a ^ b; },
282 /** @id MochiKit.Base.lshift */
283 lshift: function (a, b) { return a << b; },
284 /** @id MochiKit.Base.rshift */
285 rshift: function (a, b) { return a >> b; },
286 /** @id MochiKit.Base.zrshift */
287 zrshift: function (a, b) { return a >>> b; },
288
289 // near-worthless built-in comparators
290 /** @id MochiKit.Base.eq */
291 eq: function (a, b) { return a == b; },
292 /** @id MochiKit.Base.ne */
293 ne: function (a, b) { return a != b; },
294 /** @id MochiKit.Base.gt */
295 gt: function (a, b) { return a > b; },
296 /** @id MochiKit.Base.ge */
297 ge: function (a, b) { return a >= b; },
298 /** @id MochiKit.Base.lt */
299 lt: function (a, b) { return a < b; },
300 /** @id MochiKit.Base.le */
301 le: function (a, b) { return a <= b; },
302
303 // strict built-in comparators
304 seq: function (a, b) { return a === b; },
305 sne: function (a, b) { return a !== b; },
306
307 // compare comparators
308 /** @id MochiKit.Base.ceq */
309 ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; },
310 /** @id MochiKit.Base.cne */
311 cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; },
312 /** @id MochiKit.Base.cgt */
313 cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; },
314 /** @id MochiKit.Base.cge */
315 cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; },
316 /** @id MochiKit.Base.clt */
317 clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; },
318 /** @id MochiKit.Base.cle */
319 cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; },
320
321 // binary logical operators
322 /** @id MochiKit.Base.logand */
323 logand: function (a, b) { return a && b; },
324 /** @id MochiKit.Base.logor */
325 logor: function (a, b) { return a || b; },
326 /** @id MochiKit.Base.contains */
327 contains: function (a, b) { return b in a; }
328 },
329
330 /** @id MochiKit.Base.forwardCall */
331 forwardCall: function (func) {
332 return function () {
333 return this[func].apply(this, arguments);
334 };
335 },
336
337 /** @id MochiKit.Base.itemgetter */
338 itemgetter: function (func) {
339 return function (arg) {
340 return arg[func];
341 };
342 },
343
344 /** @id MochiKit.Base.bool */
345 bool: function (value) {
346 if (typeof(value) === "boolean" || value instanceof Boolean) {
347 return value.valueOf();
348 } else if (typeof(value) === "string" || value instanceof String) {
349 return value.length > 0 && value != "false" && value != "null" &&
350 value != "undefined" && value != "0";
351 } else if (typeof(value) === "number" || value instanceof Number) {
352 return !isNaN(value) && value != 0;
353 } else if (value != null && typeof(value.length) === "number") {
354 return value.length !== 0
355 } else {
356 return value != null;
357 }
358 },
359
360 /** @id MochiKit.Base.typeMatcher */
361 typeMatcher: function (/* typ */) {
362 var types = {};
363 for (var i = 0; i < arguments.length; i++) {
364 var typ = arguments[i];
365 types[typ] = typ;
366 }
367 return function () {
368 for (var i = 0; i < arguments.length; i++) {
369 if (!(typeof(arguments[i]) in types)) {
370 return false;
371 }
372 }
373 return true;
374 };
375 },
376
377 /** @id MochiKit.Base.isNull */
378 isNull: function (/* ... */) {
379 for (var i = 0; i < arguments.length; i++) {
380 if (arguments[i] !== null) {
381 return false;
382 }
383 }
384 return true;
385 },
386
387 /** @id MochiKit.Base.isUndefinedOrNull */
388 isUndefinedOrNull: function (/* ... */) {
389 for (var i = 0; i < arguments.length; i++) {
390 var o = arguments[i];
391 if (!(typeof(o) == 'undefined' || o === null)) {
392 return false;
393 }
394 }
395 return true;
396 },
397
398 /** @id MochiKit.Base.isEmpty */
399 isEmpty: function (obj) {
400 return !MochiKit.Base.isNotEmpty.apply(this, arguments);
401 },
402
403 /** @id MochiKit.Base.isNotEmpty */
404 isNotEmpty: function (obj) {
405 for (var i = 0; i < arguments.length; i++) {
406 var o = arguments[i];
407 if (!(o && o.length)) {
408 return false;
409 }
410 }
411 return true;
412 },
413
414 /** @id MochiKit.Base.isArrayLike */
415 isArrayLike: function () {
416 for (var i = 0; i < arguments.length; i++) {
417 var o = arguments[i];
418 var typ = typeof(o);
419 if (
420 (typ != 'object' && !(typ == 'function' && typeof(o.item) == 'function')) ||
421 o === null ||
422 typeof(o.length) != 'number' ||
423 o.nodeType === 3 ||
424 o.nodeType === 4
425 ) {
426 return false;
427 }
428 }
429 return true;
430 },
431
432 /** @id MochiKit.Base.isDateLike */
433 isDateLike: function () {
434 for (var i = 0; i < arguments.length; i++) {
435 var o = arguments[i];
436 if (typeof(o) != "object" || o === null
437 || typeof(o.getTime) != 'function') {
438 return false;
439 }
440 }
441 return true;
442 },
443
444
445 /** @id MochiKit.Base.xmap */
446 xmap: function (fn/*, obj... */) {
447 if (fn === null) {
448 return MochiKit.Base.extend(null, arguments, 1);
449 }
450 var rval = [];
451 for (var i = 1; i < arguments.length; i++) {
452 rval.push(fn(arguments[i]));
453 }
454 return rval;
455 },
456
457 /** @id MochiKit.Base.map */
458 map: function (fn, lst/*, lst... */) {
459 var m = MochiKit.Base;
460 var itr = MochiKit.Iter;
461 var isArrayLike = m.isArrayLike;
462 if (arguments.length <= 2) {
463 // allow an iterable to be passed
464 if (!isArrayLike(lst)) {
465 if (itr) {
466 // fast path for map(null, iterable)
467 lst = itr.list(lst);
468 if (fn === null) {
469 return lst;
470 }
471 } else {
472 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
473 }
474 }
475 // fast path for map(null, lst)
476 if (fn === null) {
477 return m.extend(null, lst);
478 }
479 // disabled fast path for map(fn, lst)
480 /*
481 if (false && typeof(Array.prototype.map) == 'function') {
482 // Mozilla fast-path
483 return Array.prototype.map.call(lst, fn);
484 }
485 */
486 var rval = [];
487 for (var i = 0; i < lst.length; i++) {
488 rval.push(fn(lst[i]));
489 }
490 return rval;
491 } else {
492 // default for map(null, ...) is zip(...)
493 if (fn === null) {
494 fn = Array;
495 }
496 var length = null;
497 for (var i = 1; i < arguments.length; i++) {
498 // allow iterables to be passed
499 if (!isArrayLike(arguments[i])) {
500 if (itr) {
501 return itr.list(itr.imap.apply(null, arguments));
502 } else {
503 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
504 }
505 }
506 // find the minimum length
507 var l = arguments[i].length;
508 if (length === null || length > l) {
509 length = l;
510 }
511 }
512 rval = [];
513 for (var i = 0; i < length; i++) {
514 var args = [];
515 for (var j = 1; j < arguments.length; j++) {
516 args.push(arguments[j][i]);
517 }
518 rval.push(fn.apply(this, args));
519 }
520 return rval;
521 }
522 },
523
524 /** @id MochiKit.Base.xfilter */
525 xfilter: function (fn/*, obj... */) {
526 var rval = [];
527 if (fn === null) {
528 fn = MochiKit.Base.operator.truth;
529 }
530 for (var i = 1; i < arguments.length; i++) {
531 var o = arguments[i];
532 if (fn(o)) {
533 rval.push(o);
534 }
535 }
536 return rval;
537 },
538
539 /** @id MochiKit.Base.filter */
540 filter: function (fn, lst, self) {
541 var rval = [];
542 // allow an iterable to be passed
543 var m = MochiKit.Base;
544 if (!m.isArrayLike(lst)) {
545 if (MochiKit.Iter) {
546 lst = MochiKit.Iter.list(lst);
547 } else {
548 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
549 }
550 }
551 if (fn === null) {
552 fn = m.operator.truth;
553 }
554 if (typeof(Array.prototype.filter) == 'function') {
555 // Mozilla fast-path
556 return Array.prototype.filter.call(lst, fn, self);
557 } else if (typeof(self) == 'undefined' || self === null) {
558 for (var i = 0; i < lst.length; i++) {
559 var o = lst[i];
560 if (fn(o)) {
561 rval.push(o);
562 }
563 }
564 } else {
565 for (var i = 0; i < lst.length; i++) {
566 o = lst[i];
567 if (fn.call(self, o)) {
568 rval.push(o);
569 }
570 }
571 }
572 return rval;
573 },
574
575
576 _wrapDumbFunction: function (func) {
577 return function () {
578 // fast path!
579 switch (arguments.length) {
580 case 0: return func();
581 case 1: return func(arguments[0]);
582 case 2: return func(arguments[0], arguments[1]);
583 case 3: return func(arguments[0], arguments[1], arguments[2]);
584 }
585 var args = [];
586 for (var i = 0; i < arguments.length; i++) {
587 args.push("arguments[" + i + "]");
588 }
589 return eval("(func(" + args.join(",") + "))");
590 };
591 },
592
593 /** @id MochiKit.Base.methodcaller */
594 methodcaller: function (func/*, args... */) {
595 var args = MochiKit.Base.extend(null, arguments, 1);
596 if (typeof(func) == "function") {
597 return function (obj) {
598 return func.apply(obj, args);
599 };
600 } else {
601 return function (obj) {
602 return obj[func].apply(obj, args);
603 };
604 }
605 },
606
607 /** @id MochiKit.Base.method */
608 method: function (self, func) {
609 var m = MochiKit.Base;
610 return m.bind.apply(this, m.extend([func, self], arguments, 2));
611 },
612
613 /** @id MochiKit.Base.compose */
614 compose: function (f1, f2/*, f3, ... fN */) {
615 var fnlist = [];
616 var m = MochiKit.Base;
617 if (arguments.length === 0) {
618 throw new TypeError("compose() requires at least one argument");
619 }
620 for (var i = 0; i < arguments.length; i++) {
621 var fn = arguments[i];
622 if (typeof(fn) != "function") {
623 throw new TypeError(m.repr(fn) + " is not a function");
624 }
625 fnlist.push(fn);
626 }
627 return function () {
628 var args = arguments;
629 for (var i = fnlist.length - 1; i >= 0; i--) {
630 args = [fnlist[i].apply(this, args)];
631 }
632 return args[0];
633 };
634 },
635
636 /** @id MochiKit.Base.bind */
637 bind: function (func, self/* args... */) {
638 if (typeof(func) == "string") {
639 func = self[func];
640 }
641 var im_func = func.im_func;
642 var im_preargs = func.im_preargs;
643 var im_self = func.im_self;
644 var m = MochiKit.Base;
645 if (typeof(func) == "function" && typeof(func.apply) == "undefined") {
646 // this is for cases where JavaScript sucks ass and gives you a
647 // really dumb built-in function like alert() that doesn't have
648 // an apply
649 func = m._wrapDumbFunction(func);
650 }
651 if (typeof(im_func) != 'function') {
652 im_func = func;
653 }
654 if (typeof(self) != 'undefined') {
655 im_self = self;
656 }
657 if (typeof(im_preargs) == 'undefined') {
658 im_preargs = [];
659 } else {
660 im_preargs = im_preargs.slice();
661 }
662 m.extend(im_preargs, arguments, 2);
663 var newfunc = function () {
664 var args = arguments;
665 var me = arguments.callee;
666 if (me.im_preargs.length > 0) {
667 args = m.concat(me.im_preargs, args);
668 }
669 var self = me.im_self;
670 if (!self) {
671 self = this;
672 }
673 return me.im_func.apply(self, args);
674 };
675 newfunc.im_self = im_self;
676 newfunc.im_func = im_func;
677 newfunc.im_preargs = im_preargs;
678 return newfunc;
679 },
680
681 /** @id MochiKit.Base.bindLate */
682 bindLate: function (func, self/* args... */) {
683 var m = MochiKit.Base;
684 var args = arguments;
685 if (typeof(func) === "string") {
686 args = m.extend([m.forwardCall(func)], arguments, 1);
687 return m.bind.apply(this, args);
688 }
689 return m.bind.apply(this, args);
690 },
691
692 /** @id MochiKit.Base.bindMethods */
693 bindMethods: function (self) {
694 var bind = MochiKit.Base.bind;
695 for (var k in self) {
696 var func = self[k];
697 if (typeof(func) == 'function') {
698 self[k] = bind(func, self);
699 }
700 }
701 },
702
703 /** @id MochiKit.Base.registerComparator */
704 registerComparator: function (name, check, comparator, /* optional */ override) {
705 MochiKit.Base.comparatorRegistry.register(name, check, comparator, override);
706 },
707
708 _primitives: {'boolean': true, 'string': true, 'number': true},
709
710 /** @id MochiKit.Base.compare */
711 compare: function (a, b) {
712 if (a == b) {
713 return 0;
714 }
715 var aIsNull = (typeof(a) == 'undefined' || a === null);
716 var bIsNull = (typeof(b) == 'undefined' || b === null);
717 if (aIsNull && bIsNull) {
718 return 0;
719 } else if (aIsNull) {
720 return -1;
721 } else if (bIsNull) {
722 return 1;
723 }
724 var m = MochiKit.Base;
725 // bool, number, string have meaningful comparisons
726 var prim = m._primitives;
727 if (!(typeof(a) in prim && typeof(b) in prim)) {
728 try {
729 return m.comparatorRegistry.match(a, b);
730 } catch (e) {
731 if (e != m.NotFound) {
732 throw e;
733 }
734 }
735 }
736 if (a < b) {
737 return -1;
738 } else if (a > b) {
739 return 1;
740 }
741 // These types can't be compared
742 var repr = m.repr;
743 throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared");
744 },
745
746 /** @id MochiKit.Base.compareDateLike */
747 compareDateLike: function (a, b) {
748 return MochiKit.Base.compare(a.getTime(), b.getTime());
749 },
750
751 /** @id MochiKit.Base.compareArrayLike */
752 compareArrayLike: function (a, b) {
753 var compare = MochiKit.Base.compare;
754 var count = a.length;
755 var rval = 0;
756 if (count > b.length) {
757 rval = 1;
758 count = b.length;
759 } else if (count < b.length) {
760 rval = -1;
761 }
762 for (var i = 0; i < count; i++) {
763 var cmp = compare(a[i], b[i]);
764 if (cmp) {
765 return cmp;
766 }
767 }
768 return rval;
769 },
770
771 /** @id MochiKit.Base.registerRepr */
772 registerRepr: function (name, check, wrap, /* optional */override) {
773 MochiKit.Base.reprRegistry.register(name, check, wrap, override);
774 },
775
776 /** @id MochiKit.Base.repr */
777 repr: function (o) {
778 if (typeof(o) == "undefined") {
779 return "undefined";
780 } else if (o === null) {
781 return "null";
782 }
783 try {
784 if (typeof(o.__repr__) == 'function') {
785 return o.__repr__();
786 } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) {
787 return o.repr();
788 }
789 return MochiKit.Base.reprRegistry.match(o);
790 } catch (e) {
791 if (typeof(o.NAME) == 'string' && (
792 o.toString == Function.prototype.toString ||
793 o.toString == Object.prototype.toString
794 )) {
795 return o.NAME;
796 }
797 }
798 try {
799 var ostring = (o + "");
800 } catch (e) {
801 return "[" + typeof(o) + "]";
802 }
803 if (typeof(o) == "function") {
804 ostring = ostring.replace(/^\s+/, "").replace(/\s+/g, " ");
805 ostring = ostring.replace(/,(\S)/, ", $1");
806 var idx = ostring.indexOf("{");
807 if (idx != -1) {
808 ostring = ostring.substr(0, idx) + "{...}";
809 }
810 }
811 return ostring;
812 },
813
814 /** @id MochiKit.Base.reprArrayLike */
815 reprArrayLike: function (o) {
816 var m = MochiKit.Base;
817 return "[" + m.map(m.repr, o).join(", ") + "]";
818 },
819
820 /** @id MochiKit.Base.reprString */
821 reprString: function (o) {
822 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
823 ).replace(/[\f]/g, "\\f"
824 ).replace(/[\b]/g, "\\b"
825 ).replace(/[\n]/g, "\\n"
826 ).replace(/[\t]/g, "\\t"
827 ).replace(/[\v]/g, "\\v"
828 ).replace(/[\r]/g, "\\r");
829 },
830
831 /** @id MochiKit.Base.reprNumber */
832 reprNumber: function (o) {
833 return o + "";
834 },
835
836 /** @id MochiKit.Base.registerJSON */
837 registerJSON: function (name, check, wrap, /* optional */override) {
838 MochiKit.Base.jsonRegistry.register(name, check, wrap, override);
839 },
840
841
842 /** @id MochiKit.Base.evalJSON */
843 evalJSON: function () {
844 return eval("(" + MochiKit.Base._filterJSON(arguments[0]) + ")");
845 },
846
847 _filterJSON: function (s) {
848 var m = s.match(/^\s*\/\*(.*)\*\/\s*$/);
849 if (m) {
850 return m[1];
851 }
852 return s;
853 },
854
855 /** @id MochiKit.Base.serializeJSON */
856 serializeJSON: function (o) {
857 var objtype = typeof(o);
858 if (objtype == "number" || objtype == "boolean") {
859 return o + "";
860 } else if (o === null) {
861 return "null";
862 } else if (objtype == "string") {
863 var res = "";
864 for (var i = 0; i < o.length; i++) {
865 var c = o.charAt(i);
866 if (c == '\"') {
867 res += '\\"';
868 } else if (c == '\\') {
869 res += '\\\\';
870 } else if (c == '\b') {
871 res += '\\b';
872 } else if (c == '\f') {
873 res += '\\f';
874 } else if (c == '\n') {
875 res += '\\n';
876 } else if (c == '\r') {
877 res += '\\r';
878 } else if (c == '\t') {
879 res += '\\t';
880 } else if (o.charCodeAt(i) <= 0x1F) {
881 var hex = o.charCodeAt(i).toString(16);
882 if (hex.length < 2) {
883 hex = '0' + hex;
884 }
885 res += '\\u00' + hex.toUpperCase();
886 } else {
887 res += c;
888 }
889 }
890 return '"' + res + '"';
891 }
892 // recurse
893 var me = arguments.callee;
894 // short-circuit for objects that support "json" serialization
895 // if they return "self" then just pass-through...
896 var newObj;
897 if (typeof(o.__json__) == "function") {
898 newObj = o.__json__();
899 if (o !== newObj) {
900 return me(newObj);
901 }
902 }
903 if (typeof(o.json) == "function") {
904 newObj = o.json();
905 if (o !== newObj) {
906 return me(newObj);
907 }
908 }
909 // array
910 if (objtype != "function" && typeof(o.length) == "number") {
911 var res = [];
912 for (var i = 0; i < o.length; i++) {
913 var val = me(o[i]);
914 if (typeof(val) != "string") {
915 // skip non-serializable values
916 continue;
917 }
918 res.push(val);
919 }
920 return "[" + res.join(", ") + "]";
921 }
922 // look in the registry
923 var m = MochiKit.Base;
924 try {
925 newObj = m.jsonRegistry.match(o);
926 if (o !== newObj) {
927 return me(newObj);
928 }
929 } catch (e) {
930 if (e != m.NotFound) {
931 // something really bad happened
932 throw e;
933 }
934 }
935 // undefined is outside of the spec
936 if (objtype == "undefined") {
937 throw new TypeError("undefined can not be serialized as JSON");
938 }
939 // it's a function with no adapter, bad
940 if (objtype == "function") {
941 return null;
942 }
943 // generic object code path
944 res = [];
945 for (var k in o) {
946 var useKey;
947 if (typeof(k) == "number") {
948 useKey = '"' + k + '"';
949 } else if (typeof(k) == "string") {
950 useKey = me(k);
951 } else {
952 // skip non-string or number keys
953 continue;
954 }
955 val = me(o[k]);
956 if (typeof(val) != "string") {
957 // skip non-serializable values
958 continue;
959 }
960 res.push(useKey + ":" + val);
961 }
962 return "{" + res.join(", ") + "}";
963 },
964
965
966 /** @id MochiKit.Base.objEqual */
967 objEqual: function (a, b) {
968 return (MochiKit.Base.compare(a, b) === 0);
969 },
970
971 /** @id MochiKit.Base.arrayEqual */
972 arrayEqual: function (self, arr) {
973 if (self.length != arr.length) {
974 return false;
975 }
976 return (MochiKit.Base.compare(self, arr) === 0);
977 },
978
979 /** @id MochiKit.Base.concat */
980 concat: function (/* lst... */) {
981 var rval = [];
982 var extend = MochiKit.Base.extend;
983 for (var i = 0; i < arguments.length; i++) {
984 extend(rval, arguments[i]);
985 }
986 return rval;
987 },
988
989 /** @id MochiKit.Base.keyComparator */
990 keyComparator: function (key/* ... */) {
991 // fast-path for single key comparisons
992 var m = MochiKit.Base;
993 var compare = m.compare;
994 if (arguments.length == 1) {
995 return function (a, b) {
996 return compare(a[key], b[key]);
997 };
998 }
999 var compareKeys = m.extend(null, arguments);
1000 return function (a, b) {
1001 var rval = 0;
1002 // keep comparing until something is inequal or we run out of
1003 // keys to compare
1004 for (var i = 0; (rval === 0) && (i < compareKeys.length); i++) {
1005 var key = compareKeys[i];
1006 rval = compare(a[key], b[key]);
1007 }
1008 return rval;
1009 };
1010 },
1011
1012 /** @id MochiKit.Base.reverseKeyComparator */
1013 reverseKeyComparator: function (key) {
1014 var comparator = MochiKit.Base.keyComparator.apply(this, arguments);
1015 return function (a, b) {
1016 return comparator(b, a);
1017 };
1018 },
1019
1020 /** @id MochiKit.Base.partial */
1021 partial: function (func) {
1022 var m = MochiKit.Base;
1023 return m.bind.apply(this, m.extend([func, undefined], arguments, 1));
1024 },
1025
1026 /** @id MochiKit.Base.listMinMax */
1027 listMinMax: function (which, lst) {
1028 if (lst.length === 0) {
1029 return null;
1030 }
1031 var cur = lst[0];
1032 var compare = MochiKit.Base.compare;
1033 for (var i = 1; i < lst.length; i++) {
1034 var o = lst[i];
1035 if (compare(o, cur) == which) {
1036 cur = o;
1037 }
1038 }
1039 return cur;
1040 },
1041
1042 /** @id MochiKit.Base.objMax */
1043 objMax: function (/* obj... */) {
1044 return MochiKit.Base.listMinMax(1, arguments);
1045 },
1046
1047 /** @id MochiKit.Base.objMin */
1048 objMin: function (/* obj... */) {
1049 return MochiKit.Base.listMinMax(-1, arguments);
1050 },
1051
1052 /** @id MochiKit.Base.findIdentical */
1053 findIdentical: function (lst, value, start/* = 0 */, /* optional */end) {
1054 if (typeof(end) == "undefined" || end === null) {
1055 end = lst.length;
1056 }
1057 if (typeof(start) == "undefined" || start === null) {
1058 start = 0;
1059 }
1060 for (var i = start; i < end; i++) {
1061 if (lst[i] === value) {
1062 return i;
1063 }
1064 }
1065 return -1;
1066 },
1067
1068 /** @id MochiKit.Base.mean */
1069 mean: function(/* lst... */) {
1070 /* http://www.nist.gov/dads/HTML/mean.html */
1071 var sum = 0;
1072
1073 var m = MochiKit.Base;
1074 var args = m.extend(null, arguments);
1075 var count = args.length;
1076
1077 while (args.length) {
1078 var o = args.shift();
1079 if (o && typeof(o) == "object" && typeof(o.length) == "number") {
1080 count += o.length - 1;
1081 for (var i = o.length - 1; i >= 0; i--) {
1082 sum += o[i];
1083 }
1084 } else {
1085 sum += o;
1086 }
1087 }
1088
1089 if (count <= 0) {
1090 throw new TypeError('mean() requires at least one argument');
1091 }
1092
1093 return sum/count;
1094 },
1095
1096 /** @id MochiKit.Base.median */
1097 median: function(/* lst... */) {
1098 /* http://www.nist.gov/dads/HTML/median.html */
1099 var data = MochiKit.Base.flattenArguments(arguments);
1100 if (data.length === 0) {
1101 throw new TypeError('median() requires at least one argument');
1102 }
1103 data.sort(compare);
1104 if (data.length % 2 == 0) {
1105 var upper = data.length / 2;
1106 return (data[upper] + data[upper - 1]) / 2;
1107 } else {
1108 return data[(data.length - 1) / 2];
1109 }
1110 },
1111
1112 /** @id MochiKit.Base.findValue */
1113 findValue: function (lst, value, start/* = 0 */, /* optional */end) {
1114 if (typeof(end) == "undefined" || end === null) {
1115 end = lst.length;
1116 }
1117 if (typeof(start) == "undefined" || start === null) {
1118 start = 0;
1119 }
1120 var cmp = MochiKit.Base.compare;
1121 for (var i = start; i < end; i++) {
1122 if (cmp(lst[i], value) === 0) {
1123 return i;
1124 }
1125 }
1126 return -1;
1127 },
1128
1129 /** @id MochiKit.Base.nodeWalk */
1130 nodeWalk: function (node, visitor) {
1131 var nodes = [node];
1132 var extend = MochiKit.Base.extend;
1133 while (nodes.length) {
1134 var res = visitor(nodes.shift());
1135 if (res) {
1136 extend(nodes, res);
1137 }
1138 }
1139 },
1140
1141
1142 /** @id MochiKit.Base.nameFunctions */
1143 nameFunctions: function (namespace) {
1144 var base = namespace.NAME;
1145 if (typeof(base) == 'undefined') {
1146 base = '';
1147 } else {
1148 base = base + '.';
1149 }
1150 for (var name in namespace) {
1151 var o = namespace[name];
1152 if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') {
1153 try {
1154 o.NAME = base + name;
1155 } catch (e) {
1156 // pass
1157 }
1158 }
1159 }
1160 },
1161
1162
1163 /** @id MochiKit.Base.queryString */
1164 queryString: function (names, values) {
1165 // check to see if names is a string or a DOM element, and if
1166 // MochiKit.DOM is available. If so, drop it like it's a form
1167 // Ugliest conditional in MochiKit? Probably!
1168 if (typeof(MochiKit.DOM) != "undefined" && arguments.length == 1
1169 && (typeof(names) == "string" || (
1170 typeof(names.nodeType) != "undefined" && names.nodeType > 0
1171 ))
1172 ) {
1173 var kv = MochiKit.DOM.formContents(names);
1174 names = kv[0];
1175 values = kv[1];
1176 } else if (arguments.length == 1) {
1177 // Allow the return value of formContents to be passed directly
1178 if (typeof(names.length) == "number" && names.length == 2) {
1179 return arguments.callee(names[0], names[1]);
1180 }
1181 var o = names;
1182 names = [];
1183 values = [];
1184 for (var k in o) {
1185 var v = o[k];
1186 if (typeof(v) == "function") {
1187 continue;
1188 } else if (MochiKit.Base.isArrayLike(v)){
1189 for (var i = 0; i < v.length; i++) {
1190 names.push(k);
1191 values.push(v[i]);
1192 }
1193 } else {
1194 names.push(k);
1195 values.push(v);
1196 }
1197 }
1198 }
1199 var rval = [];
1200 var len = Math.min(names.length, values.length);
1201 var urlEncode = MochiKit.Base.urlEncode;
1202 for (var i = 0; i < len; i++) {
1203 v = values[i];
1204 if (typeof(v) != 'undefined' && v !== null) {
1205 rval.push(urlEncode(names[i]) + "=" + urlEncode(v));
1206 }
1207 }
1208 return rval.join("&");
1209 },
1210
1211
1212 /** @id MochiKit.Base.parseQueryString */
1213 parseQueryString: function (encodedString, useArrays) {
1214 // strip a leading '?' from the encoded string
1215 var qstr = (encodedString.charAt(0) == "?")
1216 ? encodedString.substring(1)
1217 : encodedString;
1218 var pairs = qstr.replace(/\+/g, "%20").split(/\&amp\;|\&\#38\;|\&#x26;|\&/);
1219 var o = {};
1220 var decode;
1221 if (typeof(decodeURIComponent) != "undefined") {
1222 decode = decodeURIComponent;
1223 } else {
1224 decode = unescape;
1225 }
1226 if (useArrays) {
1227 for (var i = 0; i < pairs.length; i++) {
1228 var pair = pairs[i].split("=");
1229 var name = decode(pair.shift());
1230 if (!name) {
1231 continue;
1232 }
1233 var arr = o[name];
1234 if (!(arr instanceof Array)) {
1235 arr = [];
1236 o[name] = arr;
1237 }
1238 arr.push(decode(pair.join("=")));
1239 }
1240 } else {
1241 for (var i = 0; i < pairs.length; i++) {
1242 pair = pairs[i].split("=");
1243 var name = pair.shift();
1244 if (!name) {
1245 continue;
1246 }
1247 o[decode(name)] = decode(pair.join("="));
1248 }
1249 }
1250 return o;
1251 }
1252});
1253
1254/** @id MochiKit.Base.AdapterRegistry */
1255MochiKit.Base.AdapterRegistry = function () {
1256 this.pairs = [];
1257};
1258
1259MochiKit.Base.AdapterRegistry.prototype = {
1260 /** @id MochiKit.Base.AdapterRegistry.prototype.register */
1261 register: function (name, check, wrap, /* optional */ override) {
1262 if (override) {
1263 this.pairs.unshift([name, check, wrap]);
1264 } else {
1265 this.pairs.push([name, check, wrap]);
1266 }
1267 },
1268
1269 /** @id MochiKit.Base.AdapterRegistry.prototype.match */
1270 match: function (/* ... */) {
1271 for (var i = 0; i < this.pairs.length; i++) {
1272 var pair = this.pairs[i];
1273 if (pair[1].apply(this, arguments)) {
1274 return pair[2].apply(this, arguments);
1275 }
1276 }
1277 throw MochiKit.Base.NotFound;
1278 },
1279
1280 /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */
1281 unregister: function (name) {
1282 for (var i = 0; i < this.pairs.length; i++) {
1283 var pair = this.pairs[i];
1284 if (pair[0] == name) {
1285 this.pairs.splice(i, 1);
1286 return true;
1287 }
1288 }
1289 return false;
1290 }
1291};
1292
1293MochiKit.Base._exportSymbols = function (globals, module) {
1294 if (MochiKit.__export__ === false || module.__export__ === false) {
1295 return;
1296 }
1297 for (var k in module) {
1298 var v = module[k];
1299 if (v != null) {
1300 var okName = (k[0] !== "_" && k !== "toString");
1301 if (v.__export__ === true || (v.__export__ !== false && okName)) {
1302 globals[k] = module[k];
1303 }
1304 }
1305 }
1306};
1307
1308/**
1309 * Creates a deprecated function alias in the specified module. The
1310 * deprecated function will forward all calls and arguments to a
1311 * target function, while also logging a debug message on the first
1312 * call (if MochiKit.Logging is loaded). The destination function may
1313 * be located in another module, which must be loaded, or an
1314 * exception will be thrown.
1315 *
1316 * @param {Object/String} module the source module or module name
1317 * (e.g. 'DOM' or 'MochiKit.DOM')
1318 * @param {String} name the deprecated function name (e.g. 'getStyle')
1319 * @param {String} target the fully qualified name of the target
1320 * function (e.g. 'MochiKit.Style.getStyle')
1321 * @param {String} version the first version when the source function
1322 * was deprecated (e.g. '1.4')
1323 * @param {Boolean} [exportable] the exportable function flag,
1324 * defaults to true
1325 */
1326MochiKit.Base._deprecated = function (module, name, target, version, exportable) {
1327 if (typeof(module) === 'string') {
1328 if (module.indexOf('MochiKit.') === 0) {
1329 module = module.substring(9);
1330 }
1331 module = MochiKit[module];
1332 }
1333 var targetModule = target.split('.')[1];
1334 var targetName = target.split('.')[2];
1335 var func = function () {
1336 var self = arguments.callee;
1337 var msg = module.NAME + '.' + name + ' is deprecated since version ' +
1338 version + '. Use ' + target + ' instead.';
1339 if (self.logged !== true) {
1340 self.logged = true;
1341 if (MochiKit.Logging) {
1342 MochiKit.Logging.logDebug(msg);
1343 } else if (console && console.log) {
1344 console.log(msg);
1345 }
1346 }
1347 if (!MochiKit[targetModule]) {
1348 throw new Error(msg);
1349 }
1350 return MochiKit[targetModule][targetName].apply(this, arguments);
1351 };
1352 if (exportable === false) {
1353 func.__export__ = false;
1354 }
1355 module[name] = func;
1356}
1357
1358MochiKit.Base.__new__ = function () {
1359 var m = this;
1360
1361 /** @id MochiKit.Base.noop */
1362 m.noop = m.operator.identity;
1363
1364 // Backwards compat
1365 m._deprecated(m, 'forward', 'MochiKit.Base.forwardCall', '1.3', false);
1366 m._deprecated(m, 'find', 'MochiKit.Base.findValue', '1.3', false);
1367
1368 if (typeof(encodeURIComponent) != "undefined") {
1369 /** @id MochiKit.Base.urlEncode */
1370 m.urlEncode = function (unencoded) {
1371 return encodeURIComponent(unencoded).replace(/\'/g, '%27');
1372 };
1373 } else {
1374 m.urlEncode = function (unencoded) {
1375 return escape(unencoded
1376 ).replace(/\+/g, '%2B'
1377 ).replace(/\"/g,'%22'
1378 ).rval.replace(/\'/g, '%27');
1379 };
1380 }
1381
1382 /** @id MochiKit.Base.NamedError */
1383 m.NamedError = function (name) {
1384 this.message = name;
1385 this.name = name;
1386 };
1387 m.NamedError.prototype = new Error();
1388 m.update(m.NamedError.prototype, {
1389 repr: function () {
1390 if (this.message && this.message != this.name) {
1391 return this.name + "(" + m.repr(this.message) + ")";
1392 } else {
1393 return this.name + "()";
1394 }
1395 },
1396 toString: m.forwardCall("repr")
1397 });
1398
1399 /** @id MochiKit.Base.NotFound */
1400 m.NotFound = new m.NamedError("MochiKit.Base.NotFound");
1401
1402
1403 /** @id MochiKit.Base.listMax */
1404 m.listMax = m.partial(m.listMinMax, 1);
1405 /** @id MochiKit.Base.listMin */
1406 m.listMin = m.partial(m.listMinMax, -1);
1407
1408 /** @id MochiKit.Base.isCallable */
1409 m.isCallable = m.typeMatcher('function');
1410 /** @id MochiKit.Base.isUndefined */
1411 m.isUndefined = m.typeMatcher('undefined');
1412
1413 /** @id MochiKit.Base.merge */
1414 m.merge = m.partial(m.update, null);
1415 /** @id MochiKit.Base.zip */
1416 m.zip = m.partial(m.map, null);
1417
1418 /** @id MochiKit.Base.average */
1419 m.average = m.mean;
1420
1421 /** @id MochiKit.Base.comparatorRegistry */
1422 m.comparatorRegistry = new m.AdapterRegistry();
1423 m.registerComparator("dateLike", m.isDateLike, m.compareDateLike);
1424 m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike);
1425
1426 /** @id MochiKit.Base.reprRegistry */
1427 m.reprRegistry = new m.AdapterRegistry();
1428 m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike);
1429 m.registerRepr("string", m.typeMatcher("string"), m.reprString);
1430 m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber);
1431
1432 /** @id MochiKit.Base.jsonRegistry */
1433 m.jsonRegistry = new m.AdapterRegistry();
1434
1435 m.nameFunctions(this);
1436
1437};
1438
1439MochiKit.Base.__new__();
1440
1441//
1442// XXX: Internet Explorer blows
1443//
1444if (MochiKit.__export__) {
1445 compare = MochiKit.Base.compare;
1446 compose = MochiKit.Base.compose;
1447 serializeJSON = MochiKit.Base.serializeJSON;
1448 mean = MochiKit.Base.mean;
1449 median = MochiKit.Base.median;
1450}
1451
1452MochiKit.Base._exportSymbols(this, MochiKit.Base);
diff --git a/frontend/gamma/js/MochiKit/Color.js b/frontend/gamma/js/MochiKit/Color.js
new file mode 100644
index 0000000..27dc2d0
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Color.js
@@ -0,0 +1,832 @@
1/***
2
3MochiKit.Color 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito and others. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Color', '1.5', ['Base', 'DOM', 'Style']);
12
13/** @id MochiKit.Color.Color */
14MochiKit.Color.Color = function (red, green, blue, alpha) {
15 if (typeof(alpha) == 'undefined' || alpha === null) {
16 alpha = 1.0;
17 }
18 this.rgb = {
19 r: red,
20 g: green,
21 b: blue,
22 a: alpha
23 };
24};
25
26
27// Prototype methods
28
29MochiKit.Color.Color.prototype = {
30
31 __class__: MochiKit.Color.Color,
32
33 /** @id MochiKit.Color.Color.prototype.colorWithAlpha */
34 colorWithAlpha: function (alpha) {
35 var rgb = this.rgb;
36 var m = MochiKit.Color;
37 return m.Color.fromRGB(rgb.r, rgb.g, rgb.b, alpha);
38 },
39
40 /** @id MochiKit.Color.Color.prototype.colorWithHue */
41 colorWithHue: function (hue) {
42 // get an HSL model, and set the new hue...
43 var hsl = this.asHSL();
44 hsl.h = hue;
45 var m = MochiKit.Color;
46 // convert back to RGB...
47 return m.Color.fromHSL(hsl);
48 },
49
50 /** @id MochiKit.Color.Color.prototype.colorWithSaturation */
51 colorWithSaturation: function (saturation) {
52 // get an HSL model, and set the new hue...
53 var hsl = this.asHSL();
54 hsl.s = saturation;
55 var m = MochiKit.Color;
56 // convert back to RGB...
57 return m.Color.fromHSL(hsl);
58 },
59
60 /** @id MochiKit.Color.Color.prototype.colorWithLightness */
61 colorWithLightness: function (lightness) {
62 // get an HSL model, and set the new hue...
63 var hsl = this.asHSL();
64 hsl.l = lightness;
65 var m = MochiKit.Color;
66 // convert back to RGB...
67 return m.Color.fromHSL(hsl);
68 },
69
70 /** @id MochiKit.Color.Color.prototype.darkerColorWithLevel */
71 darkerColorWithLevel: function (level) {
72 var hsl = this.asHSL();
73 hsl.l = Math.max(hsl.l - level, 0);
74 var m = MochiKit.Color;
75 return m.Color.fromHSL(hsl);
76 },
77
78 /** @id MochiKit.Color.Color.prototype.lighterColorWithLevel */
79 lighterColorWithLevel: function (level) {
80 var hsl = this.asHSL();
81 hsl.l = Math.min(hsl.l + level, 1);
82 var m = MochiKit.Color;
83 return m.Color.fromHSL(hsl);
84 },
85
86 /** @id MochiKit.Color.Color.prototype.blendedColor */
87 blendedColor: function (other, /* optional */ fraction) {
88 if (typeof(fraction) == 'undefined' || fraction === null) {
89 fraction = 0.5;
90 }
91 var sf = 1.0 - fraction;
92 var s = this.rgb;
93 var d = other.rgb;
94 var df = fraction;
95 return MochiKit.Color.Color.fromRGB(
96 (s.r * sf) + (d.r * df),
97 (s.g * sf) + (d.g * df),
98 (s.b * sf) + (d.b * df),
99 (s.a * sf) + (d.a * df)
100 );
101 },
102
103 /** @id MochiKit.Color.Color.prototype.compareRGB */
104 compareRGB: function (other) {
105 var a = this.asRGB();
106 var b = other.asRGB();
107 return MochiKit.Base.compare(
108 [a.r, a.g, a.b, a.a],
109 [b.r, b.g, b.b, b.a]
110 );
111 },
112
113 /** @id MochiKit.Color.Color.prototype.isLight */
114 isLight: function () {
115 return this.asHSL().b > 0.5;
116 },
117
118 /** @id MochiKit.Color.Color.prototype.isDark */
119 isDark: function () {
120 return (!this.isLight());
121 },
122
123 /** @id MochiKit.Color.Color.prototype.toHSLString */
124 toHSLString: function () {
125 var c = this.asHSL();
126 var ccc = MochiKit.Color.clampColorComponent;
127 var rval = this._hslString;
128 if (!rval) {
129 var mid = (
130 ccc(c.h, 360).toFixed(0)
131 + "," + ccc(c.s, 100).toPrecision(4) + "%"
132 + "," + ccc(c.l, 100).toPrecision(4) + "%"
133 );
134 var a = c.a;
135 if (a >= 1) {
136 a = 1;
137 rval = "hsl(" + mid + ")";
138 } else {
139 if (a <= 0) {
140 a = 0;
141 }
142 rval = "hsla(" + mid + "," + a + ")";
143 }
144 this._hslString = rval;
145 }
146 return rval;
147 },
148
149 /** @id MochiKit.Color.Color.prototype.toRGBString */
150 toRGBString: function () {
151 var c = this.rgb;
152 var ccc = MochiKit.Color.clampColorComponent;
153 var rval = this._rgbString;
154 if (!rval) {
155 var mid = (
156 ccc(c.r, 255).toFixed(0)
157 + "," + ccc(c.g, 255).toFixed(0)
158 + "," + ccc(c.b, 255).toFixed(0)
159 );
160 if (c.a != 1) {
161 rval = "rgba(" + mid + "," + c.a + ")";
162 } else {
163 rval = "rgb(" + mid + ")";
164 }
165 this._rgbString = rval;
166 }
167 return rval;
168 },
169
170 /** @id MochiKit.Color.Color.prototype.asRGB */
171 asRGB: function () {
172 return MochiKit.Base.clone(this.rgb);
173 },
174
175 /** @id MochiKit.Color.Color.prototype.toHexString */
176 toHexString: function () {
177 var m = MochiKit.Color;
178 var c = this.rgb;
179 var ccc = MochiKit.Color.clampColorComponent;
180 var rval = this._hexString;
181 if (!rval) {
182 rval = ("#" +
183 m.toColorPart(ccc(c.r, 255)) +
184 m.toColorPart(ccc(c.g, 255)) +
185 m.toColorPart(ccc(c.b, 255))
186 );
187 this._hexString = rval;
188 }
189 return rval;
190 },
191
192 /** @id MochiKit.Color.Color.prototype.asHSV */
193 asHSV: function () {
194 var hsv = this.hsv;
195 var c = this.rgb;
196 if (typeof(hsv) == 'undefined' || hsv === null) {
197 hsv = MochiKit.Color.rgbToHSV(this.rgb);
198 this.hsv = hsv;
199 }
200 return MochiKit.Base.clone(hsv);
201 },
202
203 /** @id MochiKit.Color.Color.prototype.asHSL */
204 asHSL: function () {
205 var hsl = this.hsl;
206 var c = this.rgb;
207 if (typeof(hsl) == 'undefined' || hsl === null) {
208 hsl = MochiKit.Color.rgbToHSL(this.rgb);
209 this.hsl = hsl;
210 }
211 return MochiKit.Base.clone(hsl);
212 },
213
214 /** @id MochiKit.Color.Color.prototype.toString */
215 toString: function () {
216 return this.toRGBString();
217 },
218
219 /** @id MochiKit.Color.Color.prototype.repr */
220 repr: function () {
221 var c = this.rgb;
222 var col = [c.r, c.g, c.b, c.a];
223 return this.__class__.NAME + "(" + col.join(", ") + ")";
224 }
225
226};
227
228// Constructor methods
229
230MochiKit.Base.update(MochiKit.Color.Color, {
231 /** @id MochiKit.Color.Color.fromRGB */
232 fromRGB: function (red, green, blue, alpha) {
233 // designated initializer
234 var Color = MochiKit.Color.Color;
235 if (arguments.length == 1) {
236 var rgb = red;
237 red = rgb.r;
238 green = rgb.g;
239 blue = rgb.b;
240 if (typeof(rgb.a) == 'undefined') {
241 alpha = undefined;
242 } else {
243 alpha = rgb.a;
244 }
245 }
246 return new Color(red, green, blue, alpha);
247 },
248
249 /** @id MochiKit.Color.Color.fromHSL */
250 fromHSL: function (hue, saturation, lightness, alpha) {
251 var m = MochiKit.Color;
252 return m.Color.fromRGB(m.hslToRGB.apply(m, arguments));
253 },
254
255 /** @id MochiKit.Color.Color.fromHSV */
256 fromHSV: function (hue, saturation, value, alpha) {
257 var m = MochiKit.Color;
258 return m.Color.fromRGB(m.hsvToRGB.apply(m, arguments));
259 },
260
261 /** @id MochiKit.Color.Color.fromName */
262 fromName: function (name) {
263 var Color = MochiKit.Color.Color;
264 // Opera 9 seems to "quote" named colors(?!)
265 if (name.charAt(0) == '"') {
266 name = name.substr(1, name.length - 2);
267 }
268 var htmlColor = Color._namedColors[name.toLowerCase()];
269 if (typeof(htmlColor) == 'string') {
270 return Color.fromHexString(htmlColor);
271 } else if (name == "transparent") {
272 return Color.transparentColor();
273 }
274 return null;
275 },
276
277 /** @id MochiKit.Color.Color.fromString */
278 fromString: function (colorString) {
279 var self = MochiKit.Color.Color;
280 var three = colorString.substr(0, 3);
281 if (three == "rgb") {
282 return self.fromRGBString(colorString);
283 } else if (three == "hsl") {
284 return self.fromHSLString(colorString);
285 } else if (colorString.charAt(0) == "#") {
286 return self.fromHexString(colorString);
287 }
288 return self.fromName(colorString);
289 },
290
291
292 /** @id MochiKit.Color.Color.fromHexString */
293 fromHexString: function (hexCode) {
294 if (hexCode.charAt(0) == '#') {
295 hexCode = hexCode.substring(1);
296 }
297 var components = [];
298 var i, hex;
299 if (hexCode.length == 3) {
300 for (i = 0; i < 3; i++) {
301 hex = hexCode.substr(i, 1);
302 components.push(parseInt(hex + hex, 16) / 255.0);
303 }
304 } else {
305 for (i = 0; i < 6; i += 2) {
306 hex = hexCode.substr(i, 2);
307 components.push(parseInt(hex, 16) / 255.0);
308 }
309 }
310 var Color = MochiKit.Color.Color;
311 return Color.fromRGB.apply(Color, components);
312 },
313
314
315 _fromColorString: function (pre, method, scales, colorCode) {
316 // parses either HSL or RGB
317 if (colorCode.indexOf(pre) === 0) {
318 colorCode = colorCode.substring(colorCode.indexOf("(", 3) + 1, colorCode.length - 1);
319 }
320 var colorChunks = colorCode.split(/\s*,\s*/);
321 var colorFloats = [];
322 for (var i = 0; i < colorChunks.length; i++) {
323 var c = colorChunks[i];
324 var val;
325 var three = c.substring(c.length - 3);
326 if (c.charAt(c.length - 1) == '%') {
327 val = 0.01 * parseFloat(c.substring(0, c.length - 1));
328 } else if (three == "deg") {
329 val = parseFloat(c) / 360.0;
330 } else if (three == "rad") {
331 val = parseFloat(c) / (Math.PI * 2);
332 } else {
333 val = scales[i] * parseFloat(c);
334 }
335 colorFloats.push(val);
336 }
337 return this[method].apply(this, colorFloats);
338 },
339
340 /** @id MochiKit.Color.Color.fromComputedStyle */
341 fromComputedStyle: function (elem, style) {
342 var d = MochiKit.DOM;
343 var cls = MochiKit.Color.Color;
344 for (elem = d.getElement(elem); elem; elem = elem.parentNode) {
345 var actualColor = MochiKit.Style.getStyle.apply(d, arguments);
346 if (!actualColor) {
347 continue;
348 }
349 var color = cls.fromString(actualColor);
350 if (!color) {
351 break;
352 }
353 if (color.asRGB().a > 0) {
354 return color;
355 }
356 }
357 return null;
358 },
359
360 /** @id MochiKit.Color.Color.fromBackground */
361 fromBackground: function (elem) {
362 var cls = MochiKit.Color.Color;
363 return cls.fromComputedStyle(
364 elem, "backgroundColor", "background-color") || cls.whiteColor();
365 },
366
367 /** @id MochiKit.Color.Color.fromText */
368 fromText: function (elem) {
369 var cls = MochiKit.Color.Color;
370 return cls.fromComputedStyle(
371 elem, "color", "color") || cls.blackColor();
372 },
373
374 /** @id MochiKit.Color.Color.namedColors */
375 namedColors: function () {
376 return MochiKit.Base.clone(MochiKit.Color.Color._namedColors);
377 }
378});
379
380
381// Module level functions
382
383MochiKit.Base.update(MochiKit.Color, {
384 /** @id MochiKit.Color.clampColorComponent */
385 clampColorComponent: function (v, scale) {
386 v *= scale;
387 if (v < 0) {
388 return 0;
389 } else if (v > scale) {
390 return scale;
391 } else {
392 return v;
393 }
394 },
395
396 _hslValue: function (n1, n2, hue) {
397 if (hue > 6.0) {
398 hue -= 6.0;
399 } else if (hue < 0.0) {
400 hue += 6.0;
401 }
402 var val;
403 if (hue < 1.0) {
404 val = n1 + (n2 - n1) * hue;
405 } else if (hue < 3.0) {
406 val = n2;
407 } else if (hue < 4.0) {
408 val = n1 + (n2 - n1) * (4.0 - hue);
409 } else {
410 val = n1;
411 }
412 return val;
413 },
414
415 /** @id MochiKit.Color.hsvToRGB */
416 hsvToRGB: function (hue, saturation, value, alpha) {
417 if (arguments.length == 1) {
418 var hsv = hue;
419 hue = hsv.h;
420 saturation = hsv.s;
421 value = hsv.v;
422 alpha = hsv.a;
423 }
424 var red;
425 var green;
426 var blue;
427 if (saturation === 0) {
428 red = value;
429 green = value;
430 blue = value;
431 } else {
432 var i = Math.floor(hue * 6);
433 var f = (hue * 6) - i;
434 var p = value * (1 - saturation);
435 var q = value * (1 - (saturation * f));
436 var t = value * (1 - (saturation * (1 - f)));
437 switch (i) {
438 case 1: red = q; green = value; blue = p; break;
439 case 2: red = p; green = value; blue = t; break;
440 case 3: red = p; green = q; blue = value; break;
441 case 4: red = t; green = p; blue = value; break;
442 case 5: red = value; green = p; blue = q; break;
443 case 6: // fall through
444 case 0: red = value; green = t; blue = p; break;
445 }
446 }
447 return {
448 r: red,
449 g: green,
450 b: blue,
451 a: alpha
452 };
453 },
454
455 /** @id MochiKit.Color.hslToRGB */
456 hslToRGB: function (hue, saturation, lightness, alpha) {
457 if (arguments.length == 1) {
458 var hsl = hue;
459 hue = hsl.h;
460 saturation = hsl.s;
461 lightness = hsl.l;
462 alpha = hsl.a;
463 }
464 var red;
465 var green;
466 var blue;
467 if (saturation === 0) {
468 red = lightness;
469 green = lightness;
470 blue = lightness;
471 } else {
472 var m2;
473 if (lightness <= 0.5) {
474 m2 = lightness * (1.0 + saturation);
475 } else {
476 m2 = lightness + saturation - (lightness * saturation);
477 }
478 var m1 = (2.0 * lightness) - m2;
479 var f = MochiKit.Color._hslValue;
480 var h6 = hue * 6.0;
481 red = f(m1, m2, h6 + 2);
482 green = f(m1, m2, h6);
483 blue = f(m1, m2, h6 - 2);
484 }
485 return {
486 r: red,
487 g: green,
488 b: blue,
489 a: alpha
490 };
491 },
492
493 /** @id MochiKit.Color.rgbToHSV */
494 rgbToHSV: function (red, green, blue, alpha) {
495 if (arguments.length == 1) {
496 var rgb = red;
497 red = rgb.r;
498 green = rgb.g;
499 blue = rgb.b;
500 alpha = rgb.a;
501 }
502 var max = Math.max(Math.max(red, green), blue);
503 var min = Math.min(Math.min(red, green), blue);
504 var hue;
505 var saturation;
506 var value = max;
507 if (min == max) {
508 hue = 0;
509 saturation = 0;
510 } else {
511 var delta = (max - min);
512 saturation = delta / max;
513
514 if (red == max) {
515 hue = (green - blue) / delta;
516 } else if (green == max) {
517 hue = 2 + ((blue - red) / delta);
518 } else {
519 hue = 4 + ((red - green) / delta);
520 }
521 hue /= 6;
522 if (hue < 0) {
523 hue += 1;
524 }
525 if (hue > 1) {
526 hue -= 1;
527 }
528 }
529 return {
530 h: hue,
531 s: saturation,
532 v: value,
533 a: alpha
534 };
535 },
536
537 /** @id MochiKit.Color.rgbToHSL */
538 rgbToHSL: function (red, green, blue, alpha) {
539 if (arguments.length == 1) {
540 var rgb = red;
541 red = rgb.r;
542 green = rgb.g;
543 blue = rgb.b;
544 alpha = rgb.a;
545 }
546 var max = Math.max(red, Math.max(green, blue));
547 var min = Math.min(red, Math.min(green, blue));
548 var hue;
549 var saturation;
550 var lightness = (max + min) / 2.0;
551 var delta = max - min;
552 if (delta === 0) {
553 hue = 0;
554 saturation = 0;
555 } else {
556 if (lightness <= 0.5) {
557 saturation = delta / (max + min);
558 } else {
559 saturation = delta / (2 - max - min);
560 }
561 if (red == max) {
562 hue = (green - blue) / delta;
563 } else if (green == max) {
564 hue = 2 + ((blue - red) / delta);
565 } else {
566 hue = 4 + ((red - green) / delta);
567 }
568 hue /= 6;
569 if (hue < 0) {
570 hue += 1;
571 }
572 if (hue > 1) {
573 hue -= 1;
574 }
575
576 }
577 return {
578 h: hue,
579 s: saturation,
580 l: lightness,
581 a: alpha
582 };
583 },
584
585 /** @id MochiKit.Color.toColorPart */
586 toColorPart: function (num) {
587 num = Math.round(num);
588 var digits = num.toString(16);
589 if (num < 16) {
590 return '0' + digits;
591 }
592 return digits;
593 },
594
595 __new__: function () {
596 var m = MochiKit.Base;
597 /** @id MochiKit.Color.Color.fromRGBString */
598 this.Color.fromRGBString = m.bind(
599 this.Color._fromColorString, this.Color, "rgb", "fromRGB",
600 [1.0/255.0, 1.0/255.0, 1.0/255.0, 1]
601 );
602 /** @id MochiKit.Color.Color.fromHSLString */
603 this.Color.fromHSLString = m.bind(
604 this.Color._fromColorString, this.Color, "hsl", "fromHSL",
605 [1.0/360.0, 0.01, 0.01, 1]
606 );
607
608 var third = 1.0 / 3.0;
609 /** @id MochiKit.Color.colors */
610 var colors = {
611 // NSColor colors plus transparent
612 /** @id MochiKit.Color.blackColor */
613 black: [0, 0, 0],
614 /** @id MochiKit.Color.blueColor */
615 blue: [0, 0, 1],
616 /** @id MochiKit.Color.brownColor */
617 brown: [0.6, 0.4, 0.2],
618 /** @id MochiKit.Color.cyanColor */
619 cyan: [0, 1, 1],
620 /** @id MochiKit.Color.darkGrayColor */
621 darkGray: [third, third, third],
622 /** @id MochiKit.Color.grayColor */
623 gray: [0.5, 0.5, 0.5],
624 /** @id MochiKit.Color.greenColor */
625 green: [0, 1, 0],
626 /** @id MochiKit.Color.lightGrayColor */
627 lightGray: [2 * third, 2 * third, 2 * third],
628 /** @id MochiKit.Color.magentaColor */
629 magenta: [1, 0, 1],
630 /** @id MochiKit.Color.orangeColor */
631 orange: [1, 0.5, 0],
632 /** @id MochiKit.Color.purpleColor */
633 purple: [0.5, 0, 0.5],
634 /** @id MochiKit.Color.redColor */
635 red: [1, 0, 0],
636 /** @id MochiKit.Color.transparentColor */
637 transparent: [0, 0, 0, 0],
638 /** @id MochiKit.Color.whiteColor */
639 white: [1, 1, 1],
640 /** @id MochiKit.Color.yellowColor */
641 yellow: [1, 1, 0]
642 };
643
644 var makeColor = function (name, r, g, b, a) {
645 var rval = this.fromRGB(r, g, b, a);
646 this[name] = function () { return rval; };
647 return rval;
648 };
649
650 for (var k in colors) {
651 var name = k + "Color";
652 var bindArgs = m.concat(
653 [makeColor, this.Color, name],
654 colors[k]
655 );
656 this.Color[name] = m.bind.apply(null, bindArgs);
657 }
658
659 var isColor = function () {
660 for (var i = 0; i < arguments.length; i++) {
661 if (!(arguments[i] instanceof MochiKit.Color.Color)) {
662 return false;
663 }
664 }
665 return true;
666 };
667
668 var compareColor = function (a, b) {
669 return a.compareRGB(b);
670 };
671
672 m.nameFunctions(this);
673
674 m.registerComparator(this.Color.NAME, isColor, compareColor);
675 }
676});
677
678MochiKit.Color.__new__();
679
680// Full table of css3 X11 colors <http://www.w3.org/TR/css3-color/#X11COLORS>
681
682MochiKit.Color.Color._namedColors = {
683 aliceblue: "#f0f8ff",
684 antiquewhite: "#faebd7",
685 aqua: "#00ffff",
686 aquamarine: "#7fffd4",
687 azure: "#f0ffff",
688 beige: "#f5f5dc",
689 bisque: "#ffe4c4",
690 black: "#000000",
691 blanchedalmond: "#ffebcd",
692 blue: "#0000ff",
693 blueviolet: "#8a2be2",
694 brown: "#a52a2a",
695 burlywood: "#deb887",
696 cadetblue: "#5f9ea0",
697 chartreuse: "#7fff00",
698 chocolate: "#d2691e",
699 coral: "#ff7f50",
700 cornflowerblue: "#6495ed",
701 cornsilk: "#fff8dc",
702 crimson: "#dc143c",
703 cyan: "#00ffff",
704 darkblue: "#00008b",
705 darkcyan: "#008b8b",
706 darkgoldenrod: "#b8860b",
707 darkgray: "#a9a9a9",
708 darkgreen: "#006400",
709 darkgrey: "#a9a9a9",
710 darkkhaki: "#bdb76b",
711 darkmagenta: "#8b008b",
712 darkolivegreen: "#556b2f",
713 darkorange: "#ff8c00",
714 darkorchid: "#9932cc",
715 darkred: "#8b0000",
716 darksalmon: "#e9967a",
717 darkseagreen: "#8fbc8f",
718 darkslateblue: "#483d8b",
719 darkslategray: "#2f4f4f",
720 darkslategrey: "#2f4f4f",
721 darkturquoise: "#00ced1",
722 darkviolet: "#9400d3",
723 deeppink: "#ff1493",
724 deepskyblue: "#00bfff",
725 dimgray: "#696969",
726 dimgrey: "#696969",
727 dodgerblue: "#1e90ff",
728 firebrick: "#b22222",
729 floralwhite: "#fffaf0",
730 forestgreen: "#228b22",
731 fuchsia: "#ff00ff",
732 gainsboro: "#dcdcdc",
733 ghostwhite: "#f8f8ff",
734 gold: "#ffd700",
735 goldenrod: "#daa520",
736 gray: "#808080",
737 green: "#008000",
738 greenyellow: "#adff2f",
739 grey: "#808080",
740 honeydew: "#f0fff0",
741 hotpink: "#ff69b4",
742 indianred: "#cd5c5c",
743 indigo: "#4b0082",
744 ivory: "#fffff0",
745 khaki: "#f0e68c",
746 lavender: "#e6e6fa",
747 lavenderblush: "#fff0f5",
748 lawngreen: "#7cfc00",
749 lemonchiffon: "#fffacd",
750 lightblue: "#add8e6",
751 lightcoral: "#f08080",
752 lightcyan: "#e0ffff",
753 lightgoldenrodyellow: "#fafad2",
754 lightgray: "#d3d3d3",
755 lightgreen: "#90ee90",
756 lightgrey: "#d3d3d3",
757 lightpink: "#ffb6c1",
758 lightsalmon: "#ffa07a",
759 lightseagreen: "#20b2aa",
760 lightskyblue: "#87cefa",
761 lightslategray: "#778899",
762 lightslategrey: "#778899",
763 lightsteelblue: "#b0c4de",
764 lightyellow: "#ffffe0",
765 lime: "#00ff00",
766 limegreen: "#32cd32",
767 linen: "#faf0e6",
768 magenta: "#ff00ff",
769 maroon: "#800000",
770 mediumaquamarine: "#66cdaa",
771 mediumblue: "#0000cd",
772 mediumorchid: "#ba55d3",
773 mediumpurple: "#9370db",
774 mediumseagreen: "#3cb371",
775 mediumslateblue: "#7b68ee",
776 mediumspringgreen: "#00fa9a",
777 mediumturquoise: "#48d1cc",
778 mediumvioletred: "#c71585",
779 midnightblue: "#191970",
780 mintcream: "#f5fffa",
781 mistyrose: "#ffe4e1",
782 moccasin: "#ffe4b5",
783 navajowhite: "#ffdead",
784 navy: "#000080",
785 oldlace: "#fdf5e6",
786 olive: "#808000",
787 olivedrab: "#6b8e23",
788 orange: "#ffa500",
789 orangered: "#ff4500",
790 orchid: "#da70d6",
791 palegoldenrod: "#eee8aa",
792 palegreen: "#98fb98",
793 paleturquoise: "#afeeee",
794 palevioletred: "#db7093",
795 papayawhip: "#ffefd5",
796 peachpuff: "#ffdab9",
797 peru: "#cd853f",
798 pink: "#ffc0cb",
799 plum: "#dda0dd",
800 powderblue: "#b0e0e6",
801 purple: "#800080",
802 red: "#ff0000",
803 rosybrown: "#bc8f8f",
804 royalblue: "#4169e1",
805 saddlebrown: "#8b4513",
806 salmon: "#fa8072",
807 sandybrown: "#f4a460",
808 seagreen: "#2e8b57",
809 seashell: "#fff5ee",
810 sienna: "#a0522d",
811 silver: "#c0c0c0",
812 skyblue: "#87ceeb",
813 slateblue: "#6a5acd",
814 slategray: "#708090",
815 slategrey: "#708090",
816 snow: "#fffafa",
817 springgreen: "#00ff7f",
818 steelblue: "#4682b4",
819 tan: "#d2b48c",
820 teal: "#008080",
821 thistle: "#d8bfd8",
822 tomato: "#ff6347",
823 turquoise: "#40e0d0",
824 violet: "#ee82ee",
825 wheat: "#f5deb3",
826 white: "#ffffff",
827 whitesmoke: "#f5f5f5",
828 yellow: "#ffff00",
829 yellowgreen: "#9acd32"
830};
831
832MochiKit.Base._exportSymbols(this, MochiKit.Color);
diff --git a/frontend/gamma/js/MochiKit/DOM.js b/frontend/gamma/js/MochiKit/DOM.js
new file mode 100644
index 0000000..af5d46f
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/DOM.js
@@ -0,0 +1,1144 @@
1/***
2
3MochiKit.DOM 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('DOM', '1.5', ['Base']);
12
13MochiKit.Base.update(MochiKit.DOM, {
14
15 /** @id MochiKit.DOM.currentWindow */
16 currentWindow: function () {
17 return MochiKit.DOM._window;
18 },
19
20 /** @id MochiKit.DOM.currentDocument */
21 currentDocument: function () {
22 return MochiKit.DOM._document;
23 },
24
25 /** @id MochiKit.DOM.withWindow */
26 withWindow: function (win, func) {
27 var self = MochiKit.DOM;
28 var oldDoc = self._document;
29 var oldWin = self._window;
30 var rval;
31 try {
32 self._window = win;
33 self._document = win.document;
34 rval = func();
35 } catch (e) {
36 self._window = oldWin;
37 self._document = oldDoc;
38 throw e;
39 }
40 self._window = oldWin;
41 self._document = oldDoc;
42 return rval;
43 },
44
45 /** @id MochiKit.DOM.formContents */
46 formContents: function (elem/* = document.body */) {
47 var names = [];
48 var values = [];
49 var m = MochiKit.Base;
50 var self = MochiKit.DOM;
51 if (typeof(elem) == "undefined" || elem === null) {
52 elem = self._document.body;
53 } else {
54 elem = self.getElement(elem);
55 }
56 m.nodeWalk(elem, function (elem) {
57 var name = elem.name;
58 if (m.isNotEmpty(name)) {
59 var tagName = elem.tagName.toUpperCase();
60 if (tagName === "INPUT"
61 && (elem.type == "radio" || elem.type == "checkbox")
62 && !elem.checked
63 ) {
64 return null;
65 }
66 if (tagName === "SELECT") {
67 if (elem.type == "select-one") {
68 if (elem.selectedIndex >= 0) {
69 var opt = elem.options[elem.selectedIndex];
70 var v = opt.value;
71 if (!v) {
72 var h = opt.outerHTML;
73 // internet explorer sure does suck.
74 if (h && !h.match(/^[^>]+\svalue\s*=/i)) {
75 v = opt.text;
76 }
77 }
78 names.push(name);
79 values.push(v);
80 return null;
81 }
82 // no form elements?
83 names.push(name);
84 values.push("");
85 return null;
86 } else {
87 var opts = elem.options;
88 if (!opts.length) {
89 names.push(name);
90 values.push("");
91 return null;
92 }
93 for (var i = 0; i < opts.length; i++) {
94 var opt = opts[i];
95 if (!opt.selected) {
96 continue;
97 }
98 var v = opt.value;
99 if (!v) {
100 var h = opt.outerHTML;
101 // internet explorer sure does suck.
102 if (h && !h.match(/^[^>]+\svalue\s*=/i)) {
103 v = opt.text;
104 }
105 }
106 names.push(name);
107 values.push(v);
108 }
109 return null;
110 }
111 }
112 if (tagName === "FORM" || tagName === "P" || tagName === "SPAN"
113 || tagName === "DIV"
114 ) {
115 return elem.childNodes;
116 }
117 names.push(name);
118 values.push(elem.value || '');
119 return null;
120 }
121 return elem.childNodes;
122 });
123 return [names, values];
124 },
125
126 /** @id MochiKit.DOM.withDocument */
127 withDocument: function (doc, func) {
128 var self = MochiKit.DOM;
129 var oldDoc = self._document;
130 var rval;
131 try {
132 self._document = doc;
133 rval = func();
134 } catch (e) {
135 self._document = oldDoc;
136 throw e;
137 }
138 self._document = oldDoc;
139 return rval;
140 },
141
142 /** @id MochiKit.DOM.registerDOMConverter */
143 registerDOMConverter: function (name, check, wrap, /* optional */override) {
144 MochiKit.DOM.domConverters.register(name, check, wrap, override);
145 },
146
147 /** @id MochiKit.DOM.coerceToDOM */
148 coerceToDOM: function (node, ctx) {
149 var m = MochiKit.Base;
150 var im = MochiKit.Iter;
151 var self = MochiKit.DOM;
152 if (im) {
153 var iter = im.iter;
154 var repeat = im.repeat;
155 }
156 var map = m.map;
157 var domConverters = self.domConverters;
158 var coerceToDOM = arguments.callee;
159 var NotFound = m.NotFound;
160 while (true) {
161 if (typeof(node) == 'undefined' || node === null) {
162 return null;
163 }
164 // this is a safari childNodes object, avoiding crashes w/ attr
165 // lookup
166 if (typeof(node) == "function" &&
167 typeof(node.length) == "number" &&
168 !(node instanceof Function)) {
169 node = im ? im.list(node) : m.extend(null, node);
170 }
171 if (typeof(node.nodeType) != 'undefined' && node.nodeType > 0) {
172 return node;
173 }
174 if (typeof(node) == 'number' || typeof(node) == 'boolean') {
175 node = node.toString();
176 // FALL THROUGH
177 }
178 if (typeof(node) == 'string') {
179 return self._document.createTextNode(node);
180 }
181 if (typeof(node.__dom__) == 'function') {
182 node = node.__dom__(ctx);
183 continue;
184 }
185 if (typeof(node.dom) == 'function') {
186 node = node.dom(ctx);
187 continue;
188 }
189 if (typeof(node) == 'function') {
190 node = node.apply(ctx, [ctx]);
191 continue;
192 }
193
194 if (im) {
195 // iterable
196 var iterNodes = null;
197 try {
198 iterNodes = iter(node);
199 } catch (e) {
200 // pass
201 }
202 if (iterNodes) {
203 return map(coerceToDOM, iterNodes, repeat(ctx));
204 }
205 } else if (m.isArrayLike(node)) {
206 var func = function (n) { return coerceToDOM(n, ctx); };
207 return map(func, node);
208 }
209
210 // adapter
211 try {
212 node = domConverters.match(node, ctx);
213 continue;
214 } catch (e) {
215 if (e != NotFound) {
216 throw e;
217 }
218 }
219
220 // fallback
221 return self._document.createTextNode(node.toString());
222 }
223 // mozilla warnings aren't too bright
224 return undefined;
225 },
226
227 /** @id MochiKit.DOM.isChildNode */
228 isChildNode: function (node, maybeparent) {
229 var self = MochiKit.DOM;
230 if (typeof(node) == "string") {
231 node = self.getElement(node);
232 }
233 if (typeof(maybeparent) == "string") {
234 maybeparent = self.getElement(maybeparent);
235 }
236 if (typeof(node) == 'undefined' || node === null) {
237 return false;
238 }
239 while (node != null && node !== self._document) {
240 if (node === maybeparent) {
241 return true;
242 }
243 node = node.parentNode;
244 }
245 return false;
246 },
247
248 /** @id MochiKit.DOM.setNodeAttribute */
249 setNodeAttribute: function (node, attr, value) {
250 var o = {};
251 o[attr] = value;
252 try {
253 return MochiKit.DOM.updateNodeAttributes(node, o);
254 } catch (e) {
255 // pass
256 }
257 return null;
258 },
259
260 /** @id MochiKit.DOM.getNodeAttribute */
261 getNodeAttribute: function (node, attr) {
262 var self = MochiKit.DOM;
263 var rename = self.attributeArray.renames[attr];
264 var ignoreValue = self.attributeArray.ignoreAttr[attr];
265 node = self.getElement(node);
266 try {
267 if (rename) {
268 return node[rename];
269 }
270 var value = node.getAttribute(attr);
271 if (value != ignoreValue) {
272 return value;
273 }
274 } catch (e) {
275 // pass
276 }
277 return null;
278 },
279
280 /** @id MochiKit.DOM.removeNodeAttribute */
281 removeNodeAttribute: function (node, attr) {
282 var self = MochiKit.DOM;
283 var rename = self.attributeArray.renames[attr];
284 node = self.getElement(node);
285 try {
286 if (rename) {
287 return node[rename];
288 }
289 return node.removeAttribute(attr);
290 } catch (e) {
291 // pass
292 }
293 return null;
294 },
295
296 /** @id MochiKit.DOM.updateNodeAttributes */
297 updateNodeAttributes: function (node, attrs) {
298 var elem = node;
299 var self = MochiKit.DOM;
300 if (typeof(node) == 'string') {
301 elem = self.getElement(node);
302 }
303 if (attrs) {
304 var updatetree = MochiKit.Base.updatetree;
305 if (self.attributeArray.compliant) {
306 // not IE, good.
307 for (var k in attrs) {
308 var v = attrs[k];
309 if (typeof(v) == 'object' && typeof(elem[k]) == 'object') {
310 if (k == "style" && MochiKit.Style) {
311 MochiKit.Style.setStyle(elem, v);
312 } else {
313 updatetree(elem[k], v);
314 }
315 } else if (k.substring(0, 2) == "on") {
316 if (typeof(v) == "string") {
317 v = new Function(v);
318 }
319 elem[k] = v;
320 } else {
321 elem.setAttribute(k, v);
322 }
323 if (typeof(elem[k]) == "string" && elem[k] != v) {
324 // Also set property for weird attributes (see #302)
325 elem[k] = v;
326 }
327 }
328 } else {
329 // IE is insane in the membrane
330 var renames = self.attributeArray.renames;
331 for (var k in attrs) {
332 v = attrs[k];
333 var renamed = renames[k];
334 if (k == "style" && typeof(v) == "string") {
335 elem.style.cssText = v;
336 } else if (typeof(renamed) == "string") {
337 elem[renamed] = v;
338 } else if (typeof(elem[k]) == 'object'
339 && typeof(v) == 'object') {
340 if (k == "style" && MochiKit.Style) {
341 MochiKit.Style.setStyle(elem, v);
342 } else {
343 updatetree(elem[k], v);
344 }
345 } else if (k.substring(0, 2) == "on") {
346 if (typeof(v) == "string") {
347 v = new Function(v);
348 }
349 elem[k] = v;
350 } else {
351 elem.setAttribute(k, v);
352 }
353 if (typeof(elem[k]) == "string" && elem[k] != v) {
354 // Also set property for weird attributes (see #302)
355 elem[k] = v;
356 }
357 }
358 }
359 }
360 return elem;
361 },
362
363 /** @id MochiKit.DOM.appendChildNodes */
364 appendChildNodes: function (node/*, nodes...*/) {
365 var elem = node;
366 var self = MochiKit.DOM;
367 if (typeof(node) == 'string') {
368 elem = self.getElement(node);
369 }
370 var nodeStack = [
371 self.coerceToDOM(
372 MochiKit.Base.extend(null, arguments, 1),
373 elem
374 )
375 ];
376 var concat = MochiKit.Base.concat;
377 while (nodeStack.length) {
378 var n = nodeStack.shift();
379 if (typeof(n) == 'undefined' || n === null) {
380 // pass
381 } else if (typeof(n.nodeType) == 'number') {
382 elem.appendChild(n);
383 } else {
384 nodeStack = concat(n, nodeStack);
385 }
386 }
387 return elem;
388 },
389
390
391 /** @id MochiKit.DOM.insertSiblingNodesBefore */
392 insertSiblingNodesBefore: function (node/*, nodes...*/) {
393 var elem = node;
394 var self = MochiKit.DOM;
395 if (typeof(node) == 'string') {
396 elem = self.getElement(node);
397 }
398 var nodeStack = [
399 self.coerceToDOM(
400 MochiKit.Base.extend(null, arguments, 1),
401 elem
402 )
403 ];
404 var parentnode = elem.parentNode;
405 var concat = MochiKit.Base.concat;
406 while (nodeStack.length) {
407 var n = nodeStack.shift();
408 if (typeof(n) == 'undefined' || n === null) {
409 // pass
410 } else if (typeof(n.nodeType) == 'number') {
411 parentnode.insertBefore(n, elem);
412 } else {
413 nodeStack = concat(n, nodeStack);
414 }
415 }
416 return parentnode;
417 },
418
419 /** @id MochiKit.DOM.insertSiblingNodesAfter */
420 insertSiblingNodesAfter: function (node/*, nodes...*/) {
421 var elem = node;
422 var self = MochiKit.DOM;
423
424 if (typeof(node) == 'string') {
425 elem = self.getElement(node);
426 }
427 var nodeStack = [
428 self.coerceToDOM(
429 MochiKit.Base.extend(null, arguments, 1),
430 elem
431 )
432 ];
433
434 if (elem.nextSibling) {
435 return self.insertSiblingNodesBefore(elem.nextSibling, nodeStack);
436 }
437 else {
438 return self.appendChildNodes(elem.parentNode, nodeStack);
439 }
440 },
441
442 /** @id MochiKit.DOM.replaceChildNodes */
443 replaceChildNodes: function (node/*, nodes...*/) {
444 var elem = node;
445 var self = MochiKit.DOM;
446 if (typeof(node) == 'string') {
447 elem = self.getElement(node);
448 arguments[0] = elem;
449 }
450 var child;
451 while ((child = elem.firstChild)) {
452 elem.removeChild(child);
453 }
454 if (arguments.length < 2) {
455 return elem;
456 } else {
457 return self.appendChildNodes.apply(this, arguments);
458 }
459 },
460
461 /** @id MochiKit.DOM.createDOM */
462 createDOM: function (name, attrs/*, nodes... */) {
463 var elem;
464 var self = MochiKit.DOM;
465 var m = MochiKit.Base;
466 if (typeof(attrs) == "string" || typeof(attrs) == "number") {
467 var args = m.extend([name, null], arguments, 1);
468 return arguments.callee.apply(this, args);
469 }
470 if (typeof(name) == 'string') {
471 // Internet Explorer is dumb
472 var xhtml = self._xhtml;
473 if (attrs && !self.attributeArray.compliant) {
474 // http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/name_2.asp
475 var contents = "";
476 if ('name' in attrs) {
477 contents += ' name="' + self.escapeHTML(attrs.name) + '"';
478 }
479 if (name == 'input' && 'type' in attrs) {
480 contents += ' type="' + self.escapeHTML(attrs.type) + '"';
481 }
482 if (contents) {
483 name = "<" + name + contents + ">";
484 xhtml = false;
485 }
486 }
487 var d = self._document;
488 if (xhtml && d === document) {
489 elem = d.createElementNS("http://www.w3.org/1999/xhtml", name);
490 } else {
491 elem = d.createElement(name);
492 }
493 } else {
494 elem = name;
495 }
496 if (attrs) {
497 self.updateNodeAttributes(elem, attrs);
498 }
499 if (arguments.length <= 2) {
500 return elem;
501 } else {
502 var args = m.extend([elem], arguments, 2);
503 return self.appendChildNodes.apply(this, args);
504 }
505 },
506
507 /** @id MochiKit.DOM.createDOMFunc */
508 createDOMFunc: function (/* tag, attrs, *nodes */) {
509 var m = MochiKit.Base;
510 return m.partial.apply(
511 this,
512 m.extend([MochiKit.DOM.createDOM], arguments)
513 );
514 },
515
516 /** @id MochiKit.DOM.removeElement */
517 removeElement: function (elem) {
518 var self = MochiKit.DOM;
519 if (typeof(elem) == "string") {
520 elem = self.getElement(elem);
521 }
522 var e = self.coerceToDOM(elem);
523 e.parentNode.removeChild(e);
524 return e;
525 },
526
527 /** @id MochiKit.DOM.swapDOM */
528 swapDOM: function (dest, src) {
529 var self = MochiKit.DOM;
530 dest = self.getElement(dest);
531 var parent = dest.parentNode;
532 if (src) {
533 if (typeof(src) == "string") {
534 src = self.getElement(src);
535 }
536 src = self.coerceToDOM(src, parent);
537 parent.replaceChild(src, dest);
538 } else {
539 parent.removeChild(dest);
540 }
541 return src;
542 },
543
544 /** @id MochiKit.DOM.getElement */
545 getElement: function (id) {
546 var self = MochiKit.DOM;
547 if (arguments.length == 1) {
548 return ((typeof(id) == "string") ?
549 self._document.getElementById(id) : id);
550 } else {
551 return MochiKit.Base.map(self.getElement, arguments);
552 }
553 },
554
555 /** @id MochiKit.DOM.getElementsByTagAndClassName */
556 getElementsByTagAndClassName: function (tagName, className,
557 /* optional */parent) {
558 var self = MochiKit.DOM;
559 if (typeof(tagName) == 'undefined' || tagName === null) {
560 tagName = '*';
561 }
562 if (typeof(parent) == 'undefined' || parent === null) {
563 parent = self._document;
564 }
565 parent = self.getElement(parent);
566 if (parent == null) {
567 return [];
568 }
569 var children = (parent.getElementsByTagName(tagName)
570 || self._document.all);
571 if (typeof(className) == 'undefined' || className === null) {
572 return MochiKit.Base.extend(null, children);
573 }
574
575 var elements = [];
576 for (var i = 0; i < children.length; i++) {
577 var child = children[i];
578 var cls = child.className;
579 if (typeof(cls) != "string") {
580 cls = child.getAttribute("class");
581 }
582 if (typeof(cls) == "string") {
583 var classNames = cls.split(' ');
584 for (var j = 0; j < classNames.length; j++) {
585 if (classNames[j] == className) {
586 elements.push(child);
587 break;
588 }
589 }
590 }
591 }
592
593 return elements;
594 },
595
596 _newCallStack: function (path, once) {
597 var rval = function () {
598 var callStack = arguments.callee.callStack;
599 for (var i = 0; i < callStack.length; i++) {
600 if (callStack[i].apply(this, arguments) === false) {
601 break;
602 }
603 }
604 if (once) {
605 try {
606 this[path] = null;
607 } catch (e) {
608 // pass
609 }
610 }
611 };
612 rval.callStack = [];
613 return rval;
614 },
615
616 /** @id MochiKit.DOM.addToCallStack */
617 addToCallStack: function (target, path, func, once) {
618 var self = MochiKit.DOM;
619 var existing = target[path];
620 var regfunc = existing;
621 if (!(typeof(existing) == 'function'
622 && typeof(existing.callStack) == "object"
623 && existing.callStack !== null)) {
624 regfunc = self._newCallStack(path, once);
625 if (typeof(existing) == 'function') {
626 regfunc.callStack.push(existing);
627 }
628 target[path] = regfunc;
629 }
630 regfunc.callStack.push(func);
631 },
632
633 /** @id MochiKit.DOM.addLoadEvent */
634 addLoadEvent: function (func) {
635 var self = MochiKit.DOM;
636 self.addToCallStack(self._window, "onload", func, true);
637
638 },
639
640 /** @id MochiKit.DOM.focusOnLoad */
641 focusOnLoad: function (element) {
642 var self = MochiKit.DOM;
643 self.addLoadEvent(function () {
644 element = self.getElement(element);
645 if (element) {
646 element.focus();
647 }
648 });
649 },
650
651 /** @id MochiKit.DOM.setElementClass */
652 setElementClass: function (element, className) {
653 var self = MochiKit.DOM;
654 var obj = self.getElement(element);
655 if (self.attributeArray.compliant) {
656 obj.setAttribute("class", className);
657 } else {
658 obj.setAttribute("className", className);
659 }
660 },
661
662 /** @id MochiKit.DOM.toggleElementClass */
663 toggleElementClass: function (className/*, element... */) {
664 var self = MochiKit.DOM;
665 for (var i = 1; i < arguments.length; i++) {
666 var obj = self.getElement(arguments[i]);
667 if (!self.addElementClass(obj, className)) {
668 self.removeElementClass(obj, className);
669 }
670 }
671 },
672
673 /** @id MochiKit.DOM.addElementClass */
674 addElementClass: function (element, className) {
675 var self = MochiKit.DOM;
676 var obj = self.getElement(element);
677 var cls = obj.className;
678 if (typeof(cls) != "string") {
679 cls = obj.getAttribute("class");
680 }
681 // trivial case, no className yet
682 if (typeof(cls) != "string" || cls.length === 0) {
683 self.setElementClass(obj, className);
684 return true;
685 }
686 // the other trivial case, already set as the only class
687 if (cls == className) {
688 return false;
689 }
690 var classes = cls.split(" ");
691 for (var i = 0; i < classes.length; i++) {
692 // already present
693 if (classes[i] == className) {
694 return false;
695 }
696 }
697 // append class
698 self.setElementClass(obj, cls + " " + className);
699 return true;
700 },
701
702 /** @id MochiKit.DOM.removeElementClass */
703 removeElementClass: function (element, className) {
704 var self = MochiKit.DOM;
705 var obj = self.getElement(element);
706 var cls = obj.className;
707 if (typeof(cls) != "string") {
708 cls = obj.getAttribute("class");
709 }
710 // trivial case, no className yet
711 if (typeof(cls) != "string" || cls.length === 0) {
712 return false;
713 }
714 // other trivial case, set only to className
715 if (cls == className) {
716 self.setElementClass(obj, "");
717 return true;
718 }
719 var classes = cls.split(" ");
720 for (var i = 0; i < classes.length; i++) {
721 // already present
722 if (classes[i] == className) {
723 // only check sane case where the class is used once
724 classes.splice(i, 1);
725 self.setElementClass(obj, classes.join(" "));
726 return true;
727 }
728 }
729 // not found
730 return false;
731 },
732
733 /** @id MochiKit.DOM.swapElementClass */
734 swapElementClass: function (element, fromClass, toClass) {
735 var obj = MochiKit.DOM.getElement(element);
736 var res = MochiKit.DOM.removeElementClass(obj, fromClass);
737 if (res) {
738 MochiKit.DOM.addElementClass(obj, toClass);
739 }
740 return res;
741 },
742
743 /** @id MochiKit.DOM.hasElementClass */
744 hasElementClass: function (element, className/*...*/) {
745 var obj = MochiKit.DOM.getElement(element);
746 if (obj == null) {
747 return false;
748 }
749 var cls = obj.className;
750 if (typeof(cls) != "string" && typeof(obj.getAttribute) == "function") {
751 cls = obj.getAttribute("class");
752 }
753 if (typeof(cls) != "string") {
754 return false;
755 }
756 var classes = cls.split(" ");
757 for (var i = 1; i < arguments.length; i++) {
758 var good = false;
759 for (var j = 0; j < classes.length; j++) {
760 if (classes[j] == arguments[i]) {
761 good = true;
762 break;
763 }
764 }
765 if (!good) {
766 return false;
767 }
768 }
769 return true;
770 },
771
772 /** @id MochiKit.DOM.escapeHTML */
773 escapeHTML: function (s) {
774 return s.replace(/&/g, "&amp;"
775 ).replace(/"/g, "&quot;"
776 ).replace(/</g, "&lt;"
777 ).replace(/>/g, "&gt;");
778 },
779
780 /** @id MochiKit.DOM.toHTML */
781 toHTML: function (dom) {
782 return MochiKit.DOM.emitHTML(dom).join("");
783 },
784
785 /** @id MochiKit.DOM.emitHTML */
786 emitHTML: function (dom, /* optional */lst) {
787 if (typeof(lst) == 'undefined' || lst === null) {
788 lst = [];
789 }
790 // queue is the call stack, we're doing this non-recursively
791 var queue = [dom];
792 var self = MochiKit.DOM;
793 var escapeHTML = self.escapeHTML;
794 var attributeArray = self.attributeArray;
795 while (queue.length) {
796 dom = queue.pop();
797 if (typeof(dom) == 'string') {
798 lst.push(dom);
799 } else if (dom.nodeType == 1) {
800 // we're not using higher order stuff here
801 // because safari has heisenbugs.. argh.
802 //
803 // I think it might have something to do with
804 // garbage collection and function calls.
805 lst.push('<' + dom.tagName.toLowerCase());
806 var attributes = [];
807 var domAttr = attributeArray(dom);
808 for (var i = 0; i < domAttr.length; i++) {
809 var a = domAttr[i];
810 attributes.push([
811 " ",
812 a.name,
813 '="',
814 escapeHTML(a.value),
815 '"'
816 ]);
817 }
818 attributes.sort();
819 for (i = 0; i < attributes.length; i++) {
820 var attrs = attributes[i];
821 for (var j = 0; j < attrs.length; j++) {
822 lst.push(attrs[j]);
823 }
824 }
825 if (dom.hasChildNodes()) {
826 lst.push(">");
827 // queue is the FILO call stack, so we put the close tag
828 // on first
829 queue.push("</" + dom.tagName.toLowerCase() + ">");
830 var cnodes = dom.childNodes;
831 for (i = cnodes.length - 1; i >= 0; i--) {
832 queue.push(cnodes[i]);
833 }
834 } else {
835 lst.push('/>');
836 }
837 } else if (dom.nodeType == 3) {
838 lst.push(escapeHTML(dom.nodeValue));
839 }
840 }
841 return lst;
842 },
843
844 /** @id MochiKit.DOM.scrapeText */
845 scrapeText: function (node, /* optional */asArray) {
846 var rval = [];
847 (function (node) {
848 var cn = node.childNodes;
849 if (cn) {
850 for (var i = 0; i < cn.length; i++) {
851 arguments.callee.call(this, cn[i]);
852 }
853 }
854 var nodeValue = node.nodeValue;
855 if (typeof(nodeValue) == 'string') {
856 rval.push(nodeValue);
857 }
858 })(MochiKit.DOM.getElement(node));
859 if (asArray) {
860 return rval;
861 } else {
862 return rval.join("");
863 }
864 },
865
866 /** @id MochiKit.DOM.removeEmptyTextNodes */
867 removeEmptyTextNodes: function (element) {
868 element = MochiKit.DOM.getElement(element);
869 for (var i = 0; i < element.childNodes.length; i++) {
870 var node = element.childNodes[i];
871 if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
872 node.parentNode.removeChild(node);
873 }
874 }
875 },
876
877 /** @id MochiKit.DOM.getFirstElementByTagAndClassName */
878 getFirstElementByTagAndClassName: function (tagName, className,
879 /* optional */parent) {
880 var self = MochiKit.DOM;
881 if (typeof(tagName) == 'undefined' || tagName === null) {
882 tagName = '*';
883 }
884 if (typeof(parent) == 'undefined' || parent === null) {
885 parent = self._document;
886 }
887 parent = self.getElement(parent);
888 if (parent == null) {
889 return null;
890 }
891 var children = (parent.getElementsByTagName(tagName)
892 || self._document.all);
893 if (children.length <= 0) {
894 return null;
895 } else if (typeof(className) == 'undefined' || className === null) {
896 return children[0];
897 }
898
899 for (var i = 0; i < children.length; i++) {
900 var child = children[i];
901 var cls = child.className;
902 if (typeof(cls) != "string") {
903 cls = child.getAttribute("class");
904 }
905 if (typeof(cls) == "string") {
906 var classNames = cls.split(' ');
907 for (var j = 0; j < classNames.length; j++) {
908 if (classNames[j] == className) {
909 return child;
910 }
911 }
912 }
913 }
914 return null;
915 },
916
917 /** @id MochiKit.DOM.getFirstParentByTagAndClassName */
918 getFirstParentByTagAndClassName: function (elem, tagName, className) {
919 var self = MochiKit.DOM;
920 elem = self.getElement(elem);
921 if (typeof(tagName) == 'undefined' || tagName === null) {
922 tagName = '*';
923 } else {
924 tagName = tagName.toUpperCase();
925 }
926 if (typeof(className) == 'undefined' || className === null) {
927 className = null;
928 }
929 if (elem) {
930 elem = elem.parentNode;
931 }
932 while (elem && elem.tagName) {
933 var curTagName = elem.tagName.toUpperCase();
934 if ((tagName === '*' || tagName == curTagName) &&
935 (className === null || self.hasElementClass(elem, className))) {
936 return elem;
937 }
938 elem = elem.parentNode;
939 }
940 return null;
941 },
942
943 __new__: function (win) {
944
945 var m = MochiKit.Base;
946 if (typeof(document) != "undefined") {
947 this._document = document;
948 var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
949 this._xhtml = (document.documentElement &&
950 document.createElementNS &&
951 document.documentElement.namespaceURI === kXULNSURI);
952 } else if (MochiKit.MockDOM) {
953 this._document = MochiKit.MockDOM.document;
954 }
955 this._window = win;
956
957 this.domConverters = new m.AdapterRegistry();
958
959 var __tmpElement = this._document.createElement("span");
960 var attributeArray;
961 if (__tmpElement && __tmpElement.attributes &&
962 __tmpElement.attributes.length > 0) {
963 // for braindead browsers (IE) that insert extra junk
964 var filter = m.filter;
965 attributeArray = function (node) {
966 /***
967
968 Return an array of attributes for a given node,
969 filtering out attributes that don't belong for
970 that are inserted by "Certain Browsers".
971
972 ***/
973 return filter(attributeArray.ignoreAttrFilter, node.attributes);
974 };
975 attributeArray.ignoreAttr = {};
976 var attrs = __tmpElement.attributes;
977 var ignoreAttr = attributeArray.ignoreAttr;
978 for (var i = 0; i < attrs.length; i++) {
979 var a = attrs[i];
980 ignoreAttr[a.name] = a.value;
981 }
982 attributeArray.ignoreAttrFilter = function (a) {
983 return (attributeArray.ignoreAttr[a.name] != a.value);
984 };
985 attributeArray.compliant = false;
986 attributeArray.renames = {
987 "class": "className",
988 "checked": "defaultChecked",
989 "usemap": "useMap",
990 "for": "htmlFor",
991 "readonly": "readOnly",
992 "colspan": "colSpan",
993 "bgcolor": "bgColor",
994 "cellspacing": "cellSpacing",
995 "cellpadding": "cellPadding"
996 };
997 } else {
998 attributeArray = function (node) {
999 return node.attributes;
1000 };
1001 attributeArray.compliant = true;
1002 attributeArray.ignoreAttr = {};
1003 attributeArray.renames = {};
1004 }
1005 attributeArray.__export__ = false;
1006 this.attributeArray = attributeArray;
1007
1008 // Backwards compatibility aliases
1009 /** @id MochiKit.DOM.computedStyle */
1010 m._deprecated(this, 'computedStyle', 'MochiKit.Style.getStyle', '1.4');
1011 /** @id MochiKit.DOM.elementDimensions */
1012 m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.4');
1013 /** @id MochiKit.DOM.elementPosition */
1014 m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.4');
1015 /** @id MochiKit.DOM.getViewportDimensions */
1016 m._deprecated(this, 'getViewportDimensions', 'MochiKit.Style.getViewportDimensions', '1.4');
1017 /** @id MochiKit.DOM.hideElement */
1018 m._deprecated(this, 'hideElement', 'MochiKit.Style.hideElement', '1.4');
1019 /** @id MochiKit.DOM.makeClipping */
1020 m._deprecated(this, 'makeClipping', 'MochiKit.Style.makeClipping', '1.4.1');
1021 /** @id MochiKit.DOM.makePositioned */
1022 m._deprecated(this, 'makePositioned', 'MochiKit.Style.makePositioned', '1.4.1');
1023 /** @id MochiKit.DOM.setElementDimensions */
1024 m._deprecated(this, 'setElementDimensions', 'MochiKit.Style.setElementDimensions', '1.4');
1025 /** @id MochiKit.DOM.setElementPosition */
1026 m._deprecated(this, 'setElementPosition', 'MochiKit.Style.setElementPosition', '1.4');
1027 /** @id MochiKit.DOM.setDisplayForElement */
1028 m._deprecated(this, 'setDisplayForElement', 'MochiKit.Style.setDisplayForElement', '1.4');
1029 /** @id MochiKit.DOM.setOpacity */
1030 m._deprecated(this, 'setOpacity', 'MochiKit.Style.setOpacity', '1.4');
1031 /** @id MochiKit.DOM.showElement */
1032 m._deprecated(this, 'showElement', 'MochiKit.Style.showElement', '1.4');
1033 /** @id MochiKit.DOM.undoClipping */
1034 m._deprecated(this, 'undoClipping', 'MochiKit.Style.undoClipping', '1.4.1');
1035 /** @id MochiKit.DOM.undoPositioned */
1036 m._deprecated(this, 'undoPositioned', 'MochiKit.Style.undoPositioned', '1.4.1');
1037 /** @id MochiKit.DOM.Coordinates */
1038 m._deprecated(this, 'Coordinates', 'MochiKit.Style.Coordinates', '1.4');
1039 /** @id MochiKit.DOM.Dimensions */
1040 m._deprecated(this, 'Dimensions', 'MochiKit.Style.Dimensions', '1.4');
1041
1042 // shorthand for createDOM syntax
1043 var createDOMFunc = this.createDOMFunc;
1044 /** @id MochiKit.DOM.UL */
1045 this.UL = createDOMFunc("ul");
1046 /** @id MochiKit.DOM.OL */
1047 this.OL = createDOMFunc("ol");
1048 /** @id MochiKit.DOM.LI */
1049 this.LI = createDOMFunc("li");
1050 /** @id MochiKit.DOM.DL */
1051 this.DL = createDOMFunc("dl");
1052 /** @id MochiKit.DOM.DT */
1053 this.DT = createDOMFunc("dt");
1054 /** @id MochiKit.DOM.DD */
1055 this.DD = createDOMFunc("dd");
1056 /** @id MochiKit.DOM.TD */
1057 this.TD = createDOMFunc("td");
1058 /** @id MochiKit.DOM.TR */
1059 this.TR = createDOMFunc("tr");
1060 /** @id MochiKit.DOM.TBODY */
1061 this.TBODY = createDOMFunc("tbody");
1062 /** @id MochiKit.DOM.THEAD */
1063 this.THEAD = createDOMFunc("thead");
1064 /** @id MochiKit.DOM.TFOOT */
1065 this.TFOOT = createDOMFunc("tfoot");
1066 /** @id MochiKit.DOM.TABLE */
1067 this.TABLE = createDOMFunc("table");
1068 /** @id MochiKit.DOM.TH */
1069 this.TH = createDOMFunc("th");
1070 /** @id MochiKit.DOM.INPUT */
1071 this.INPUT = createDOMFunc("input");
1072 /** @id MochiKit.DOM.SPAN */
1073 this.SPAN = createDOMFunc("span");
1074 /** @id MochiKit.DOM.A */
1075 this.A = createDOMFunc("a");
1076 /** @id MochiKit.DOM.DIV */
1077 this.DIV = createDOMFunc("div");
1078 /** @id MochiKit.DOM.IMG */
1079 this.IMG = createDOMFunc("img");
1080 /** @id MochiKit.DOM.BUTTON */
1081 this.BUTTON = createDOMFunc("button");
1082 /** @id MochiKit.DOM.TT */
1083 this.TT = createDOMFunc("tt");
1084 /** @id MochiKit.DOM.PRE */
1085 this.PRE = createDOMFunc("pre");
1086 /** @id MochiKit.DOM.H1 */
1087 this.H1 = createDOMFunc("h1");
1088 /** @id MochiKit.DOM.H2 */
1089 this.H2 = createDOMFunc("h2");
1090 /** @id MochiKit.DOM.H3 */
1091 this.H3 = createDOMFunc("h3");
1092 /** @id MochiKit.DOM.H4 */
1093 this.H4 = createDOMFunc("h4");
1094 /** @id MochiKit.DOM.H5 */
1095 this.H5 = createDOMFunc("h5");
1096 /** @id MochiKit.DOM.H6 */
1097 this.H6 = createDOMFunc("h6");
1098 /** @id MochiKit.DOM.BR */
1099 this.BR = createDOMFunc("br");
1100 /** @id MochiKit.DOM.HR */
1101 this.HR = createDOMFunc("hr");
1102 /** @id MochiKit.DOM.LABEL */
1103 this.LABEL = createDOMFunc("label");
1104 /** @id MochiKit.DOM.TEXTAREA */
1105 this.TEXTAREA = createDOMFunc("textarea");
1106 /** @id MochiKit.DOM.FORM */
1107 this.FORM = createDOMFunc("form");
1108 /** @id MochiKit.DOM.P */
1109 this.P = createDOMFunc("p");
1110 /** @id MochiKit.DOM.SELECT */
1111 this.SELECT = createDOMFunc("select");
1112 /** @id MochiKit.DOM.OPTION */
1113 this.OPTION = createDOMFunc("option");
1114 /** @id MochiKit.DOM.OPTGROUP */
1115 this.OPTGROUP = createDOMFunc("optgroup");
1116 /** @id MochiKit.DOM.LEGEND */
1117 this.LEGEND = createDOMFunc("legend");
1118 /** @id MochiKit.DOM.FIELDSET */
1119 this.FIELDSET = createDOMFunc("fieldset");
1120 /** @id MochiKit.DOM.STRONG */
1121 this.STRONG = createDOMFunc("strong");
1122 /** @id MochiKit.DOM.CANVAS */
1123 this.CANVAS = createDOMFunc("canvas");
1124
1125 /** @id MochiKit.DOM.$ */
1126 this.$ = this.getElement;
1127
1128 m.nameFunctions(this);
1129
1130 }
1131});
1132
1133
1134MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window));
1135
1136//
1137// XXX: Internet Explorer blows
1138//
1139if (MochiKit.__export__) {
1140 withWindow = MochiKit.DOM.withWindow;
1141 withDocument = MochiKit.DOM.withDocument;
1142}
1143
1144MochiKit.Base._exportSymbols(this, MochiKit.DOM);
diff --git a/frontend/gamma/js/MochiKit/DateTime.js b/frontend/gamma/js/MochiKit/DateTime.js
new file mode 100644
index 0000000..c7b2d25
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/DateTime.js
@@ -0,0 +1,173 @@
1/***
2
3MochiKit.DateTime 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('DateTime', '1.5', ['Base']);
12
13/** @id MochiKit.DateTime.isoDate */
14MochiKit.DateTime.isoDate = function (str) {
15 str = str + "";
16 if (typeof(str) != "string" || str.length === 0) {
17 return null;
18 }
19 var iso = str.split('-');
20 if (iso.length === 0) {
21 return null;
22 }
23 var date = new Date(iso[0], iso[1] - 1, iso[2]);
24 date.setFullYear(iso[0]);
25 date.setMonth(iso[1] - 1);
26 date.setDate(iso[2]);
27 return date;
28};
29
30MochiKit.DateTime._isoRegexp = /(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/;
31
32/** @id MochiKit.DateTime.isoTimestamp */
33MochiKit.DateTime.isoTimestamp = function (str) {
34 str = str + "";
35 if (typeof(str) != "string" || str.length === 0) {
36 return null;
37 }
38 var res = str.match(MochiKit.DateTime._isoRegexp);
39 if (typeof(res) == "undefined" || res === null) {
40 return null;
41 }
42 var year, month, day, hour, min, sec, msec;
43 year = parseInt(res[1], 10);
44 if (typeof(res[2]) == "undefined" || res[2] === '') {
45 return new Date(year);
46 }
47 month = parseInt(res[2], 10) - 1;
48 day = parseInt(res[3], 10);
49 if (typeof(res[4]) == "undefined" || res[4] === '') {
50 return new Date(year, month, day);
51 }
52 hour = parseInt(res[4], 10);
53 min = parseInt(res[5], 10);
54 sec = (typeof(res[6]) != "undefined" && res[6] !== '') ? parseInt(res[6], 10) : 0;
55 if (typeof(res[7]) != "undefined" && res[7] !== '') {
56 msec = Math.round(1000.0 * parseFloat("0." + res[7]));
57 } else {
58 msec = 0;
59 }
60 if ((typeof(res[8]) == "undefined" || res[8] === '') && (typeof(res[9]) == "undefined" || res[9] === '')) {
61 return new Date(year, month, day, hour, min, sec, msec);
62 }
63 var ofs;
64 if (typeof(res[9]) != "undefined" && res[9] !== '') {
65 ofs = parseInt(res[10], 10) * 3600000;
66 if (typeof(res[11]) != "undefined" && res[11] !== '') {
67 ofs += parseInt(res[11], 10) * 60000;
68 }
69 if (res[9] == "-") {
70 ofs = -ofs;
71 }
72 } else {
73 ofs = 0;
74 }
75 return new Date(Date.UTC(year, month, day, hour, min, sec, msec) - ofs);
76};
77
78/** @id MochiKit.DateTime.toISOTime */
79MochiKit.DateTime.toISOTime = function (date, realISO/* = false */) {
80 if (typeof(date) == "undefined" || date === null) {
81 return null;
82 }
83 var hh = date.getHours();
84 var mm = date.getMinutes();
85 var ss = date.getSeconds();
86 var lst = [
87 ((realISO && (hh < 10)) ? "0" + hh : hh),
88 ((mm < 10) ? "0" + mm : mm),
89 ((ss < 10) ? "0" + ss : ss)
90 ];
91 return lst.join(":");
92};
93
94/** @id MochiKit.DateTime.toISOTimeStamp */
95MochiKit.DateTime.toISOTimestamp = function (date, realISO/* = false*/) {
96 if (typeof(date) == "undefined" || date === null) {
97 return null;
98 }
99 var sep = realISO ? "T" : " ";
100 var foot = realISO ? "Z" : "";
101 if (realISO) {
102 date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));
103 }
104 return MochiKit.DateTime.toISODate(date) + sep + MochiKit.DateTime.toISOTime(date, realISO) + foot;
105};
106
107/** @id MochiKit.DateTime.toISODate */
108MochiKit.DateTime.toISODate = function (date) {
109 if (typeof(date) == "undefined" || date === null) {
110 return null;
111 }
112 var _padTwo = MochiKit.DateTime._padTwo;
113 var _padFour = MochiKit.DateTime._padFour;
114 return [
115 _padFour(date.getFullYear()),
116 _padTwo(date.getMonth() + 1),
117 _padTwo(date.getDate())
118 ].join("-");
119};
120
121/** @id MochiKit.DateTime.americanDate */
122MochiKit.DateTime.americanDate = function (d) {
123 d = d + "";
124 if (typeof(d) != "string" || d.length === 0) {
125 return null;
126 }
127 var a = d.split('/');
128 return new Date(a[2], a[0] - 1, a[1]);
129};
130
131MochiKit.DateTime._padTwo = function (n) {
132 return (n > 9) ? n : "0" + n;
133};
134
135MochiKit.DateTime._padFour = function(n) {
136 switch(n.toString().length) {
137 case 1: return "000" + n; break;
138 case 2: return "00" + n; break;
139 case 3: return "0" + n; break;
140 case 4:
141 default:
142 return n;
143 }
144};
145
146/** @id MochiKit.DateTime.toPaddedAmericanDate */
147MochiKit.DateTime.toPaddedAmericanDate = function (d) {
148 if (typeof(d) == "undefined" || d === null) {
149 return null;
150 }
151 var _padTwo = MochiKit.DateTime._padTwo;
152 return [
153 _padTwo(d.getMonth() + 1),
154 _padTwo(d.getDate()),
155 d.getFullYear()
156 ].join('/');
157};
158
159/** @id MochiKit.DateTime.toAmericanDate */
160MochiKit.DateTime.toAmericanDate = function (d) {
161 if (typeof(d) == "undefined" || d === null) {
162 return null;
163 }
164 return [d.getMonth() + 1, d.getDate(), d.getFullYear()].join('/');
165};
166
167MochiKit.DateTime.__new__ = function () {
168 MochiKit.Base.nameFunctions(this);
169};
170
171MochiKit.DateTime.__new__();
172
173MochiKit.Base._exportSymbols(this, MochiKit.DateTime);
diff --git a/frontend/gamma/js/MochiKit/DragAndDrop.js b/frontend/gamma/js/MochiKit/DragAndDrop.js
new file mode 100644
index 0000000..62777c5
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/DragAndDrop.js
@@ -0,0 +1,766 @@
1/***
2MochiKit.DragAndDrop 1.5
3
4See <http://mochikit.com/> for documentation, downloads, license, etc.
5
6Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
7 Mochi-ized By Thomas Herve (_firstname_@nimail.org)
8
9***/
10
11MochiKit.Base._module('DragAndDrop', '1.5', ['Base', 'Iter', 'DOM', 'Signal', 'Visual', 'Position']);
12
13MochiKit.DragAndDrop.Droppables = {
14 /***
15
16 Manage all droppables. Shouldn't be used, use the Droppable object instead.
17
18 ***/
19 drops: [],
20
21 remove: function (element) {
22 this.drops = MochiKit.Base.filter(function (d) {
23 return d.element != MochiKit.DOM.getElement(element);
24 }, this.drops);
25 },
26
27 register: function (drop) {
28 this.drops.push(drop);
29 },
30
31 unregister: function (drop) {
32 this.drops = MochiKit.Base.filter(function (d) {
33 return d != drop;
34 }, this.drops);
35 },
36
37 prepare: function (element) {
38 MochiKit.Base.map(function (drop) {
39 if (drop.isAccepted(element)) {
40 if (drop.options.activeclass) {
41 MochiKit.DOM.addElementClass(drop.element,
42 drop.options.activeclass);
43 }
44 drop.options.onactive(drop.element, element);
45 }
46 }, this.drops);
47 },
48
49 findDeepestChild: function (drops) {
50 var deepest = drops[0];
51
52 for (var i = 1; i < drops.length; ++i) {
53 if (MochiKit.DOM.isChildNode(drops[i].element, deepest.element)) {
54 deepest = drops[i];
55 }
56 }
57 return deepest;
58 },
59
60 show: function (point, element) {
61 if (!this.drops.length) {
62 return;
63 }
64 var affected = [];
65
66 if (this.last_active) {
67 this.last_active.deactivate();
68 }
69 MochiKit.Iter.forEach(this.drops, function (drop) {
70 if (drop.isAffected(point, element)) {
71 affected.push(drop);
72 }
73 });
74 if (affected.length > 0) {
75 var drop = this.findDeepestChild(affected);
76 MochiKit.Position.within(drop.element, point.page.x, point.page.y);
77 drop.options.onhover(element, drop.element,
78 MochiKit.Position.overlap(drop.options.overlap, drop.element));
79 drop.activate();
80 }
81 },
82
83 fire: function (event, element) {
84 if (!this.last_active) {
85 return;
86 }
87 MochiKit.Position.prepare();
88
89 if (this.last_active.isAffected(event.mouse(), element)) {
90 this.last_active.options.ondrop(element,
91 this.last_active.element, event);
92 }
93 },
94
95 reset: function (element) {
96 MochiKit.Base.map(function (drop) {
97 if (drop.options.activeclass) {
98 MochiKit.DOM.removeElementClass(drop.element,
99 drop.options.activeclass);
100 }
101 drop.options.ondesactive(drop.element, element);
102 }, this.drops);
103 if (this.last_active) {
104 this.last_active.deactivate();
105 }
106 }
107};
108
109/** @id MochiKit.DragAndDrop.Droppable */
110MochiKit.DragAndDrop.Droppable = function (element, options) {
111 var cls = arguments.callee;
112 if (!(this instanceof cls)) {
113 return new cls(element, options);
114 }
115 this.__init__(element, options);
116};
117
118MochiKit.DragAndDrop.Droppable.prototype = {
119 /***
120
121 A droppable object. Simple use is to create giving an element:
122
123 new MochiKit.DragAndDrop.Droppable('myelement');
124
125 Generally you'll want to define the 'ondrop' function and maybe the
126 'accept' option to filter draggables.
127
128 ***/
129 __class__: MochiKit.DragAndDrop.Droppable,
130
131 __init__: function (element, /* optional */options) {
132 var d = MochiKit.DOM;
133 var b = MochiKit.Base;
134 this.element = d.getElement(element);
135 this.options = b.update({
136
137 /** @id MochiKit.DragAndDrop.greedy */
138 greedy: true,
139
140 /** @id MochiKit.DragAndDrop.hoverclass */
141 hoverclass: null,
142
143 /** @id MochiKit.DragAndDrop.activeclass */
144 activeclass: null,
145
146 /** @id MochiKit.DragAndDrop.hoverfunc */
147 hoverfunc: b.noop,
148
149 /** @id MochiKit.DragAndDrop.accept */
150 accept: null,
151
152 /** @id MochiKit.DragAndDrop.onactive */
153 onactive: b.noop,
154
155 /** @id MochiKit.DragAndDrop.ondesactive */
156 ondesactive: b.noop,
157
158 /** @id MochiKit.DragAndDrop.onhover */
159 onhover: b.noop,
160
161 /** @id MochiKit.DragAndDrop.ondrop */
162 ondrop: b.noop,
163
164 /** @id MochiKit.DragAndDrop.containment */
165 containment: [],
166 tree: false
167 }, options);
168
169 // cache containers
170 this.options._containers = [];
171 b.map(MochiKit.Base.bind(function (c) {
172 this.options._containers.push(d.getElement(c));
173 }, this), this.options.containment);
174
175 MochiKit.Style.makePositioned(this.element); // fix IE
176
177 MochiKit.DragAndDrop.Droppables.register(this);
178 },
179
180 /** @id MochiKit.DragAndDrop.isContained */
181 isContained: function (element) {
182 if (this.options._containers.length) {
183 var containmentNode;
184 if (this.options.tree) {
185 containmentNode = element.treeNode;
186 } else {
187 containmentNode = element.parentNode;
188 }
189 return MochiKit.Iter.some(this.options._containers, function (c) {
190 return containmentNode == c;
191 });
192 } else {
193 return true;
194 }
195 },
196
197 /** @id MochiKit.DragAndDrop.isAccepted */
198 isAccepted: function (element) {
199 return ((!this.options.accept) || MochiKit.Iter.some(
200 this.options.accept, function (c) {
201 return MochiKit.DOM.hasElementClass(element, c);
202 }));
203 },
204
205 /** @id MochiKit.DragAndDrop.isAffected */
206 isAffected: function (point, element) {
207 return ((this.element != element) &&
208 this.isContained(element) &&
209 this.isAccepted(element) &&
210 MochiKit.Position.within(this.element, point.page.x,
211 point.page.y));
212 },
213
214 /** @id MochiKit.DragAndDrop.deactivate */
215 deactivate: function () {
216 /***
217
218 A droppable is deactivate when a draggable has been over it and left.
219
220 ***/
221 if (this.options.hoverclass) {
222 MochiKit.DOM.removeElementClass(this.element,
223 this.options.hoverclass);
224 }
225 this.options.hoverfunc(this.element, false);
226 MochiKit.DragAndDrop.Droppables.last_active = null;
227 },
228
229 /** @id MochiKit.DragAndDrop.activate */
230 activate: function () {
231 /***
232
233 A droppable is active when a draggable is over it.
234
235 ***/
236 if (this.options.hoverclass) {
237 MochiKit.DOM.addElementClass(this.element, this.options.hoverclass);
238 }
239 this.options.hoverfunc(this.element, true);
240 MochiKit.DragAndDrop.Droppables.last_active = this;
241 },
242
243 /** @id MochiKit.DragAndDrop.destroy */
244 destroy: function () {
245 /***
246
247 Delete this droppable.
248
249 ***/
250 MochiKit.DragAndDrop.Droppables.unregister(this);
251 },
252
253 /** @id MochiKit.DragAndDrop.repr */
254 repr: function () {
255 return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]";
256 }
257};
258
259MochiKit.DragAndDrop.Draggables = {
260 /***
261
262 Manage draggables elements. Not intended to direct use.
263
264 ***/
265 drags: [],
266
267 register: function (draggable) {
268 if (this.drags.length === 0) {
269 var conn = MochiKit.Signal.connect;
270 this.eventMouseUp = conn(document, 'onmouseup', this, this.endDrag);
271 this.eventMouseMove = conn(document, 'onmousemove', this,
272 this.updateDrag);
273 this.eventKeypress = conn(document, 'onkeypress', this,
274 this.keyPress);
275 }
276 this.drags.push(draggable);
277 },
278
279 unregister: function (draggable) {
280 this.drags = MochiKit.Base.filter(function (d) {
281 return d != draggable;
282 }, this.drags);
283 if (this.drags.length === 0) {
284 var disc = MochiKit.Signal.disconnect;
285 disc(this.eventMouseUp);
286 disc(this.eventMouseMove);
287 disc(this.eventKeypress);
288 }
289 },
290
291 activate: function (draggable) {
292 // allows keypress events if window is not currently focused
293 // fails for Safari
294 window.focus();
295 this.activeDraggable = draggable;
296 },
297
298 deactivate: function () {
299 this.activeDraggable = null;
300 },
301
302 updateDrag: function (event) {
303 if (!this.activeDraggable) {
304 return;
305 }
306 var pointer = event.mouse();
307 // Mozilla-based browsers fire successive mousemove events with
308 // the same coordinates, prevent needless redrawing (moz bug?)
309 if (this._lastPointer && (MochiKit.Base.repr(this._lastPointer.page) ==
310 MochiKit.Base.repr(pointer.page))) {
311 return;
312 }
313 this._lastPointer = pointer;
314 this.activeDraggable.updateDrag(event, pointer);
315 },
316
317 endDrag: function (event) {
318 if (!this.activeDraggable) {
319 return;
320 }
321 this._lastPointer = null;
322 this.activeDraggable.endDrag(event);
323 this.activeDraggable = null;
324 },
325
326 keyPress: function (event) {
327 if (this.activeDraggable) {
328 this.activeDraggable.keyPress(event);
329 }
330 },
331
332 notify: function (eventName, draggable, event) {
333 MochiKit.Signal.signal(this, eventName, draggable, event);
334 }
335};
336
337/** @id MochiKit.DragAndDrop.Draggable */
338MochiKit.DragAndDrop.Draggable = function (element, options) {
339 var cls = arguments.callee;
340 if (!(this instanceof cls)) {
341 return new cls(element, options);
342 }
343 this.__init__(element, options);
344};
345
346MochiKit.DragAndDrop.Draggable.prototype = {
347 /***
348
349 A draggable object. Simple instantiate :
350
351 new MochiKit.DragAndDrop.Draggable('myelement');
352
353 ***/
354 __class__ : MochiKit.DragAndDrop.Draggable,
355
356 __init__: function (element, /* optional */options) {
357 var v = MochiKit.Visual;
358 var b = MochiKit.Base;
359 options = b.update({
360
361 /** @id MochiKit.DragAndDrop.handle */
362 handle: false,
363
364 /** @id MochiKit.DragAndDrop.starteffect */
365 starteffect: function (innerelement) {
366 this._savedOpacity = MochiKit.Style.getStyle(innerelement, 'opacity') || 1.0;
367 new v.Opacity(innerelement, {duration:0.2, from:this._savedOpacity, to:0.7});
368 },
369 /** @id MochiKit.DragAndDrop.reverteffect */
370 reverteffect: function (innerelement, top_offset, left_offset) {
371 var dur = Math.sqrt(Math.abs(top_offset^2) +
372 Math.abs(left_offset^2))*0.02;
373 return new v.Move(innerelement,
374 {x: -left_offset, y: -top_offset, duration: dur});
375 },
376
377 /** @id MochiKit.DragAndDrop.endeffect */
378 endeffect: function (innerelement) {
379 new v.Opacity(innerelement, {duration:0.2, from:0.7, to:this._savedOpacity});
380 },
381
382 /** @id MochiKit.DragAndDrop.onchange */
383 onchange: b.noop,
384
385 /** @id MochiKit.DragAndDrop.zindex */
386 zindex: 1000,
387
388 /** @id MochiKit.DragAndDrop.revert */
389 revert: false,
390
391 /** @id MochiKit.DragAndDrop.scroll */
392 scroll: false,
393
394 /** @id MochiKit.DragAndDrop.scrollSensitivity */
395 scrollSensitivity: 20,
396
397 /** @id MochiKit.DragAndDrop.scrollSpeed */
398 scrollSpeed: 15,
399 // false, or xy or [x, y] or function (x, y){return [x, y];}
400
401 /** @id MochiKit.DragAndDrop.snap */
402 snap: false
403 }, options);
404
405 var d = MochiKit.DOM;
406 this.element = d.getElement(element);
407
408 if (options.handle && (typeof(options.handle) == 'string')) {
409 this.handle = d.getFirstElementByTagAndClassName(null,
410 options.handle, this.element);
411 }
412 if (!this.handle) {
413 this.handle = d.getElement(options.handle);
414 }
415 if (!this.handle) {
416 this.handle = this.element;
417 }
418
419 if (options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
420 options.scroll = d.getElement(options.scroll);
421 this._isScrollChild = MochiKit.DOM.isChildNode(this.element, options.scroll);
422 }
423
424 MochiKit.Style.makePositioned(this.element); // fix IE
425
426 this.delta = this.currentDelta();
427 this.options = options;
428 this.dragging = false;
429
430 this.eventMouseDown = MochiKit.Signal.connect(this.handle,
431 'onmousedown', this, this.initDrag);
432 MochiKit.DragAndDrop.Draggables.register(this);
433 },
434
435 /** @id MochiKit.DragAndDrop.destroy */
436 destroy: function () {
437 MochiKit.Signal.disconnect(this.eventMouseDown);
438 MochiKit.DragAndDrop.Draggables.unregister(this);
439 },
440
441 /** @id MochiKit.DragAndDrop.currentDelta */
442 currentDelta: function () {
443 var s = MochiKit.Style.getStyle;
444 return [
445 parseInt(s(this.element, 'left') || '0'),
446 parseInt(s(this.element, 'top') || '0')];
447 },
448
449 /** @id MochiKit.DragAndDrop.initDrag */
450 initDrag: function (event) {
451 if (!event.mouse().button.left) {
452 return;
453 }
454 // abort on form elements, fixes a Firefox issue
455 var src = event.target();
456 var tagName = (src.tagName || '').toUpperCase();
457 if (tagName === 'INPUT' || tagName === 'SELECT' ||
458 tagName === 'OPTION' || tagName === 'BUTTON' ||
459 tagName === 'TEXTAREA') {
460 return;
461 }
462
463 if (this._revert) {
464 this._revert.cancel();
465 this._revert = null;
466 }
467
468 var pointer = event.mouse();
469 var pos = MochiKit.Position.cumulativeOffset(this.element);
470 this.offset = [pointer.page.x - pos.x, pointer.page.y - pos.y];
471
472 MochiKit.DragAndDrop.Draggables.activate(this);
473 event.stop();
474 },
475
476 /** @id MochiKit.DragAndDrop.startDrag */
477 startDrag: function (event) {
478 this.dragging = true;
479 if (this.options.selectclass) {
480 MochiKit.DOM.addElementClass(this.element,
481 this.options.selectclass);
482 }
483 if (this.options.zindex) {
484 this.originalZ = parseInt(MochiKit.Style.getStyle(this.element,
485 'z-index') || '0');
486 this.element.style.zIndex = this.options.zindex;
487 }
488
489 if (this.options.ghosting) {
490 this._clone = this.element.cloneNode(true);
491 this.ghostPosition = MochiKit.Position.absolutize(this.element);
492 this.element.parentNode.insertBefore(this._clone, this.element);
493 }
494
495 if (this.options.scroll) {
496 if (this.options.scroll == window) {
497 var where = this._getWindowScroll(this.options.scroll);
498 this.originalScrollLeft = where.left;
499 this.originalScrollTop = where.top;
500 } else {
501 this.originalScrollLeft = this.options.scroll.scrollLeft;
502 this.originalScrollTop = this.options.scroll.scrollTop;
503 }
504 }
505
506 MochiKit.DragAndDrop.Droppables.prepare(this.element);
507 MochiKit.DragAndDrop.Draggables.notify('start', this, event);
508 if (this.options.starteffect) {
509 this.options.starteffect(this.element);
510 }
511 },
512
513 /** @id MochiKit.DragAndDrop.updateDrag */
514 updateDrag: function (event, pointer) {
515 if (!this.dragging) {
516 this.startDrag(event);
517 }
518 MochiKit.Position.prepare();
519 MochiKit.DragAndDrop.Droppables.show(pointer, this.element);
520 MochiKit.DragAndDrop.Draggables.notify('drag', this, event);
521 this.draw(pointer);
522 this.options.onchange(this);
523
524 if (this.options.scroll) {
525 this.stopScrolling();
526 var p, q;
527 if (this.options.scroll == window) {
528 var s = this._getWindowScroll(this.options.scroll);
529 p = new MochiKit.Style.Coordinates(s.left, s.top);
530 q = new MochiKit.Style.Coordinates(s.left + s.width,
531 s.top + s.height);
532 } else {
533 p = MochiKit.Position.page(this.options.scroll);
534 p.x += this.options.scroll.scrollLeft;
535 p.y += this.options.scroll.scrollTop;
536 p.x += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0);
537 p.y += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0);
538 q = new MochiKit.Style.Coordinates(p.x + this.options.scroll.offsetWidth,
539 p.y + this.options.scroll.offsetHeight);
540 }
541 var speed = [0, 0];
542 if (pointer.page.x > (q.x - this.options.scrollSensitivity)) {
543 speed[0] = pointer.page.x - (q.x - this.options.scrollSensitivity);
544 } else if (pointer.page.x < (p.x + this.options.scrollSensitivity)) {
545 speed[0] = pointer.page.x - (p.x + this.options.scrollSensitivity);
546 }
547 if (pointer.page.y > (q.y - this.options.scrollSensitivity)) {
548 speed[1] = pointer.page.y - (q.y - this.options.scrollSensitivity);
549 } else if (pointer.page.y < (p.y + this.options.scrollSensitivity)) {
550 speed[1] = pointer.page.y - (p.y + this.options.scrollSensitivity);
551 }
552 this.startScrolling(speed);
553 }
554
555 // fix AppleWebKit rendering
556 if (/AppleWebKit/.test(navigator.appVersion)) {
557 window.scrollBy(0, 0);
558 }
559 event.stop();
560 },
561
562 /** @id MochiKit.DragAndDrop.finishDrag */
563 finishDrag: function (event, success) {
564 var dr = MochiKit.DragAndDrop;
565 this.dragging = false;
566 if (this.options.selectclass) {
567 MochiKit.DOM.removeElementClass(this.element,
568 this.options.selectclass);
569 }
570
571 if (this.options.ghosting) {
572 // XXX: from a user point of view, it would be better to remove
573 // the node only *after* the MochiKit.Visual.Move end when used
574 // with revert.
575 MochiKit.Position.relativize(this.element, this.ghostPosition);
576 MochiKit.DOM.removeElement(this._clone);
577 this._clone = null;
578 }
579
580 if (success) {
581 dr.Droppables.fire(event, this.element);
582 }
583 dr.Draggables.notify('end', this, event);
584
585 var revert = this.options.revert;
586 if (revert && typeof(revert) == 'function') {
587 revert = revert(this.element);
588 }
589
590 var d = this.currentDelta();
591 if (revert && this.options.reverteffect) {
592 this._revert = this.options.reverteffect(this.element,
593 d[1] - this.delta[1], d[0] - this.delta[0]);
594 } else {
595 this.delta = d;
596 }
597
598 if (this.options.zindex) {
599 this.element.style.zIndex = this.originalZ;
600 }
601
602 if (this.options.endeffect) {
603 this.options.endeffect(this.element);
604 }
605
606 dr.Draggables.deactivate();
607 dr.Droppables.reset(this.element);
608 },
609
610 /** @id MochiKit.DragAndDrop.keyPress */
611 keyPress: function (event) {
612 if (event.key().string != "KEY_ESCAPE") {
613 return;
614 }
615 this.finishDrag(event, false);
616 event.stop();
617 },
618
619 /** @id MochiKit.DragAndDrop.endDrag */
620 endDrag: function (event) {
621 if (!this.dragging) {
622 return;
623 }
624 this.stopScrolling();
625 this.finishDrag(event, true);
626 event.stop();
627 },
628
629 /** @id MochiKit.DragAndDrop.draw */
630 draw: function (point) {
631 var pos = MochiKit.Position.cumulativeOffset(this.element);
632 var d = this.currentDelta();
633 pos.x -= d[0];
634 pos.y -= d[1];
635
636 if (this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
637 pos.x -= this.options.scroll.scrollLeft - this.originalScrollLeft;
638 pos.y -= this.options.scroll.scrollTop - this.originalScrollTop;
639 }
640
641 var p = [point.page.x - pos.x - this.offset[0],
642 point.page.y - pos.y - this.offset[1]];
643
644 if (this.options.snap) {
645 if (typeof(this.options.snap) == 'function') {
646 p = this.options.snap(p[0], p[1]);
647 } else {
648 if (this.options.snap instanceof Array) {
649 var i = -1;
650 p = MochiKit.Base.map(MochiKit.Base.bind(function (v) {
651 i += 1;
652 return Math.round(v/this.options.snap[i]) *
653 this.options.snap[i];
654 }, this), p);
655 } else {
656 p = MochiKit.Base.map(MochiKit.Base.bind(function (v) {
657 return Math.round(v/this.options.snap) *
658 this.options.snap;
659 }, this), p);
660 }
661 }
662 }
663 var style = this.element.style;
664 if ((!this.options.constraint) ||
665 (this.options.constraint == 'horizontal')) {
666 style.left = p[0] + 'px';
667 }
668 if ((!this.options.constraint) ||
669 (this.options.constraint == 'vertical')) {
670 style.top = p[1] + 'px';
671 }
672 if (style.visibility == 'hidden') {
673 style.visibility = ''; // fix gecko rendering
674 }
675 },
676
677 /** @id MochiKit.DragAndDrop.stopScrolling */
678 stopScrolling: function () {
679 if (this.scrollInterval) {
680 clearInterval(this.scrollInterval);
681 this.scrollInterval = null;
682 MochiKit.DragAndDrop.Draggables._lastScrollPointer = null;
683 }
684 },
685
686 /** @id MochiKit.DragAndDrop.startScrolling */
687 startScrolling: function (speed) {
688 if (!speed[0] && !speed[1]) {
689 return;
690 }
691 this.scrollSpeed = [speed[0] * this.options.scrollSpeed,
692 speed[1] * this.options.scrollSpeed];
693 this.lastScrolled = new Date();
694 this.scrollInterval = setInterval(MochiKit.Base.bind(this.scroll, this), 10);
695 },
696
697 /** @id MochiKit.DragAndDrop.scroll */
698 scroll: function () {
699 var current = new Date();
700 var delta = current - this.lastScrolled;
701 this.lastScrolled = current;
702
703 if (this.options.scroll == window) {
704 var s = this._getWindowScroll(this.options.scroll);
705 if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
706 var dm = delta / 1000;
707 this.options.scroll.scrollTo(s.left + dm * this.scrollSpeed[0],
708 s.top + dm * this.scrollSpeed[1]);
709 }
710 } else {
711 this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
712 this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
713 }
714
715 var d = MochiKit.DragAndDrop;
716
717 MochiKit.Position.prepare();
718 d.Droppables.show(d.Draggables._lastPointer, this.element);
719 d.Draggables.notify('drag', this);
720 if (this._isScrollChild) {
721 d.Draggables._lastScrollPointer = d.Draggables._lastScrollPointer || d.Draggables._lastPointer;
722 d.Draggables._lastScrollPointer.x += this.scrollSpeed[0] * delta / 1000;
723 d.Draggables._lastScrollPointer.y += this.scrollSpeed[1] * delta / 1000;
724 if (d.Draggables._lastScrollPointer.x < 0) {
725 d.Draggables._lastScrollPointer.x = 0;
726 }
727 if (d.Draggables._lastScrollPointer.y < 0) {
728 d.Draggables._lastScrollPointer.y = 0;
729 }
730 this.draw(d.Draggables._lastScrollPointer);
731 }
732
733 this.options.onchange(this);
734 },
735
736 _getWindowScroll: function (win) {
737 var vp, w, h;
738 MochiKit.DOM.withWindow(win, function () {
739 vp = MochiKit.Style.getViewportPosition(win.document);
740 });
741 if (win.innerWidth) {
742 w = win.innerWidth;
743 h = win.innerHeight;
744 } else if (win.document.documentElement && win.document.documentElement.clientWidth) {
745 w = win.document.documentElement.clientWidth;
746 h = win.document.documentElement.clientHeight;
747 } else {
748 w = win.document.body.offsetWidth;
749 h = win.document.body.offsetHeight;
750 }
751 return {top: vp.y, left: vp.x, width: w, height: h};
752 },
753
754 /** @id MochiKit.DragAndDrop.repr */
755 repr: function () {
756 return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]";
757 }
758};
759
760MochiKit.DragAndDrop.__new__ = function () {
761 MochiKit.Base.nameFunctions(this);
762};
763
764MochiKit.DragAndDrop.__new__();
765
766MochiKit.Base._exportSymbols(this, MochiKit.DragAndDrop);
diff --git a/frontend/gamma/js/MochiKit/Format.js b/frontend/gamma/js/MochiKit/Format.js
new file mode 100644
index 0000000..122845e
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Format.js
@@ -0,0 +1,309 @@
1/***
2
3MochiKit.Format 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Format', '1.5', ['Base']);
12
13MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) {
14 return function (num) {
15 num = parseFloat(num);
16 if (typeof(num) == "undefined" || num === null || isNaN(num)) {
17 return placeholder;
18 }
19 var curheader = header;
20 var curfooter = footer;
21 if (num < 0) {
22 num = -num;
23 } else {
24 curheader = curheader.replace(/-/, "");
25 }
26 var me = arguments.callee;
27 var fmt = MochiKit.Format.formatLocale(locale);
28 if (isPercent) {
29 num = num * 100.0;
30 curfooter = fmt.percent + curfooter;
31 }
32 num = MochiKit.Format.roundToFixed(num, precision);
33 var parts = num.split(/\./);
34 var whole = parts[0];
35 var frac = (parts.length == 1) ? "" : parts[1];
36 var res = "";
37 while (whole.length < leadingZeros) {
38 whole = "0" + whole;
39 }
40 if (separatorAt) {
41 while (whole.length > separatorAt) {
42 var i = whole.length - separatorAt;
43 //res = res + fmt.separator + whole.substring(i, whole.length);
44 res = fmt.separator + whole.substring(i, whole.length) + res;
45 whole = whole.substring(0, i);
46 }
47 }
48 res = whole + res;
49 if (precision > 0) {
50 while (frac.length < trailingZeros) {
51 frac = frac + "0";
52 }
53 res = res + fmt.decimal + frac;
54 }
55 return curheader + res + curfooter;
56 };
57};
58
59/** @id MochiKit.Format.numberFormatter */
60MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) {
61 // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
62 // | 0 | leading or trailing zeros
63 // | # | just the number
64 // | , | separator
65 // | . | decimal separator
66 // | % | Multiply by 100 and format as percent
67 if (typeof(placeholder) == "undefined") {
68 placeholder = "";
69 }
70 var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
71 if (!match) {
72 throw TypeError("Invalid pattern");
73 }
74 var header = pattern.substr(0, match.index);
75 var footer = pattern.substr(match.index + match[0].length);
76 if (header.search(/-/) == -1) {
77 header = header + "-";
78 }
79 var whole = match[1];
80 var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : "";
81 var isPercent = (typeof(match[3]) == "string" && match[3] != "");
82 var tmp = whole.split(/,/);
83 var separatorAt;
84 if (typeof(locale) == "undefined") {
85 locale = "default";
86 }
87 if (tmp.length == 1) {
88 separatorAt = null;
89 } else {
90 separatorAt = tmp[1].length;
91 }
92 var leadingZeros = whole.length - whole.replace(/0/g, "").length;
93 var trailingZeros = frac.length - frac.replace(/0/g, "").length;
94 var precision = frac.length;
95 var rval = MochiKit.Format._numberFormatter(
96 placeholder, header, footer, locale, isPercent, precision,
97 leadingZeros, separatorAt, trailingZeros
98 );
99 var m = MochiKit.Base;
100 if (m) {
101 var fn = arguments.callee;
102 var args = m.concat(arguments);
103 rval.repr = function () {
104 return [
105 self.NAME,
106 "(",
107 map(m.repr, args).join(", "),
108 ")"
109 ].join("");
110 };
111 }
112 return rval;
113};
114
115/** @id MochiKit.Format.formatLocale */
116MochiKit.Format.formatLocale = function (locale) {
117 if (typeof(locale) == "undefined" || locale === null) {
118 locale = "default";
119 }
120 if (typeof(locale) == "string") {
121 var rval = MochiKit.Format.LOCALE[locale];
122 if (typeof(rval) == "string") {
123 rval = arguments.callee(rval);
124 MochiKit.Format.LOCALE[locale] = rval;
125 }
126 return rval;
127 } else {
128 return locale;
129 }
130};
131
132/** @id MochiKit.Format.twoDigitAverage */
133MochiKit.Format.twoDigitAverage = function (numerator, denominator) {
134 if (denominator) {
135 var res = numerator / denominator;
136 if (!isNaN(res)) {
137 return MochiKit.Format.twoDigitFloat(res);
138 }
139 }
140 return "0";
141};
142
143/** @id MochiKit.Format.twoDigitFloat */
144MochiKit.Format.twoDigitFloat = function (aNumber) {
145 var res = roundToFixed(aNumber, 2);
146 if (res.indexOf(".00") > 0) {
147 return res.substring(0, res.length - 3);
148 } else if (res.charAt(res.length - 1) == "0") {
149 return res.substring(0, res.length - 1);
150 } else {
151 return res;
152 }
153};
154
155/** @id MochiKit.Format.lstrip */
156MochiKit.Format.lstrip = function (str, /* optional */chars) {
157 str = str + "";
158 if (typeof(str) != "string") {
159 return null;
160 }
161 if (!chars) {
162 return str.replace(/^\s+/, "");
163 } else {
164 return str.replace(new RegExp("^[" + chars + "]+"), "");
165 }
166};
167
168/** @id MochiKit.Format.rstrip */
169MochiKit.Format.rstrip = function (str, /* optional */chars) {
170 str = str + "";
171 if (typeof(str) != "string") {
172 return null;
173 }
174 if (!chars) {
175 return str.replace(/\s+$/, "");
176 } else {
177 return str.replace(new RegExp("[" + chars + "]+$"), "");
178 }
179};
180
181/** @id MochiKit.Format.strip */
182MochiKit.Format.strip = function (str, /* optional */chars) {
183 var self = MochiKit.Format;
184 return self.rstrip(self.lstrip(str, chars), chars);
185};
186
187/** @id MochiKit.Format.truncToFixed */
188MochiKit.Format.truncToFixed = function (aNumber, precision) {
189 var fixed = MochiKit.Format._numberToFixed(aNumber, precision);
190 var fracPos = fixed.indexOf(".");
191 if (fracPos > 0 && fracPos + precision + 1 < fixed.length) {
192 fixed = fixed.substring(0, fracPos + precision + 1);
193 fixed = MochiKit.Format._shiftNumber(fixed, 0);
194 }
195 return fixed;
196}
197
198/** @id MochiKit.Format.roundToFixed */
199MochiKit.Format.roundToFixed = function (aNumber, precision) {
200 var fixed = MochiKit.Format._numberToFixed(aNumber, precision);
201 var fracPos = fixed.indexOf(".");
202 if (fracPos > 0 && fracPos + precision + 1 < fixed.length) {
203 var str = MochiKit.Format._shiftNumber(fixed, precision);
204 str = MochiKit.Format._numberToFixed(Math.round(parseFloat(str)), 0);
205 fixed = MochiKit.Format._shiftNumber(str, -precision);
206 }
207 return fixed;
208}
209
210/**
211 * Converts a number to a fixed format string. This function handles
212 * conversion of exponents by shifting the decimal point to the left
213 * or the right. It also guarantees a specified minimum number of
214 * fractional digits (but no maximum).
215 *
216 * @param {Number} aNumber the number to convert
217 * @param {Number} precision the minimum number of decimal digits
218 *
219 * @return {String} the fixed format number string
220 */
221MochiKit.Format._numberToFixed = function (aNumber, precision) {
222 var str = aNumber.toString();
223 var parts = str.split(/[eE]/);
224 var exp = (parts.length === 1) ? 0 : parseInt(parts[1]) || 0;
225 var fixed = MochiKit.Format._shiftNumber(parts[0], exp);
226 parts = fixed.split(/\./);
227 var whole = parts[0];
228 var frac = (parts.length === 1) ? "" : parts[1];
229 while (frac.length < precision) {
230 frac += "0";
231 }
232 if (frac.length > 0) {
233 return whole + "." + frac;
234 } else {
235 return whole;
236 }
237}
238
239/**
240 * Shifts the decimal dot location in a fixed format number string.
241 * This function handles negative values and will add and remove
242 * leading and trailing zeros as needed.
243 *
244 * @param {String} num the fixed format number string
245 * @param {Number} exp the base-10 exponent to apply
246 *
247 * @return {String} the new fixed format number string
248 */
249MochiKit.Format._shiftNumber = function (num, exp) {
250 var pos = num.indexOf(".");
251 if (pos < 0) {
252 pos = num.length;
253 } else {
254 num = num.substring(0, pos) + num.substring(pos + 1);
255 }
256 pos += exp;
257 while (pos <= 0 || (pos <= 1 && num.charAt(0) === "-")) {
258 if (num.charAt(0) === "-") {
259 num = "-0" + num.substring(1);
260 } else {
261 num = "0" + num;
262 }
263 pos++;
264 }
265 while (pos > num.length) {
266 num += "0";
267 }
268 if (pos < num.length) {
269 num = num.substring(0, pos) + "." + num.substring(pos);
270 }
271 while (/^0[^.]/.test(num)) {
272 num = num.substring(1);
273 }
274 while (/^-0[^.]/.test(num)) {
275 num = "-" + num.substring(2);
276 }
277 return num;
278}
279
280/** @id MochiKit.Format.percentFormat */
281MochiKit.Format.percentFormat = function (aNumber) {
282 return MochiKit.Format.twoDigitFloat(100 * aNumber) + '%';
283};
284
285MochiKit.Format.LOCALE = {
286 en_US: {separator: ",", decimal: ".", percent: "%"},
287 de_DE: {separator: ".", decimal: ",", percent: "%"},
288 pt_BR: {separator: ".", decimal: ",", percent: "%"},
289 fr_FR: {separator: " ", decimal: ",", percent: "%"},
290 "default": "en_US",
291 __export__: false
292};
293
294MochiKit.Format.__new__ = function () {
295 MochiKit.Base.nameFunctions(this);
296 var base = this.NAME + ".";
297 var k, v, o;
298 for (k in this.LOCALE) {
299 o = this.LOCALE[k];
300 if (typeof(o) == "object") {
301 o.repr = function () { return this.NAME; };
302 o.NAME = base + "LOCALE." + k;
303 }
304 }
305};
306
307MochiKit.Format.__new__();
308
309MochiKit.Base._exportSymbols(this, MochiKit.Format);
diff --git a/frontend/gamma/js/MochiKit/Iter.js b/frontend/gamma/js/MochiKit/Iter.js
new file mode 100644
index 0000000..524b2bc
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Iter.js
@@ -0,0 +1,790 @@
1/***
2
3MochiKit.Iter 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Iter', '1.5', ['Base']);
12
13MochiKit.Base.update(MochiKit.Iter, {
14 /** @id MochiKit.Iter.registerIteratorFactory */
15 registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) {
16 MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override);
17 },
18
19 /** @id MochiKit.Iter.isIterable */
20 isIterable: function(o) {
21 return o != null &&
22 (typeof(o.next) == "function" || typeof(o.iter) == "function");
23 },
24
25 /** @id MochiKit.Iter.iter */
26 iter: function (iterable, /* optional */ sentinel) {
27 var self = MochiKit.Iter;
28 if (arguments.length == 2) {
29 return self.takewhile(
30 function (a) { return a != sentinel; },
31 iterable
32 );
33 }
34 if (typeof(iterable.next) == 'function') {
35 return iterable;
36 } else if (typeof(iterable.iter) == 'function') {
37 return iterable.iter();
38 /*
39 } else if (typeof(iterable.__iterator__) == 'function') {
40 //
41 // XXX: We can't support JavaScript 1.7 __iterator__ directly
42 // because of Object.prototype.__iterator__
43 //
44 return iterable.__iterator__();
45 */
46 }
47
48 try {
49 return self.iteratorRegistry.match(iterable);
50 } catch (e) {
51 var m = MochiKit.Base;
52 if (e == m.NotFound) {
53 e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable");
54 }
55 throw e;
56 }
57 },
58
59 /** @id MochiKit.Iter.count */
60 count: function (n) {
61 if (!n) {
62 n = 0;
63 }
64 var m = MochiKit.Base;
65 return {
66 repr: function () { return "count(" + n + ")"; },
67 toString: m.forwardCall("repr"),
68 next: m.counter(n)
69 };
70 },
71
72 /** @id MochiKit.Iter.cycle */
73 cycle: function (p) {
74 var self = MochiKit.Iter;
75 var m = MochiKit.Base;
76 var lst = [];
77 var iterator = self.iter(p);
78 return {
79 repr: function () { return "cycle(...)"; },
80 toString: m.forwardCall("repr"),
81 next: function () {
82 try {
83 var rval = iterator.next();
84 lst.push(rval);
85 return rval;
86 } catch (e) {
87 if (e != self.StopIteration) {
88 throw e;
89 }
90 if (lst.length === 0) {
91 this.next = function () {
92 throw self.StopIteration;
93 };
94 } else {
95 var i = -1;
96 this.next = function () {
97 i = (i + 1) % lst.length;
98 return lst[i];
99 };
100 }
101 return this.next();
102 }
103 }
104 };
105 },
106
107 /** @id MochiKit.Iter.repeat */
108 repeat: function (elem, /* optional */n) {
109 var m = MochiKit.Base;
110 if (typeof(n) == 'undefined') {
111 return {
112 repr: function () {
113 return "repeat(" + m.repr(elem) + ")";
114 },
115 toString: m.forwardCall("repr"),
116 next: function () {
117 return elem;
118 }
119 };
120 }
121 return {
122 repr: function () {
123 return "repeat(" + m.repr(elem) + ", " + n + ")";
124 },
125 toString: m.forwardCall("repr"),
126 next: function () {
127 if (n <= 0) {
128 throw MochiKit.Iter.StopIteration;
129 }
130 n -= 1;
131 return elem;
132 }
133 };
134 },
135
136 /** @id MochiKit.Iter.next */
137 next: function (iterator) {
138 return iterator.next();
139 },
140
141 /** @id MochiKit.Iter.izip */
142 izip: function (p, q/*, ...*/) {
143 var m = MochiKit.Base;
144 var self = MochiKit.Iter;
145 var next = self.next;
146 var iterables = m.map(self.iter, arguments);
147 return {
148 repr: function () { return "izip(...)"; },
149 toString: m.forwardCall("repr"),
150 next: function () { return m.map(next, iterables); }
151 };
152 },
153
154 /** @id MochiKit.Iter.ifilter */
155 ifilter: function (pred, seq) {
156 var m = MochiKit.Base;
157 seq = MochiKit.Iter.iter(seq);
158 if (pred === null) {
159 pred = m.operator.truth;
160 }
161 return {
162 repr: function () { return "ifilter(...)"; },
163 toString: m.forwardCall("repr"),
164 next: function () {
165 while (true) {
166 var rval = seq.next();
167 if (pred(rval)) {
168 return rval;
169 }
170 }
171 // mozilla warnings aren't too bright
172 return undefined;
173 }
174 };
175 },
176
177 /** @id MochiKit.Iter.ifilterfalse */
178 ifilterfalse: function (pred, seq) {
179 var m = MochiKit.Base;
180 seq = MochiKit.Iter.iter(seq);
181 if (pred === null) {
182 pred = m.operator.truth;
183 }
184 return {
185 repr: function () { return "ifilterfalse(...)"; },
186 toString: m.forwardCall("repr"),
187 next: function () {
188 while (true) {
189 var rval = seq.next();
190 if (!pred(rval)) {
191 return rval;
192 }
193 }
194 // mozilla warnings aren't too bright
195 return undefined;
196 }
197 };
198 },
199
200 /** @id MochiKit.Iter.islice */
201 islice: function (seq/*, [start,] stop[, step] */) {
202 var self = MochiKit.Iter;
203 var m = MochiKit.Base;
204 seq = self.iter(seq);
205 var start = 0;
206 var stop = 0;
207 var step = 1;
208 var i = -1;
209 if (arguments.length == 2) {
210 stop = arguments[1];
211 } else if (arguments.length == 3) {
212 start = arguments[1];
213 stop = arguments[2];
214 } else {
215 start = arguments[1];
216 stop = arguments[2];
217 step = arguments[3];
218 }
219 return {
220 repr: function () {
221 return "islice(" + ["...", start, stop, step].join(", ") + ")";
222 },
223 toString: m.forwardCall("repr"),
224 next: function () {
225 var rval;
226 while (i < start) {
227 rval = seq.next();
228 i++;
229 }
230 if (start >= stop) {
231 throw self.StopIteration;
232 }
233 start += step;
234 return rval;
235 }
236 };
237 },
238
239 /** @id MochiKit.Iter.imap */
240 imap: function (fun, p, q/*, ...*/) {
241 var m = MochiKit.Base;
242 var self = MochiKit.Iter;
243 var iterables = m.map(self.iter, m.extend(null, arguments, 1));
244 var map = m.map;
245 var next = self.next;
246 return {
247 repr: function () { return "imap(...)"; },
248 toString: m.forwardCall("repr"),
249 next: function () {
250 return fun.apply(this, map(next, iterables));
251 }
252 };
253 },
254
255 /** @id MochiKit.Iter.applymap */
256 applymap: function (fun, seq, self) {
257 seq = MochiKit.Iter.iter(seq);
258 var m = MochiKit.Base;
259 return {
260 repr: function () { return "applymap(...)"; },
261 toString: m.forwardCall("repr"),
262 next: function () {
263 return fun.apply(self, seq.next());
264 }
265 };
266 },
267
268 /** @id MochiKit.Iter.chain */
269 chain: function (p, q/*, ...*/) {
270 // dumb fast path
271 var self = MochiKit.Iter;
272 var m = MochiKit.Base;
273 if (arguments.length == 1) {
274 return self.iter(arguments[0]);
275 }
276 var argiter = m.map(self.iter, arguments);
277 return {
278 repr: function () { return "chain(...)"; },
279 toString: m.forwardCall("repr"),
280 next: function () {
281 while (argiter.length > 1) {
282 try {
283 var result = argiter[0].next();
284 return result;
285 } catch (e) {
286 if (e != self.StopIteration) {
287 throw e;
288 }
289 argiter.shift();
290 var result = argiter[0].next();
291 return result;
292 }
293 }
294 if (argiter.length == 1) {
295 // optimize last element
296 var arg = argiter.shift();
297 this.next = m.bind("next", arg);
298 return this.next();
299 }
300 throw self.StopIteration;
301 }
302 };
303 },
304
305 /** @id MochiKit.Iter.takewhile */
306 takewhile: function (pred, seq) {
307 var self = MochiKit.Iter;
308 seq = self.iter(seq);
309 return {
310 repr: function () { return "takewhile(...)"; },
311 toString: MochiKit.Base.forwardCall("repr"),
312 next: function () {
313 var rval = seq.next();
314 if (!pred(rval)) {
315 this.next = function () {
316 throw self.StopIteration;
317 };
318 this.next();
319 }
320 return rval;
321 }
322 };
323 },
324
325 /** @id MochiKit.Iter.dropwhile */
326 dropwhile: function (pred, seq) {
327 seq = MochiKit.Iter.iter(seq);
328 var m = MochiKit.Base;
329 var bind = m.bind;
330 return {
331 "repr": function () { return "dropwhile(...)"; },
332 "toString": m.forwardCall("repr"),
333 "next": function () {
334 while (true) {
335 var rval = seq.next();
336 if (!pred(rval)) {
337 break;
338 }
339 }
340 this.next = bind("next", seq);
341 return rval;
342 }
343 };
344 },
345
346 _tee: function (ident, sync, iterable) {
347 sync.pos[ident] = -1;
348 var m = MochiKit.Base;
349 var listMin = m.listMin;
350 return {
351 repr: function () { return "tee(" + ident + ", ...)"; },
352 toString: m.forwardCall("repr"),
353 next: function () {
354 var rval;
355 var i = sync.pos[ident];
356
357 if (i == sync.max) {
358 rval = iterable.next();
359 sync.deque.push(rval);
360 sync.max += 1;
361 sync.pos[ident] += 1;
362 } else {
363 rval = sync.deque[i - sync.min];
364 sync.pos[ident] += 1;
365 if (i == sync.min && listMin(sync.pos) != sync.min) {
366 sync.min += 1;
367 sync.deque.shift();
368 }
369 }
370 return rval;
371 }
372 };
373 },
374
375 /** @id MochiKit.Iter.tee */
376 tee: function (iterable, n/* = 2 */) {
377 var rval = [];
378 var sync = {
379 "pos": [],
380 "deque": [],
381 "max": -1,
382 "min": -1
383 };
384 if (arguments.length == 1 || typeof(n) == "undefined" || n === null) {
385 n = 2;
386 }
387 var self = MochiKit.Iter;
388 iterable = self.iter(iterable);
389 var _tee = self._tee;
390 for (var i = 0; i < n; i++) {
391 rval.push(_tee(i, sync, iterable));
392 }
393 return rval;
394 },
395
396 /** @id MochiKit.Iter.list */
397 list: function (iterable) {
398 // Fast-path for Array and Array-like
399 var rval;
400 if (iterable instanceof Array) {
401 return iterable.slice();
402 }
403 // this is necessary to avoid a Safari crash
404 if (typeof(iterable) == "function" &&
405 !(iterable instanceof Function) &&
406 typeof(iterable.length) == 'number') {
407 rval = [];
408 for (var i = 0; i < iterable.length; i++) {
409 rval.push(iterable[i]);
410 }
411 return rval;
412 }
413
414 var self = MochiKit.Iter;
415 iterable = self.iter(iterable);
416 var rval = [];
417 var a_val;
418 try {
419 while (true) {
420 a_val = iterable.next();
421 rval.push(a_val);
422 }
423 } catch (e) {
424 if (e != self.StopIteration) {
425 throw e;
426 }
427 return rval;
428 }
429 // mozilla warnings aren't too bright
430 return undefined;
431 },
432
433
434 /** @id MochiKit.Iter.reduce */
435 reduce: function (fn, iterable, /* optional */initial) {
436 var i = 0;
437 var x = initial;
438 var self = MochiKit.Iter;
439 iterable = self.iter(iterable);
440 if (arguments.length < 3) {
441 try {
442 x = iterable.next();
443 } catch (e) {
444 if (e == self.StopIteration) {
445 e = new TypeError("reduce() of empty sequence with no initial value");
446 }
447 throw e;
448 }
449 i++;
450 }
451 try {
452 while (true) {
453 x = fn(x, iterable.next());
454 }
455 } catch (e) {
456 if (e != self.StopIteration) {
457 throw e;
458 }
459 }
460 return x;
461 },
462
463 /** @id MochiKit.Iter.range */
464 range: function (/* [start,] stop[, step] */) {
465 var start = 0;
466 var stop = 0;
467 var step = 1;
468 if (arguments.length == 1) {
469 stop = arguments[0];
470 } else if (arguments.length == 2) {
471 start = arguments[0];
472 stop = arguments[1];
473 } else if (arguments.length == 3) {
474 start = arguments[0];
475 stop = arguments[1];
476 step = arguments[2];
477 } else {
478 throw new TypeError("range() takes 1, 2, or 3 arguments!");
479 }
480 if (step === 0) {
481 throw new TypeError("range() step must not be 0");
482 }
483 return {
484 next: function () {
485 if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
486 throw MochiKit.Iter.StopIteration;
487 }
488 var rval = start;
489 start += step;
490 return rval;
491 },
492 repr: function () {
493 return "range(" + [start, stop, step].join(", ") + ")";
494 },
495 toString: MochiKit.Base.forwardCall("repr")
496 };
497 },
498
499 /** @id MochiKit.Iter.sum */
500 sum: function (iterable, start/* = 0 */) {
501 if (typeof(start) == "undefined" || start === null) {
502 start = 0;
503 }
504 var x = start;
505 var self = MochiKit.Iter;
506 iterable = self.iter(iterable);
507 try {
508 while (true) {
509 x += iterable.next();
510 }
511 } catch (e) {
512 if (e != self.StopIteration) {
513 throw e;
514 }
515 }
516 return x;
517 },
518
519 /** @id MochiKit.Iter.exhaust */
520 exhaust: function (iterable) {
521 var self = MochiKit.Iter;
522 iterable = self.iter(iterable);
523 try {
524 while (true) {
525 iterable.next();
526 }
527 } catch (e) {
528 if (e != self.StopIteration) {
529 throw e;
530 }
531 }
532 },
533
534 /** @id MochiKit.Iter.forEach */
535 forEach: function (iterable, func, /* optional */obj) {
536 var m = MochiKit.Base;
537 var self = MochiKit.Iter;
538 if (arguments.length > 2) {
539 func = m.bind(func, obj);
540 }
541 // fast path for array
542 if (m.isArrayLike(iterable) && !self.isIterable(iterable)) {
543 try {
544 for (var i = 0; i < iterable.length; i++) {
545 func(iterable[i]);
546 }
547 } catch (e) {
548 if (e != self.StopIteration) {
549 throw e;
550 }
551 }
552 } else {
553 self.exhaust(self.imap(func, iterable));
554 }
555 },
556
557 /** @id MochiKit.Iter.every */
558 every: function (iterable, func) {
559 var self = MochiKit.Iter;
560 try {
561 self.ifilterfalse(func, iterable).next();
562 return false;
563 } catch (e) {
564 if (e != self.StopIteration) {
565 throw e;
566 }
567 return true;
568 }
569 },
570
571 /** @id MochiKit.Iter.sorted */
572 sorted: function (iterable, /* optional */cmp) {
573 var rval = MochiKit.Iter.list(iterable);
574 if (arguments.length == 1) {
575 cmp = MochiKit.Base.compare;
576 }
577 rval.sort(cmp);
578 return rval;
579 },
580
581 /** @id MochiKit.Iter.reversed */
582 reversed: function (iterable) {
583 var rval = MochiKit.Iter.list(iterable);
584 rval.reverse();
585 return rval;
586 },
587
588 /** @id MochiKit.Iter.some */
589 some: function (iterable, func) {
590 var self = MochiKit.Iter;
591 try {
592 self.ifilter(func, iterable).next();
593 return true;
594 } catch (e) {
595 if (e != self.StopIteration) {
596 throw e;
597 }
598 return false;
599 }
600 },
601
602 /** @id MochiKit.Iter.iextend */
603 iextend: function (lst, iterable) {
604 var m = MochiKit.Base;
605 var self = MochiKit.Iter;
606 if (m.isArrayLike(iterable) && !self.isIterable(iterable)) {
607 // fast-path for array-like
608 for (var i = 0; i < iterable.length; i++) {
609 lst.push(iterable[i]);
610 }
611 } else {
612 iterable = self.iter(iterable);
613 try {
614 while (true) {
615 lst.push(iterable.next());
616 }
617 } catch (e) {
618 if (e != self.StopIteration) {
619 throw e;
620 }
621 }
622 }
623 return lst;
624 },
625
626 /** @id MochiKit.Iter.groupby */
627 groupby: function(iterable, /* optional */ keyfunc) {
628 var m = MochiKit.Base;
629 var self = MochiKit.Iter;
630 if (arguments.length < 2) {
631 keyfunc = m.operator.identity;
632 }
633 iterable = self.iter(iterable);
634
635 // shared
636 var pk = undefined;
637 var k = undefined;
638 var v;
639
640 function fetch() {
641 v = iterable.next();
642 k = keyfunc(v);
643 };
644
645 function eat() {
646 var ret = v;
647 v = undefined;
648 return ret;
649 };
650
651 var first = true;
652 var compare = m.compare;
653 return {
654 repr: function () { return "groupby(...)"; },
655 next: function() {
656 // iterator-next
657
658 // iterate until meet next group
659 while (compare(k, pk) === 0) {
660 fetch();
661 if (first) {
662 first = false;
663 break;
664 }
665 }
666 pk = k;
667 return [k, {
668 next: function() {
669 // subiterator-next
670 if (v == undefined) { // Is there something to eat?
671 fetch();
672 }
673 if (compare(k, pk) !== 0) {
674 throw self.StopIteration;
675 }
676 return eat();
677 }
678 }];
679 }
680 };
681 },
682
683 /** @id MochiKit.Iter.groupby_as_array */
684 groupby_as_array: function (iterable, /* optional */ keyfunc) {
685 var m = MochiKit.Base;
686 var self = MochiKit.Iter;
687 if (arguments.length < 2) {
688 keyfunc = m.operator.identity;
689 }
690
691 iterable = self.iter(iterable);
692 var result = [];
693 var first = true;
694 var prev_key;
695 var compare = m.compare;
696 while (true) {
697 try {
698 var value = iterable.next();
699 var key = keyfunc(value);
700 } catch (e) {
701 if (e == self.StopIteration) {
702 break;
703 }
704 throw e;
705 }
706 if (first || compare(key, prev_key) !== 0) {
707 var values = [];
708 result.push([key, values]);
709 }
710 values.push(value);
711 first = false;
712 prev_key = key;
713 }
714 return result;
715 },
716
717 /** @id MochiKit.Iter.arrayLikeIter */
718 arrayLikeIter: function (iterable) {
719 var i = 0;
720 return {
721 repr: function () { return "arrayLikeIter(...)"; },
722 toString: MochiKit.Base.forwardCall("repr"),
723 next: function () {
724 if (i >= iterable.length) {
725 throw MochiKit.Iter.StopIteration;
726 }
727 return iterable[i++];
728 }
729 };
730 },
731
732 /** @id MochiKit.Iter.hasIterateNext */
733 hasIterateNext: function (iterable) {
734 return (iterable && typeof(iterable.iterateNext) == "function");
735 },
736
737 /** @id MochiKit.Iter.iterateNextIter */
738 iterateNextIter: function (iterable) {
739 return {
740 repr: function () { return "iterateNextIter(...)"; },
741 toString: MochiKit.Base.forwardCall("repr"),
742 next: function () {
743 var rval = iterable.iterateNext();
744 if (rval === null || rval === undefined) {
745 throw MochiKit.Iter.StopIteration;
746 }
747 return rval;
748 }
749 };
750 }
751});
752
753
754MochiKit.Iter.__new__ = function () {
755 var m = MochiKit.Base;
756 // Re-use StopIteration if exists (e.g. SpiderMonkey)
757 if (typeof(StopIteration) != "undefined") {
758 this.StopIteration = StopIteration;
759 } else {
760 /** @id MochiKit.Iter.StopIteration */
761 this.StopIteration = new m.NamedError("StopIteration");
762 }
763 this.iteratorRegistry = new m.AdapterRegistry();
764 // Register the iterator factory for arrays
765 this.registerIteratorFactory(
766 "arrayLike",
767 m.isArrayLike,
768 this.arrayLikeIter
769 );
770
771 this.registerIteratorFactory(
772 "iterateNext",
773 this.hasIterateNext,
774 this.iterateNextIter
775 );
776
777 m.nameFunctions(this);
778
779};
780
781MochiKit.Iter.__new__();
782
783//
784// XXX: Internet Explorer blows
785//
786if (MochiKit.__export__) {
787 reduce = MochiKit.Iter.reduce;
788}
789
790MochiKit.Base._exportSymbols(this, MochiKit.Iter);
diff --git a/frontend/gamma/js/MochiKit/Logging.js b/frontend/gamma/js/MochiKit/Logging.js
new file mode 100644
index 0000000..f00996b
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Logging.js
@@ -0,0 +1,262 @@
1/***
2
3MochiKit.Logging 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Logging', '1.5', ['Base']);
12
13 /** @id MochiKit.Logging.LogMessage */
14MochiKit.Logging.LogMessage = function (num, level, info) {
15 this.num = num;
16 this.level = level;
17 this.info = info;
18 this.timestamp = new Date();
19};
20
21MochiKit.Logging.LogMessage.prototype = {
22 /** @id MochiKit.Logging.LogMessage.prototype.repr */
23 repr: function () {
24 var m = MochiKit.Base;
25 return 'LogMessage(' +
26 m.map(
27 m.repr,
28 [this.num, this.level, this.info]
29 ).join(', ') + ')';
30 },
31 /** @id MochiKit.Logging.LogMessage.prototype.toString */
32 toString: MochiKit.Base.forwardCall("repr")
33};
34
35MochiKit.Base.update(MochiKit.Logging, {
36 /** @id MochiKit.Logging.logLevelAtLeast */
37 logLevelAtLeast: function (minLevel) {
38 var self = MochiKit.Logging;
39 if (typeof(minLevel) == 'string') {
40 minLevel = self.LogLevel[minLevel];
41 }
42 return function (msg) {
43 var msgLevel = msg.level;
44 if (typeof(msgLevel) == 'string') {
45 msgLevel = self.LogLevel[msgLevel];
46 }
47 return msgLevel >= minLevel;
48 };
49 },
50
51 /** @id MochiKit.Logging.isLogMessage */
52 isLogMessage: function (/* ... */) {
53 var LogMessage = MochiKit.Logging.LogMessage;
54 for (var i = 0; i < arguments.length; i++) {
55 if (!(arguments[i] instanceof LogMessage)) {
56 return false;
57 }
58 }
59 return true;
60 },
61
62 /** @id MochiKit.Logging.compareLogMessage */
63 compareLogMessage: function (a, b) {
64 return MochiKit.Base.compare([a.level, a.info], [b.level, b.info]);
65 },
66
67 /** @id MochiKit.Logging.alertListener */
68 alertListener: function (msg) {
69 alert(
70 "num: " + msg.num +
71 "\nlevel: " + msg.level +
72 "\ninfo: " + msg.info.join(" ")
73 );
74 }
75
76});
77
78/** @id MochiKit.Logging.Logger */
79MochiKit.Logging.Logger = function (/* optional */maxSize) {
80 this.counter = 0;
81 if (typeof(maxSize) == 'undefined' || maxSize === null) {
82 maxSize = -1;
83 }
84 this.maxSize = maxSize;
85 this._messages = [];
86 this.listeners = {};
87 this.useNativeConsole = false;
88};
89
90MochiKit.Logging.Logger.prototype = {
91 /** @id MochiKit.Logging.Logger.prototype.clear */
92 clear: function () {
93 this._messages.splice(0, this._messages.length);
94 },
95
96 /** @id MochiKit.Logging.Logger.prototype.logToConsole */
97 logToConsole: function (msg) {
98 if (typeof(window) != "undefined" && window.console
99 && window.console.log) {
100 // Safari and FireBug 0.4
101 // Percent replacement is a workaround for cute Safari crashing bug
102 window.console.log(msg.replace(/%/g, '\uFF05'));
103 } else if (typeof(opera) != "undefined" && opera.postError) {
104 // Opera
105 opera.postError(msg);
106 } else if (typeof(Debug) != "undefined" && Debug.writeln) {
107 // IE Web Development Helper (?)
108 // http://www.nikhilk.net/Entry.aspx?id=93
109 Debug.writeln(msg);
110 } else if (typeof(debug) != "undefined" && debug.trace) {
111 // Atlas framework (?)
112 // http://www.nikhilk.net/Entry.aspx?id=93
113 debug.trace(msg);
114 }
115 },
116
117 /** @id MochiKit.Logging.Logger.prototype.dispatchListeners */
118 dispatchListeners: function (msg) {
119 for (var k in this.listeners) {
120 var pair = this.listeners[k];
121 if (pair.ident != k || (pair[0] && !pair[0](msg))) {
122 continue;
123 }
124 pair[1](msg);
125 }
126 },
127
128 /** @id MochiKit.Logging.Logger.prototype.addListener */
129 addListener: function (ident, filter, listener) {
130 if (typeof(filter) == 'string') {
131 filter = MochiKit.Logging.logLevelAtLeast(filter);
132 }
133 var entry = [filter, listener];
134 entry.ident = ident;
135 this.listeners[ident] = entry;
136 },
137
138 /** @id MochiKit.Logging.Logger.prototype.removeListener */
139 removeListener: function (ident) {
140 delete this.listeners[ident];
141 },
142
143 /** @id MochiKit.Logging.Logger.prototype.baseLog */
144 baseLog: function (level, message/*, ...*/) {
145 if (typeof(level) == "number") {
146 if (level >= MochiKit.Logging.LogLevel.FATAL) {
147 level = 'FATAL';
148 } else if (level >= MochiKit.Logging.LogLevel.ERROR) {
149 level = 'ERROR';
150 } else if (level >= MochiKit.Logging.LogLevel.WARNING) {
151 level = 'WARNING';
152 } else if (level >= MochiKit.Logging.LogLevel.INFO) {
153 level = 'INFO';
154 } else {
155 level = 'DEBUG';
156 }
157 }
158 var msg = new MochiKit.Logging.LogMessage(
159 this.counter,
160 level,
161 MochiKit.Base.extend(null, arguments, 1)
162 );
163 this._messages.push(msg);
164 this.dispatchListeners(msg);
165 if (this.useNativeConsole) {
166 this.logToConsole(msg.level + ": " + msg.info.join(" "));
167 }
168 this.counter += 1;
169 while (this.maxSize >= 0 && this._messages.length > this.maxSize) {
170 this._messages.shift();
171 }
172 },
173
174 /** @id MochiKit.Logging.Logger.prototype.getMessages */
175 getMessages: function (howMany) {
176 var firstMsg = 0;
177 if (!(typeof(howMany) == 'undefined' || howMany === null)) {
178 firstMsg = Math.max(0, this._messages.length - howMany);
179 }
180 return this._messages.slice(firstMsg);
181 },
182
183 /** @id MochiKit.Logging.Logger.prototype.getMessageText */
184 getMessageText: function (howMany) {
185 if (typeof(howMany) == 'undefined' || howMany === null) {
186 howMany = 30;
187 }
188 var messages = this.getMessages(howMany);
189 if (messages.length) {
190 var lst = map(function (m) {
191 return '\n [' + m.num + '] ' + m.level + ': ' + m.info.join(' ');
192 }, messages);
193 lst.unshift('LAST ' + messages.length + ' MESSAGES:');
194 return lst.join('');
195 }
196 return '';
197 },
198
199 /** @id MochiKit.Logging.Logger.prototype.debuggingBookmarklet */
200 debuggingBookmarklet: function (inline) {
201 if (typeof(MochiKit.LoggingPane) == "undefined") {
202 alert(this.getMessageText());
203 } else {
204 MochiKit.LoggingPane.createLoggingPane(inline || false);
205 }
206 }
207};
208
209MochiKit.Logging.__new__ = function () {
210 this.LogLevel = {
211 ERROR: 40,
212 FATAL: 50,
213 WARNING: 30,
214 INFO: 20,
215 DEBUG: 10
216 };
217
218 var m = MochiKit.Base;
219 m.registerComparator("LogMessage",
220 this.isLogMessage,
221 this.compareLogMessage
222 );
223
224 var partial = m.partial;
225
226 var Logger = this.Logger;
227 var baseLog = Logger.prototype.baseLog;
228 m.update(this.Logger.prototype, {
229 debug: partial(baseLog, 'DEBUG'),
230 log: partial(baseLog, 'INFO'),
231 error: partial(baseLog, 'ERROR'),
232 fatal: partial(baseLog, 'FATAL'),
233 warning: partial(baseLog, 'WARNING')
234 });
235
236 // indirectly find logger so it can be replaced
237 var self = this;
238 var connectLog = function (name) {
239 return function () {
240 self.logger[name].apply(self.logger, arguments);
241 };
242 };
243
244 /** @id MochiKit.Logging.log */
245 this.log = connectLog('log');
246 /** @id MochiKit.Logging.logError */
247 this.logError = connectLog('error');
248 /** @id MochiKit.Logging.logDebug */
249 this.logDebug = connectLog('debug');
250 /** @id MochiKit.Logging.logFatal */
251 this.logFatal = connectLog('fatal');
252 /** @id MochiKit.Logging.logWarning */
253 this.logWarning = connectLog('warning');
254 this.logger = new Logger();
255 this.logger.useNativeConsole = true;
256
257 m.nameFunctions(this);
258};
259
260MochiKit.Logging.__new__();
261
262MochiKit.Base._exportSymbols(this, MochiKit.Logging);
diff --git a/frontend/gamma/js/MochiKit/LoggingPane.js b/frontend/gamma/js/MochiKit/LoggingPane.js
new file mode 100644
index 0000000..c960c21
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/LoggingPane.js
@@ -0,0 +1,327 @@
1/***
2
3MochiKit.LoggingPane 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('LoggingPane', '1.5', ['Base', 'Logging']);
12
13/** @id MochiKit.LoggingPane.createLoggingPane */
14MochiKit.LoggingPane.createLoggingPane = function (inline/* = false */) {
15 var m = MochiKit.LoggingPane;
16 inline = !(!inline);
17 if (m._loggingPane && m._loggingPane.inline != inline) {
18 m._loggingPane.closePane();
19 m._loggingPane = null;
20 }
21 if (!m._loggingPane || m._loggingPane.closed) {
22 m._loggingPane = new m.LoggingPane(inline, MochiKit.Logging.logger);
23 }
24 return m._loggingPane;
25};
26
27/** @id MochiKit.LoggingPane.LoggingPane */
28MochiKit.LoggingPane.LoggingPane = function (inline/* = false */, logger/* = MochiKit.Logging.logger */) {
29
30 /* Use a div if inline, pop up a window if not */
31 /* Create the elements */
32 if (typeof(logger) == "undefined" || logger === null) {
33 logger = MochiKit.Logging.logger;
34 }
35 this.logger = logger;
36 var update = MochiKit.Base.update;
37 var updatetree = MochiKit.Base.updatetree;
38 var bind = MochiKit.Base.bind;
39 var clone = MochiKit.Base.clone;
40 var win = window;
41 var uid = "_MochiKit_LoggingPane";
42 if (typeof(MochiKit.DOM) != "undefined") {
43 win = MochiKit.DOM.currentWindow();
44 }
45 if (!inline) {
46 // name the popup with the base URL for uniqueness
47 var url = win.location.href.split("?")[0].replace(/[#:\/.><&%-]/g, "_");
48 var name = uid + "_" + url;
49 var nwin = win.open("", name, "dependent,resizable,height=200");
50 if (!nwin) {
51 alert("Not able to open debugging window due to pop-up blocking.");
52 return undefined;
53 }
54 nwin.document.write(
55 '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" '
56 + '"http://www.w3.org/TR/html4/loose.dtd">'
57 + '<html><head><title>[MochiKit.LoggingPane]</title></head>'
58 + '<body></body></html>'
59 );
60 nwin.document.close();
61 nwin.document.title += ' ' + win.document.title;
62 win = nwin;
63 }
64 var doc = win.document;
65 this.doc = doc;
66
67 // Connect to the debug pane if it already exists (i.e. in a window orphaned by the page being refreshed)
68 var debugPane = doc.getElementById(uid);
69 var existing_pane = !!debugPane;
70 if (debugPane && typeof(debugPane.loggingPane) != "undefined") {
71 debugPane.loggingPane.logger = this.logger;
72 debugPane.loggingPane.buildAndApplyFilter();
73 return debugPane.loggingPane;
74 }
75
76 if (existing_pane) {
77 // clear any existing contents
78 var child;
79 while ((child = debugPane.firstChild)) {
80 debugPane.removeChild(child);
81 }
82 } else {
83 debugPane = doc.createElement("div");
84 debugPane.id = uid;
85 }
86 debugPane.loggingPane = this;
87 var levelFilterField = doc.createElement("input");
88 var infoFilterField = doc.createElement("input");
89 var filterButton = doc.createElement("button");
90 var loadButton = doc.createElement("button");
91 var clearButton = doc.createElement("button");
92 var closeButton = doc.createElement("button");
93 var logPaneArea = doc.createElement("div");
94 var logPane = doc.createElement("div");
95
96 /* Set up the functions */
97 var listenerId = uid + "_Listener";
98 this.colorTable = clone(this.colorTable);
99 var messages = [];
100 var messageFilter = null;
101
102 /** @id MochiKit.LoggingPane.messageLevel */
103 var messageLevel = function (msg) {
104 var level = msg.level;
105 if (typeof(level) == "number") {
106 level = MochiKit.Logging.LogLevel[level];
107 }
108 return level;
109 };
110
111 /** @id MochiKit.LoggingPane.messageText */
112 var messageText = function (msg) {
113 return msg.info.join(" ");
114 };
115
116 /** @id MochiKit.LoggingPane.addMessageText */
117 var addMessageText = bind(function (msg) {
118 var level = messageLevel(msg);
119 var text = messageText(msg);
120 var c = this.colorTable[level];
121 var p = doc.createElement("span");
122 p.className = "MochiKit-LogMessage MochiKit-LogLevel-" + level;
123 p.style.cssText = "margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: " + c;
124 p.appendChild(doc.createTextNode(level + ": " + text));
125 logPane.appendChild(p);
126 logPane.appendChild(doc.createElement("br"));
127 if (logPaneArea.offsetHeight > logPaneArea.scrollHeight) {
128 logPaneArea.scrollTop = 0;
129 } else {
130 logPaneArea.scrollTop = logPaneArea.scrollHeight;
131 }
132 }, this);
133
134 /** @id MochiKit.LoggingPane.addMessage */
135 var addMessage = function (msg) {
136 messages[messages.length] = msg;
137 addMessageText(msg);
138 };
139
140 /** @id MochiKit.LoggingPane.buildMessageFilter */
141 var buildMessageFilter = function () {
142 var levelre, infore;
143 try {
144 /* Catch any exceptions that might arise due to invalid regexes */
145 levelre = new RegExp(levelFilterField.value);
146 infore = new RegExp(infoFilterField.value);
147 } catch(e) {
148 /* If there was an error with the regexes, do no filtering */
149 logDebug("Error in filter regex: " + e.message);
150 return null;
151 }
152
153 return function (msg) {
154 return (
155 levelre.test(messageLevel(msg)) &&
156 infore.test(messageText(msg))
157 );
158 };
159 };
160
161 /** @id MochiKit.LoggingPane.clearMessagePane */
162 var clearMessagePane = function () {
163 while (logPane.firstChild) {
164 logPane.removeChild(logPane.firstChild);
165 }
166 };
167
168 /** @id MochiKit.LoggingPane.clearMessages */
169 var clearMessages = function () {
170 messages = [];
171 clearMessagePane();
172 };
173
174 /** @id MochiKit.LoggingPane.closePane */
175 var closePane = bind(function () {
176 if (this.closed) {
177 return;
178 }
179 this.closed = true;
180 if (MochiKit.LoggingPane._loggingPane == this) {
181 MochiKit.LoggingPane._loggingPane = null;
182 }
183 this.logger.removeListener(listenerId);
184 try {
185 try {
186 debugPane.loggingPane = null;
187 } catch(e) { logFatal("Bookmarklet was closed incorrectly."); }
188 if (inline) {
189 debugPane.parentNode.removeChild(debugPane);
190 } else {
191 this.win.close();
192 }
193 } catch(e) {}
194 }, this);
195
196 /** @id MochiKit.LoggingPane.filterMessages */
197 var filterMessages = function () {
198 clearMessagePane();
199
200 for (var i = 0; i < messages.length; i++) {
201 var msg = messages[i];
202 if (messageFilter === null || messageFilter(msg)) {
203 addMessageText(msg);
204 }
205 }
206 };
207
208 this.buildAndApplyFilter = function () {
209 messageFilter = buildMessageFilter();
210
211 filterMessages();
212
213 this.logger.removeListener(listenerId);
214 this.logger.addListener(listenerId, messageFilter, addMessage);
215 };
216
217
218 /** @id MochiKit.LoggingPane.loadMessages */
219 var loadMessages = bind(function () {
220 messages = this.logger.getMessages();
221 filterMessages();
222 }, this);
223
224 /** @id MochiKit.LoggingPane.filterOnEnter */
225 var filterOnEnter = bind(function (event) {
226 event = event || window.event;
227 key = event.which || event.keyCode;
228 if (key == 13) {
229 this.buildAndApplyFilter();
230 }
231 }, this);
232
233 /* Create the debug pane */
234 var style = "display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: " + this.logFont;
235 if (inline) {
236 style += "; height: 10em; border-top: 2px solid black";
237 } else {
238 style += "; height: 100%;";
239 }
240 debugPane.style.cssText = style;
241
242 if (!existing_pane) {
243 doc.body.appendChild(debugPane);
244 }
245
246 /* Create the filter fields */
247 style = {"cssText": "width: 33%; display: inline; font: " + this.logFont};
248
249 updatetree(levelFilterField, {
250 "value": "FATAL|ERROR|WARNING|INFO|DEBUG",
251 "onkeypress": filterOnEnter,
252 "style": style
253 });
254 debugPane.appendChild(levelFilterField);
255
256 updatetree(infoFilterField, {
257 "value": ".*",
258 "onkeypress": filterOnEnter,
259 "style": style
260 });
261 debugPane.appendChild(infoFilterField);
262
263 /* Create the buttons */
264 style = "width: 8%; display:inline; font: " + this.logFont;
265
266 filterButton.appendChild(doc.createTextNode("Filter"));
267 filterButton.onclick = bind("buildAndApplyFilter", this);
268 filterButton.style.cssText = style;
269 debugPane.appendChild(filterButton);
270
271 loadButton.appendChild(doc.createTextNode("Load"));
272 loadButton.onclick = loadMessages;
273 loadButton.style.cssText = style;
274 debugPane.appendChild(loadButton);
275
276 clearButton.appendChild(doc.createTextNode("Clear"));
277 clearButton.onclick = clearMessages;
278 clearButton.style.cssText = style;
279 debugPane.appendChild(clearButton);
280
281 closeButton.appendChild(doc.createTextNode("Close"));
282 closeButton.onclick = closePane;
283 closeButton.style.cssText = style;
284 debugPane.appendChild(closeButton);
285
286 /* Create the logging pane */
287 logPaneArea.style.cssText = "overflow: auto; width: 100%";
288 logPane.style.cssText = "width: 100%; height: " + (inline ? "8em" : "100%");
289
290 logPaneArea.appendChild(logPane);
291 debugPane.appendChild(logPaneArea);
292
293 this.buildAndApplyFilter();
294 loadMessages();
295
296 if (inline) {
297 this.win = undefined;
298 } else {
299 this.win = win;
300 }
301 this.inline = inline;
302 this.closePane = closePane;
303 this.closed = false;
304
305
306 return this;
307};
308
309MochiKit.LoggingPane.LoggingPane.prototype = {
310 "logFont": "8pt Verdana,sans-serif",
311 "colorTable": {
312 "ERROR": "red",
313 "FATAL": "darkred",
314 "WARNING": "blue",
315 "INFO": "black",
316 "DEBUG": "green"
317 }
318};
319
320MochiKit.LoggingPane.__new__ = function () {
321 MochiKit.Base.nameFunctions(this);
322 MochiKit.LoggingPane._loggingPane = null;
323};
324
325MochiKit.LoggingPane.__new__();
326
327MochiKit.Base._exportSymbols(this, MochiKit.LoggingPane);
diff --git a/frontend/gamma/js/MochiKit/MochiKit.js b/frontend/gamma/js/MochiKit/MochiKit.js
new file mode 100644
index 0000000..8e5be68
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/MochiKit.js
@@ -0,0 +1,136 @@
1/***
2
3MochiKit.MochiKit 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11if (typeof(MochiKit) == 'undefined') {
12 MochiKit = {};
13}
14
15if (typeof(MochiKit.MochiKit) == 'undefined') {
16 /** @id MochiKit.MochiKit */
17 MochiKit.MochiKit = {};
18}
19
20MochiKit.MochiKit.NAME = "MochiKit.MochiKit";
21MochiKit.MochiKit.VERSION = "1.5";
22MochiKit.MochiKit.__repr__ = function () {
23 return "[" + this.NAME + " " + this.VERSION + "]";
24};
25
26/** @id MochiKit.MochiKit.toString */
27MochiKit.MochiKit.toString = function () {
28 return this.__repr__();
29};
30
31/** @id MochiKit.MochiKit.SUBMODULES */
32MochiKit.MochiKit.SUBMODULES = [
33 "Base",
34 "Iter",
35 "Logging",
36 "DateTime",
37 "Format",
38 "Text",
39 "Async",
40 "DOM",
41 "Selector",
42 "Style",
43 "LoggingPane",
44 "Color",
45 "Signal",
46 "Position",
47 "Visual",
48 "DragAndDrop",
49 "Sortable"
50];
51
52(function () {
53 if (typeof(document) == "undefined") {
54 return;
55 }
56 var scripts = document.getElementsByTagName("script");
57 var kXHTMLNSURI = "http://www.w3.org/1999/xhtml";
58 var kSVGNSURI = "http://www.w3.org/2000/svg";
59 var kXLINKNSURI = "http://www.w3.org/1999/xlink";
60 var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
61 var base = null;
62 var baseElem = null;
63 var allScripts = {};
64 var i;
65 var src;
66 for (i = 0; i < scripts.length; i++) {
67 src = null;
68 switch (scripts[i].namespaceURI) {
69 case kSVGNSURI:
70 src = scripts[i].getAttributeNS(kXLINKNSURI, "href");
71 break;
72 /*
73 case null: // HTML
74 case '': // HTML
75 case kXHTMLNSURI:
76 case kXULNSURI:
77 */
78 default:
79 src = scripts[i].getAttribute("src");
80 break;
81 }
82 if (!src) {
83 continue;
84 }
85 allScripts[src] = true;
86 if (src.match(/MochiKit.js(\?.*)?$/)) {
87 base = src.substring(0, src.lastIndexOf('MochiKit.js'));
88 baseElem = scripts[i];
89 }
90 }
91 if (base === null) {
92 return;
93 }
94 var modules = MochiKit.MochiKit.SUBMODULES;
95 for (var i = 0; i < modules.length; i++) {
96 if (MochiKit[modules[i]]) {
97 continue;
98 }
99 var uri = base + modules[i] + '.js';
100 if (uri in allScripts) {
101 continue;
102 }
103 if (baseElem.namespaceURI == kSVGNSURI ||
104 baseElem.namespaceURI == kXULNSURI) {
105 // SVG, XUL
106 /*
107 SVG does not support document.write, so if Safari wants to
108 support SVG tests it should fix its deferred loading bug
109 (see following below).
110 */
111 var s = document.createElementNS(baseElem.namespaceURI, 'script');
112 s.setAttribute("id", "MochiKit_" + base + modules[i]);
113 if (baseElem.namespaceURI == kSVGNSURI) {
114 s.setAttributeNS(kXLINKNSURI, 'href', uri);
115 } else {
116 s.setAttribute('src', uri);
117 }
118 s.setAttribute("type", "application/x-javascript");
119 baseElem.parentNode.appendChild(s);
120 } else {
121 // HTML, XHTML
122 /*
123 DOM can not be used here because Safari does
124 deferred loading of scripts unless they are
125 in the document or inserted with document.write
126
127 This is not XHTML compliant. If you want XHTML
128 compliance then you must use the packed version of MochiKit
129 or include each script individually (basically unroll
130 these document.write calls into your XHTML source)
131 */
132 document.write('<' + baseElem.nodeName + ' src="' + uri +
133 '" type="text/javascript"></script>');
134 }
135 };
136})();
diff --git a/frontend/gamma/js/MochiKit/MockDOM.js b/frontend/gamma/js/MochiKit/MockDOM.js
new file mode 100644
index 0000000..abdb54a
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/MockDOM.js
@@ -0,0 +1,115 @@
1/***
2
3MochiKit.MockDOM 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11if (typeof(MochiKit) == "undefined") {
12 MochiKit = {};
13}
14
15if (typeof(MochiKit.MockDOM) == "undefined") {
16 MochiKit.MockDOM = {};
17}
18
19MochiKit.MockDOM.NAME = "MochiKit.MockDOM";
20MochiKit.MockDOM.VERSION = "1.5";
21
22MochiKit.MockDOM.__repr__ = function () {
23 return "[" + this.NAME + " " + this.VERSION + "]";
24};
25
26/** @id MochiKit.MockDOM.toString */
27MochiKit.MockDOM.toString = function () {
28 return this.__repr__();
29};
30
31/** @id MochiKit.MockDOM.createDocument */
32MochiKit.MockDOM.createDocument = function () {
33 var doc = new MochiKit.MockDOM.MockElement("DOCUMENT");
34 doc.body = doc.createElement("BODY");
35 doc.appendChild(doc.body);
36 return doc;
37};
38
39/** @id MochiKit.MockDOM.MockElement */
40MochiKit.MockDOM.MockElement = function (name, data, ownerDocument) {
41 this.tagName = this.nodeName = name.toUpperCase();
42 this.ownerDocument = ownerDocument || null;
43 if (name == "DOCUMENT") {
44 this.nodeType = 9;
45 this.childNodes = [];
46 } else if (typeof(data) == "string") {
47 this.nodeValue = data;
48 this.nodeType = 3;
49 } else {
50 this.nodeType = 1;
51 this.childNodes = [];
52 }
53 if (name.substring(0, 1) == "<") {
54 var nameattr = name.substring(
55 name.indexOf('"') + 1, name.lastIndexOf('"'));
56 name = name.substring(1, name.indexOf(" "));
57 this.tagName = this.nodeName = name.toUpperCase();
58 this.setAttribute("name", nameattr);
59 }
60};
61
62MochiKit.MockDOM.MockElement.prototype = {
63 /** @id MochiKit.MockDOM.MockElement.prototype.createElement */
64 createElement: function (tagName) {
65 return new MochiKit.MockDOM.MockElement(tagName, null, this.nodeType == 9 ? this : this.ownerDocument);
66 },
67 /** @id MochiKit.MockDOM.MockElement.prototype.createTextNode */
68 createTextNode: function (text) {
69 return new MochiKit.MockDOM.MockElement("text", text, this.nodeType == 9 ? this : this.ownerDocument);
70 },
71 /** @id MochiKit.MockDOM.MockElement.prototype.setAttribute */
72 setAttribute: function (name, value) {
73 this[name] = value;
74 },
75 /** @id MochiKit.MockDOM.MockElement.prototype.getAttribute */
76 getAttribute: function (name) {
77 return this[name];
78 },
79 /** @id MochiKit.MockDOM.MockElement.prototype.appendChild */
80 appendChild: function (child) {
81 this.childNodes.push(child);
82 },
83 /** @id MochiKit.MockDOM.MockElement.prototype.toString */
84 toString: function () {
85 return "MockElement(" + this.tagName + ")";
86 },
87 /** @id MochiKit.MockDOM.MockElement.prototype.getElementsByTagName */
88 getElementsByTagName: function (tagName) {
89 var foundElements = [];
90 MochiKit.Base.nodeWalk(this, function(node){
91 if (tagName == '*' || tagName == node.tagName) {
92 foundElements.push(node);
93 return node.childNodes;
94 }
95 });
96 return foundElements;
97 }
98};
99
100 /** @id MochiKit.MockDOM.EXPORT_OK */
101MochiKit.MockDOM.EXPORT_OK = [
102 "mockElement",
103 "createDocument"
104];
105
106 /** @id MochiKit.MockDOM.EXPORT */
107MochiKit.MockDOM.EXPORT = [
108 "document"
109];
110
111MochiKit.MockDOM.__new__ = function () {
112 this.document = this.createDocument();
113};
114
115MochiKit.MockDOM.__new__();
diff --git a/frontend/gamma/js/MochiKit/Position.js b/frontend/gamma/js/MochiKit/Position.js
new file mode 100644
index 0000000..6bc5b39
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Position.js
@@ -0,0 +1,218 @@
1/***
2
3MochiKit.Position 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005-2006 Bob Ippolito and others. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Position', '1.5', ['Base', 'DOM', 'Style']);
12
13MochiKit.Base.update(MochiKit.Position, {
14 // Don't export from this module
15 __export__: false,
16
17 // set to true if needed, warning: firefox performance problems
18 // NOT neeeded for page scrolling, only if draggable contained in
19 // scrollable elements
20 includeScrollOffsets: false,
21
22 /** @id MochiKit.Position.prepare */
23 prepare: function () {
24 var deltaX = window.pageXOffset
25 || document.documentElement.scrollLeft
26 || document.body.scrollLeft
27 || 0;
28 var deltaY = window.pageYOffset
29 || document.documentElement.scrollTop
30 || document.body.scrollTop
31 || 0;
32 this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY);
33 },
34
35 /** @id MochiKit.Position.cumulativeOffset */
36 cumulativeOffset: function (element) {
37 var valueT = 0;
38 var valueL = 0;
39 do {
40 valueT += element.offsetTop || 0;
41 valueL += element.offsetLeft || 0;
42 element = element.offsetParent;
43 } while (element);
44 return new MochiKit.Style.Coordinates(valueL, valueT);
45 },
46
47 /** @id MochiKit.Position.realOffset */
48 realOffset: function (element) {
49 var valueT = 0;
50 var valueL = 0;
51 do {
52 valueT += element.scrollTop || 0;
53 valueL += element.scrollLeft || 0;
54 element = element.parentNode;
55 } while (element);
56 return new MochiKit.Style.Coordinates(valueL, valueT);
57 },
58
59 /** @id MochiKit.Position.within */
60 within: function (element, x, y) {
61 if (this.includeScrollOffsets) {
62 return this.withinIncludingScrolloffsets(element, x, y);
63 }
64 this.xcomp = x;
65 this.ycomp = y;
66 this.offset = this.cumulativeOffset(element);
67 if (element.style.position == "fixed") {
68 this.offset.x += this.windowOffset.x;
69 this.offset.y += this.windowOffset.y;
70 }
71
72 return (y >= this.offset.y &&
73 y < this.offset.y + element.offsetHeight &&
74 x >= this.offset.x &&
75 x < this.offset.x + element.offsetWidth);
76 },
77
78 /** @id MochiKit.Position.withinIncludingScrolloffsets */
79 withinIncludingScrolloffsets: function (element, x, y) {
80 var offsetcache = this.realOffset(element);
81
82 this.xcomp = x + offsetcache.x - this.windowOffset.x;
83 this.ycomp = y + offsetcache.y - this.windowOffset.y;
84 this.offset = this.cumulativeOffset(element);
85
86 return (this.ycomp >= this.offset.y &&
87 this.ycomp < this.offset.y + element.offsetHeight &&
88 this.xcomp >= this.offset.x &&
89 this.xcomp < this.offset.x + element.offsetWidth);
90 },
91
92 // within must be called directly before
93 /** @id MochiKit.Position.overlap */
94 overlap: function (mode, element) {
95 if (!mode) {
96 return 0;
97 }
98 if (mode == 'vertical') {
99 return ((this.offset.y + element.offsetHeight) - this.ycomp) /
100 element.offsetHeight;
101 }
102 if (mode == 'horizontal') {
103 return ((this.offset.x + element.offsetWidth) - this.xcomp) /
104 element.offsetWidth;
105 }
106 },
107
108 /** @id MochiKit.Position.absolutize */
109 absolutize: function (element) {
110 element = MochiKit.DOM.getElement(element);
111 if (element.style.position == 'absolute') {
112 return;
113 }
114 MochiKit.Position.prepare();
115
116 var offsets = MochiKit.Position.positionedOffset(element);
117 var width = element.clientWidth;
118 var height = element.clientHeight;
119
120 var oldStyle = {
121 'position': element.style.position,
122 'left': offsets.x - parseFloat(element.style.left || 0),
123 'top': offsets.y - parseFloat(element.style.top || 0),
124 'width': element.style.width,
125 'height': element.style.height
126 };
127
128 element.style.position = 'absolute';
129 element.style.top = offsets.y + 'px';
130 element.style.left = offsets.x + 'px';
131 element.style.width = width + 'px';
132 element.style.height = height + 'px';
133
134 return oldStyle;
135 },
136
137 /** @id MochiKit.Position.positionedOffset */
138 positionedOffset: function (element) {
139 var valueT = 0, valueL = 0;
140 do {
141 valueT += element.offsetTop || 0;
142 valueL += element.offsetLeft || 0;
143 element = element.offsetParent;
144 if (element) {
145 var p = MochiKit.Style.getStyle(element, 'position');
146 if (p == 'relative' || p == 'absolute') {
147 break;
148 }
149 }
150 } while (element);
151 return new MochiKit.Style.Coordinates(valueL, valueT);
152 },
153
154 /** @id MochiKit.Position.relativize */
155 relativize: function (element, oldPos) {
156 element = MochiKit.DOM.getElement(element);
157 if (element.style.position == 'relative') {
158 return;
159 }
160 MochiKit.Position.prepare();
161
162 var top = parseFloat(element.style.top || 0) -
163 (oldPos['top'] || 0);
164 var left = parseFloat(element.style.left || 0) -
165 (oldPos['left'] || 0);
166
167 element.style.position = oldPos['position'];
168 element.style.top = top + 'px';
169 element.style.left = left + 'px';
170 element.style.width = oldPos['width'];
171 element.style.height = oldPos['height'];
172 },
173
174 /** @id MochiKit.Position.clone */
175 clone: function (source, target) {
176 source = MochiKit.DOM.getElement(source);
177 target = MochiKit.DOM.getElement(target);
178 target.style.position = 'absolute';
179 var offsets = this.cumulativeOffset(source);
180 target.style.top = offsets.y + 'px';
181 target.style.left = offsets.x + 'px';
182 target.style.width = source.offsetWidth + 'px';
183 target.style.height = source.offsetHeight + 'px';
184 },
185
186 /** @id MochiKit.Position.page */
187 page: function (forElement) {
188 var valueT = 0;
189 var valueL = 0;
190
191 var element = forElement;
192 do {
193 valueT += element.offsetTop || 0;
194 valueL += element.offsetLeft || 0;
195
196 // Safari fix
197 if (element.offsetParent == document.body && MochiKit.Style.getStyle(element, 'position') == 'absolute') {
198 break;
199 }
200 } while (element = element.offsetParent);
201
202 element = forElement;
203 do {
204 valueT -= element.scrollTop || 0;
205 valueL -= element.scrollLeft || 0;
206 } while (element = element.parentNode);
207
208 return new MochiKit.Style.Coordinates(valueL, valueT);
209 }
210});
211
212MochiKit.Position.__new__ = function (win) {
213 MochiKit.Base.nameFunctions(this);
214};
215
216MochiKit.Position.__new__(this);
217
218MochiKit.Base._exportSymbols(this, MochiKit.Position);
diff --git a/frontend/gamma/js/MochiKit/Selector.js b/frontend/gamma/js/MochiKit/Selector.js
new file mode 100644
index 0000000..6aec892
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Selector.js
@@ -0,0 +1,387 @@
1/***
2
3MochiKit.Selector 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito and others. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Selector', '1.5', ['Base', 'DOM', 'Iter']);
12
13MochiKit.Selector.Selector = function (expression) {
14 this.params = {classNames: [], pseudoClassNames: []};
15 this.expression = expression.toString().replace(/(^\s+|\s+$)/g, '');
16 this.parseExpression();
17 this.compileMatcher();
18};
19
20MochiKit.Selector.Selector.prototype = {
21 /***
22
23 Selector class: convenient object to make CSS selections.
24
25 ***/
26 __class__: MochiKit.Selector.Selector,
27
28 /** @id MochiKit.Selector.Selector.prototype.parseExpression */
29 parseExpression: function () {
30 function abort(message) {
31 throw 'Parse error in selector: ' + message;
32 }
33
34 if (this.expression == '') {
35 abort('empty expression');
36 }
37
38 var repr = MochiKit.Base.repr;
39 var params = this.params;
40 var expr = this.expression;
41 var match, modifier, clause, rest;
42 while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!^$*]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
43 params.attributes = params.attributes || [];
44 params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
45 expr = match[1];
46 }
47
48 if (expr == '*') {
49 return this.params.wildcard = true;
50 }
51
52 while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+(?:\([^)]*\))?)(.*)/i)) {
53 modifier = match[1];
54 clause = match[2];
55 rest = match[3];
56 switch (modifier) {
57 case '#':
58 params.id = clause;
59 break;
60 case '.':
61 params.classNames.push(clause);
62 break;
63 case ':':
64 params.pseudoClassNames.push(clause);
65 break;
66 case '':
67 case undefined:
68 params.tagName = clause.toUpperCase();
69 break;
70 default:
71 abort(repr(expr));
72 }
73 expr = rest;
74 }
75
76 if (expr.length > 0) {
77 abort(repr(expr));
78 }
79 },
80
81 /** @id MochiKit.Selector.Selector.prototype.buildMatchExpression */
82 buildMatchExpression: function () {
83 var repr = MochiKit.Base.repr;
84 var params = this.params;
85 var conditions = [];
86 var clause, i;
87
88 function childElements(element) {
89 return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, " + element + ".childNodes)";
90 }
91
92 if (params.wildcard) {
93 conditions.push('true');
94 }
95 if (clause = params.id) {
96 conditions.push('element.id == ' + repr(clause));
97 }
98 if (clause = params.tagName) {
99 conditions.push('element.tagName.toUpperCase() == ' + repr(clause));
100 }
101 if ((clause = params.classNames).length > 0) {
102 for (i = 0; i < clause.length; i++) {
103 conditions.push('MochiKit.DOM.hasElementClass(element, ' + repr(clause[i]) + ')');
104 }
105 }
106 if ((clause = params.pseudoClassNames).length > 0) {
107 for (i = 0; i < clause.length; i++) {
108 var match = clause[i].match(/^([^(]+)(?:\((.*)\))?$/);
109 var pseudoClass = match[1];
110 var pseudoClassArgument = match[2];
111 switch (pseudoClass) {
112 case 'root':
113 conditions.push('element.nodeType == 9 || element === element.ownerDocument.documentElement'); break;
114 case 'nth-child':
115 case 'nth-last-child':
116 case 'nth-of-type':
117 case 'nth-last-of-type':
118 match = pseudoClassArgument.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/);
119 if (!match) {
120 throw "Invalid argument to pseudo element nth-child: " + pseudoClassArgument;
121 }
122 var a, b;
123 if (match[0] == 'odd') {
124 a = 2;
125 b = 1;
126 } else if (match[0] == 'even') {
127 a = 2;
128 b = 0;
129 } else {
130 a = match[2] && parseInt(match) || null;
131 b = parseInt(match[3]);
132 }
133 conditions.push('this.nthChild(element,' + a + ',' + b
134 + ',' + !!pseudoClass.match('^nth-last') // Reverse
135 + ',' + !!pseudoClass.match('of-type$') // Restrict to same tagName
136 + ')');
137 break;
138 case 'first-child':
139 conditions.push('this.nthChild(element, null, 1)');
140 break;
141 case 'last-child':
142 conditions.push('this.nthChild(element, null, 1, true)');
143 break;
144 case 'first-of-type':
145 conditions.push('this.nthChild(element, null, 1, false, true)');
146 break;
147 case 'last-of-type':
148 conditions.push('this.nthChild(element, null, 1, true, true)');
149 break;
150 case 'only-child':
151 conditions.push(childElements('element.parentNode') + '.length == 1');
152 break;
153 case 'only-of-type':
154 conditions.push('MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, ' + childElements('element.parentNode') + ').length == 1');
155 break;
156 case 'empty':
157 conditions.push('element.childNodes.length == 0');
158 break;
159 case 'enabled':
160 conditions.push('(this.isUIElement(element) && element.disabled === false)');
161 break;
162 case 'disabled':
163 conditions.push('(this.isUIElement(element) && element.disabled === true)');
164 break;
165 case 'checked':
166 conditions.push('(this.isUIElement(element) && element.checked === true)');
167 break;
168 case 'not':
169 var subselector = new MochiKit.Selector.Selector(pseudoClassArgument);
170 conditions.push('!( ' + subselector.buildMatchExpression() + ')')
171 break;
172 }
173 }
174 }
175 if (clause = params.attributes) {
176 MochiKit.Base.map(function (attribute) {
177 var value = 'MochiKit.DOM.getNodeAttribute(element, ' + repr(attribute.name) + ')';
178 var splitValueBy = function (delimiter) {
179 return value + '.split(' + repr(delimiter) + ')';
180 }
181 conditions.push(value + ' != null');
182 switch (attribute.operator) {
183 case '=':
184 conditions.push(value + ' == ' + repr(attribute.value));
185 break;
186 case '~=':
187 conditions.push('MochiKit.Base.findValue(' + splitValueBy(' ') + ', ' + repr(attribute.value) + ') > -1');
188 break;
189 case '^=':
190 conditions.push(value + '.substring(0, ' + attribute.value.length + ') == ' + repr(attribute.value));
191 break;
192 case '$=':
193 conditions.push(value + '.substring(' + value + '.length - ' + attribute.value.length + ') == ' + repr(attribute.value));
194 break;
195 case '*=':
196 conditions.push(value + '.match(' + repr(attribute.value) + ')');
197 break;
198 case '|=':
199 conditions.push(splitValueBy('-') + '[0].toUpperCase() == ' + repr(attribute.value.toUpperCase()));
200 break;
201 case '!=':
202 conditions.push(value + ' != ' + repr(attribute.value));
203 break;
204 case '':
205 case undefined:
206 // Condition already added above
207 break;
208 default:
209 throw 'Unknown operator ' + attribute.operator + ' in selector';
210 }
211 }, clause);
212 }
213
214 return conditions.join(' && ');
215 },
216
217 /** @id MochiKit.Selector.Selector.prototype.compileMatcher */
218 compileMatcher: function () {
219 var code = 'return (!element.tagName) ? false : ' +
220 this.buildMatchExpression() + ';';
221 this.match = new Function('element', code);
222 },
223
224 /** @id MochiKit.Selector.Selector.prototype.nthChild */
225 nthChild: function (element, a, b, reverse, sametag){
226 var siblings = MochiKit.Base.filter(function (node) {
227 return node.nodeType == 1;
228 }, element.parentNode.childNodes);
229 if (sametag) {
230 siblings = MochiKit.Base.filter(function (node) {
231 return node.tagName == element.tagName;
232 }, siblings);
233 }
234 if (reverse) {
235 siblings = MochiKit.Iter.reversed(siblings);
236 }
237 if (a) {
238 var actualIndex = MochiKit.Base.findIdentical(siblings, element);
239 return ((actualIndex + 1 - b) / a) % 1 == 0;
240 } else {
241 return b == MochiKit.Base.findIdentical(siblings, element) + 1;
242 }
243 },
244
245 /** @id MochiKit.Selector.Selector.prototype.isUIElement */
246 isUIElement: function (element) {
247 return MochiKit.Base.findValue(['input', 'button', 'select', 'option', 'textarea', 'object'],
248 element.tagName.toLowerCase()) > -1;
249 },
250
251 /** @id MochiKit.Selector.Selector.prototype.findElements */
252 findElements: function (scope, axis) {
253 var element;
254
255 if (axis == undefined) {
256 axis = "";
257 }
258
259 function inScope(element, scope) {
260 if (axis == "") {
261 return MochiKit.DOM.isChildNode(element, scope);
262 } else if (axis == ">") {
263 return element.parentNode === scope;
264 } else if (axis == "+") {
265 return element === nextSiblingElement(scope);
266 } else if (axis == "~") {
267 var sibling = scope;
268 while (sibling = nextSiblingElement(sibling)) {
269 if (element === sibling) {
270 return true;
271 }
272 }
273 return false;
274 } else {
275 throw "Invalid axis: " + axis;
276 }
277 }
278
279 if (element = MochiKit.DOM.getElement(this.params.id)) {
280 if (this.match(element)) {
281 if (!scope || inScope(element, scope)) {
282 return [element];
283 }
284 }
285 }
286
287 function nextSiblingElement(node) {
288 node = node.nextSibling;
289 while (node && node.nodeType != 1) {
290 node = node.nextSibling;
291 }
292 return node;
293 }
294
295 if (axis == "") {
296 scope = (scope || MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName || '*');
297 } else if (axis == ">") {
298 if (!scope) {
299 throw "> combinator not allowed without preceeding expression";
300 }
301 scope = MochiKit.Base.filter(function (node) {
302 return node.nodeType == 1;
303 }, scope.childNodes);
304 } else if (axis == "+") {
305 if (!scope) {
306 throw "+ combinator not allowed without preceeding expression";
307 }
308 scope = nextSiblingElement(scope) && [nextSiblingElement(scope)];
309 } else if (axis == "~") {
310 if (!scope) {
311 throw "~ combinator not allowed without preceeding expression";
312 }
313 var newscope = [];
314 while (nextSiblingElement(scope)) {
315 scope = nextSiblingElement(scope);
316 newscope.push(scope);
317 }
318 scope = newscope;
319 }
320
321 if (!scope) {
322 return [];
323 }
324
325 var results = MochiKit.Base.filter(MochiKit.Base.bind(function (scopeElt) {
326 return this.match(scopeElt);
327 }, this), scope);
328
329 return results;
330 },
331
332 /** @id MochiKit.Selector.Selector.prototype.repr */
333 repr: function () {
334 return 'Selector(' + this.expression + ')';
335 },
336
337 toString: MochiKit.Base.forwardCall("repr")
338};
339
340MochiKit.Base.update(MochiKit.Selector, {
341
342 /** @id MochiKit.Selector.findChildElements */
343 findChildElements: function (element, expressions) {
344 element = MochiKit.DOM.getElement(element);
345 var uniq = function(arr) {
346 var res = [];
347 for (var i = 0; i < arr.length; i++) {
348 if (MochiKit.Base.findIdentical(res, arr[i]) < 0) {
349 res.push(arr[i]);
350 }
351 }
352 return res;
353 };
354 return MochiKit.Base.flattenArray(MochiKit.Base.map(function (expression) {
355 var nextScope = "";
356 var reducer = function (results, expr) {
357 var match = expr.match(/^[>+~]$/);
358 if (match) {
359 nextScope = match[0];
360 return results;
361 } else {
362 var selector = new MochiKit.Selector.Selector(expr);
363 var elements = MochiKit.Iter.reduce(function (elements, result) {
364 return MochiKit.Base.extend(elements, selector.findElements(result || element, nextScope));
365 }, results, []);
366 nextScope = "";
367 return elements;
368 }
369 };
370 var exprs = expression.replace(/(^\s+|\s+$)/g, '').split(/\s+/);
371 return uniq(MochiKit.Iter.reduce(reducer, exprs, [null]));
372 }, expressions));
373 },
374
375 findDocElements: function () {
376 return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(), arguments);
377 },
378
379 __new__: function () {
380 this.$$ = this.findDocElements;
381 MochiKit.Base.nameFunctions(this);
382 }
383});
384
385MochiKit.Selector.__new__();
386
387MochiKit.Base._exportSymbols(this, MochiKit.Selector);
diff --git a/frontend/gamma/js/MochiKit/Signal.js b/frontend/gamma/js/MochiKit/Signal.js
new file mode 100644
index 0000000..7df5619
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Signal.js
@@ -0,0 +1,888 @@
1/***
2
3MochiKit.Signal 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Signal', '1.5', ['Base', 'DOM', 'Style']);
12
13MochiKit.Signal._observers = [];
14
15/** @id MochiKit.Signal.Event */
16MochiKit.Signal.Event = function (src, e) {
17 this._event = e || window.event;
18 this._src = src;
19};
20MochiKit.Signal.Event.__export__ = false;
21
22MochiKit.Base.update(MochiKit.Signal.Event.prototype, {
23
24 __repr__: function () {
25 var repr = MochiKit.Base.repr;
26 var str = '{event(): ' + repr(this.event()) +
27 ', src(): ' + repr(this.src()) +
28 ', type(): ' + repr(this.type()) +
29 ', target(): ' + repr(this.target());
30
31 if (this.type() &&
32 this.type().indexOf('key') === 0 ||
33 this.type().indexOf('mouse') === 0 ||
34 this.type().indexOf('click') != -1 ||
35 this.type() == 'contextmenu') {
36 str += ', modifier(): ' + '{alt: ' + repr(this.modifier().alt) +
37 ', ctrl: ' + repr(this.modifier().ctrl) +
38 ', meta: ' + repr(this.modifier().meta) +
39 ', shift: ' + repr(this.modifier().shift) +
40 ', any: ' + repr(this.modifier().any) + '}';
41 }
42
43 if (this.type() && this.type().indexOf('key') === 0) {
44 str += ', key(): {code: ' + repr(this.key().code) +
45 ', string: ' + repr(this.key().string) + '}';
46 }
47
48 if (this.type() && (
49 this.type().indexOf('mouse') === 0 ||
50 this.type().indexOf('click') != -1 ||
51 this.type() == 'contextmenu')) {
52
53 str += ', mouse(): {page: ' + repr(this.mouse().page) +
54 ', client: ' + repr(this.mouse().client);
55
56 if (this.type() != 'mousemove' && this.type() != 'mousewheel') {
57 str += ', button: {left: ' + repr(this.mouse().button.left) +
58 ', middle: ' + repr(this.mouse().button.middle) +
59 ', right: ' + repr(this.mouse().button.right) + '}';
60 }
61 if (this.type() == 'mousewheel') {
62 str += ', wheel: ' + repr(this.mouse().wheel);
63 }
64 str += '}';
65 }
66 if (this.type() == 'mouseover' || this.type() == 'mouseout' ||
67 this.type() == 'mouseenter' || this.type() == 'mouseleave') {
68 str += ', relatedTarget(): ' + repr(this.relatedTarget());
69 }
70 str += '}';
71 return str;
72 },
73
74 /** @id MochiKit.Signal.Event.prototype.toString */
75 toString: function () {
76 return this.__repr__();
77 },
78
79 /** @id MochiKit.Signal.Event.prototype.src */
80 src: function () {
81 return this._src;
82 },
83
84 /** @id MochiKit.Signal.Event.prototype.event */
85 event: function () {
86 return this._event;
87 },
88
89 /** @id MochiKit.Signal.Event.prototype.type */
90 type: function () {
91 if (this._event.type === "DOMMouseScroll") {
92 return "mousewheel";
93 } else {
94 return this._event.type || undefined;
95 }
96 },
97
98 /** @id MochiKit.Signal.Event.prototype.target */
99 target: function () {
100 return this._event.target || this._event.srcElement;
101 },
102
103 _relatedTarget: null,
104 /** @id MochiKit.Signal.Event.prototype.relatedTarget */
105 relatedTarget: function () {
106 if (this._relatedTarget !== null) {
107 return this._relatedTarget;
108 }
109
110 var elem = null;
111 if (this.type() == 'mouseover' || this.type() == 'mouseenter') {
112 elem = (this._event.relatedTarget ||
113 this._event.fromElement);
114 } else if (this.type() == 'mouseout' || this.type() == 'mouseleave') {
115 elem = (this._event.relatedTarget ||
116 this._event.toElement);
117 }
118 try {
119 if (elem !== null && elem.nodeType !== null) {
120 this._relatedTarget = elem;
121 return elem;
122 }
123 } catch (ignore) {
124 // Firefox 3 throws a permission denied error when accessing
125 // any property on XUL elements (e.g. scrollbars)...
126 }
127
128 return undefined;
129 },
130
131 _modifier: null,
132 /** @id MochiKit.Signal.Event.prototype.modifier */
133 modifier: function () {
134 if (this._modifier !== null) {
135 return this._modifier;
136 }
137 var m = {};
138 m.alt = this._event.altKey;
139 m.ctrl = this._event.ctrlKey;
140 m.meta = this._event.metaKey || false; // IE and Opera punt here
141 m.shift = this._event.shiftKey;
142 m.any = m.alt || m.ctrl || m.shift || m.meta;
143 this._modifier = m;
144 return m;
145 },
146
147 _key: null,
148 /** @id MochiKit.Signal.Event.prototype.key */
149 key: function () {
150 if (this._key !== null) {
151 return this._key;
152 }
153 var k = {};
154 if (this.type() && this.type().indexOf('key') === 0) {
155
156 /*
157
158 If you're looking for a special key, look for it in keydown or
159 keyup, but never keypress. If you're looking for a Unicode
160 chracter, look for it with keypress, but never keyup or
161 keydown.
162
163 Notes:
164
165 FF key event behavior:
166 key event charCode keyCode
167 DOWN ku,kd 0 40
168 DOWN kp 0 40
169 ESC ku,kd 0 27
170 ESC kp 0 27
171 a ku,kd 0 65
172 a kp 97 0
173 shift+a ku,kd 0 65
174 shift+a kp 65 0
175 1 ku,kd 0 49
176 1 kp 49 0
177 shift+1 ku,kd 0 0
178 shift+1 kp 33 0
179
180 IE key event behavior:
181 (IE doesn't fire keypress events for special keys.)
182 key event keyCode
183 DOWN ku,kd 40
184 DOWN kp undefined
185 ESC ku,kd 27
186 ESC kp 27
187 a ku,kd 65
188 a kp 97
189 shift+a ku,kd 65
190 shift+a kp 65
191 1 ku,kd 49
192 1 kp 49
193 shift+1 ku,kd 49
194 shift+1 kp 33
195
196 Safari key event behavior:
197 (Safari sets charCode and keyCode to something crazy for
198 special keys.)
199 key event charCode keyCode
200 DOWN ku,kd 63233 40
201 DOWN kp 63233 63233
202 ESC ku,kd 27 27
203 ESC kp 27 27
204 a ku,kd 97 65
205 a kp 97 97
206 shift+a ku,kd 65 65
207 shift+a kp 65 65
208 1 ku,kd 49 49
209 1 kp 49 49
210 shift+1 ku,kd 33 49
211 shift+1 kp 33 33
212
213 */
214
215 /* look for special keys here */
216 if (this.type() == 'keydown' || this.type() == 'keyup') {
217 k.code = this._event.keyCode;
218 k.string = (MochiKit.Signal._specialKeys[k.code] ||
219 'KEY_UNKNOWN');
220 this._key = k;
221 return k;
222
223 /* look for characters here */
224 } else if (this.type() == 'keypress') {
225
226 /*
227
228 Special key behavior:
229
230 IE: does not fire keypress events for special keys
231 FF: sets charCode to 0, and sets the correct keyCode
232 Safari: sets keyCode and charCode to something stupid
233
234 */
235
236 k.code = 0;
237 k.string = '';
238
239 if (typeof(this._event.charCode) != 'undefined' &&
240 this._event.charCode !== 0 &&
241 !MochiKit.Signal._specialMacKeys[this._event.charCode]) {
242 k.code = this._event.charCode;
243 k.string = String.fromCharCode(k.code);
244 } else if (this._event.keyCode &&
245 typeof(this._event.charCode) == 'undefined') { // IE
246 k.code = this._event.keyCode;
247 k.string = String.fromCharCode(k.code);
248 }
249
250 this._key = k;
251 return k;
252 }
253 }
254 return undefined;
255 },
256
257 _mouse: null,
258 /** @id MochiKit.Signal.Event.prototype.mouse */
259 mouse: function () {
260 if (this._mouse !== null) {
261 return this._mouse;
262 }
263
264 var m = {};
265 var e = this._event;
266
267 if (this.type() && (
268 this.type().indexOf('mouse') === 0 ||
269 this.type().indexOf('click') != -1 ||
270 this.type() == 'contextmenu')) {
271
272 m.client = new MochiKit.Style.Coordinates(0, 0);
273 if (e.clientX || e.clientY) {
274 m.client.x = (!e.clientX || e.clientX < 0) ? 0 : e.clientX;
275 m.client.y = (!e.clientY || e.clientY < 0) ? 0 : e.clientY;
276 }
277
278 m.page = new MochiKit.Style.Coordinates(0, 0);
279 if (e.pageX || e.pageY) {
280 m.page.x = (!e.pageX || e.pageX < 0) ? 0 : e.pageX;
281 m.page.y = (!e.pageY || e.pageY < 0) ? 0 : e.pageY;
282 } else {
283 /*
284
285 The IE shortcut can be off by two. We fix it. See:
286 http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp
287
288 This is similar to the method used in
289 MochiKit.Style.getElementPosition().
290
291 */
292 var de = MochiKit.DOM._document.documentElement;
293 var b = MochiKit.DOM._document.body;
294
295 m.page.x = e.clientX +
296 (de.scrollLeft || b.scrollLeft) -
297 (de.clientLeft || 0);
298
299 m.page.y = e.clientY +
300 (de.scrollTop || b.scrollTop) -
301 (de.clientTop || 0);
302
303 }
304 if (this.type() != 'mousemove' && this.type() != 'mousewheel') {
305 m.button = {};
306 m.button.left = false;
307 m.button.right = false;
308 m.button.middle = false;
309
310 /* we could check e.button, but which is more consistent */
311 if (e.which) {
312 m.button.left = (e.which == 1);
313 m.button.middle = (e.which == 2);
314 m.button.right = (e.which == 3);
315
316 /*
317
318 Mac browsers and right click:
319
320 - Safari doesn't fire any click events on a right
321 click:
322 http://bugs.webkit.org/show_bug.cgi?id=6595
323
324 - Firefox fires the event, and sets ctrlKey = true
325
326 - Opera fires the event, and sets metaKey = true
327
328 oncontextmenu is fired on right clicks between
329 browsers and across platforms.
330
331 */
332
333 } else {
334 m.button.left = !!(e.button & 1);
335 m.button.right = !!(e.button & 2);
336 m.button.middle = !!(e.button & 4);
337 }
338 }
339 if (this.type() == 'mousewheel') {
340 m.wheel = new MochiKit.Style.Coordinates(0, 0);
341 if (e.wheelDeltaX || e.wheelDeltaY) {
342 m.wheel.x = e.wheelDeltaX / -40 || 0;
343 m.wheel.y = e.wheelDeltaY / -40 || 0;
344 } else if (e.wheelDelta) {
345 m.wheel.y = e.wheelDelta / -40;
346 } else {
347 m.wheel.y = e.detail || 0;
348 }
349 }
350 this._mouse = m;
351 return m;
352 }
353 return undefined;
354 },
355
356 /** @id MochiKit.Signal.Event.prototype.stop */
357 stop: function () {
358 this.stopPropagation();
359 this.preventDefault();
360 },
361
362 /** @id MochiKit.Signal.Event.prototype.stopPropagation */
363 stopPropagation: function () {
364 if (this._event.stopPropagation) {
365 this._event.stopPropagation();
366 } else {
367 this._event.cancelBubble = true;
368 }
369 },
370
371 /** @id MochiKit.Signal.Event.prototype.preventDefault */
372 preventDefault: function () {
373 if (this._event.preventDefault) {
374 this._event.preventDefault();
375 } else if (this._confirmUnload === null) {
376 this._event.returnValue = false;
377 }
378 },
379
380 _confirmUnload: null,
381
382 /** @id MochiKit.Signal.Event.prototype.confirmUnload */
383 confirmUnload: function (msg) {
384 if (this.type() == 'beforeunload') {
385 this._confirmUnload = msg;
386 this._event.returnValue = msg;
387 }
388 }
389});
390
391/* Safari sets keyCode to these special values onkeypress. */
392MochiKit.Signal._specialMacKeys = {
393 3: 'KEY_ENTER',
394 63289: 'KEY_NUM_PAD_CLEAR',
395 63276: 'KEY_PAGE_UP',
396 63277: 'KEY_PAGE_DOWN',
397 63275: 'KEY_END',
398 63273: 'KEY_HOME',
399 63234: 'KEY_ARROW_LEFT',
400 63232: 'KEY_ARROW_UP',
401 63235: 'KEY_ARROW_RIGHT',
402 63233: 'KEY_ARROW_DOWN',
403 63302: 'KEY_INSERT',
404 63272: 'KEY_DELETE'
405};
406
407/* for KEY_F1 - KEY_F12 */
408(function () {
409 var _specialMacKeys = MochiKit.Signal._specialMacKeys;
410 for (var i = 63236; i <= 63242; i++) {
411 // no F0
412 _specialMacKeys[i] = 'KEY_F' + (i - 63236 + 1);
413 }
414})();
415
416/* Standard keyboard key codes. */
417MochiKit.Signal._specialKeys = {
418 8: 'KEY_BACKSPACE',
419 9: 'KEY_TAB',
420 12: 'KEY_NUM_PAD_CLEAR', // weird, for Safari and Mac FF only
421 13: 'KEY_ENTER',
422 16: 'KEY_SHIFT',
423 17: 'KEY_CTRL',
424 18: 'KEY_ALT',
425 19: 'KEY_PAUSE',
426 20: 'KEY_CAPS_LOCK',
427 27: 'KEY_ESCAPE',
428 32: 'KEY_SPACEBAR',
429 33: 'KEY_PAGE_UP',
430 34: 'KEY_PAGE_DOWN',
431 35: 'KEY_END',
432 36: 'KEY_HOME',
433 37: 'KEY_ARROW_LEFT',
434 38: 'KEY_ARROW_UP',
435 39: 'KEY_ARROW_RIGHT',
436 40: 'KEY_ARROW_DOWN',
437 44: 'KEY_PRINT_SCREEN',
438 45: 'KEY_INSERT',
439 46: 'KEY_DELETE',
440 59: 'KEY_SEMICOLON', // weird, for Safari and IE only
441 91: 'KEY_WINDOWS_LEFT',
442 92: 'KEY_WINDOWS_RIGHT',
443 93: 'KEY_SELECT',
444 106: 'KEY_NUM_PAD_ASTERISK',
445 107: 'KEY_NUM_PAD_PLUS_SIGN',
446 109: 'KEY_NUM_PAD_HYPHEN-MINUS',
447 110: 'KEY_NUM_PAD_FULL_STOP',
448 111: 'KEY_NUM_PAD_SOLIDUS',
449 144: 'KEY_NUM_LOCK',
450 145: 'KEY_SCROLL_LOCK',
451 186: 'KEY_SEMICOLON',
452 187: 'KEY_EQUALS_SIGN',
453 188: 'KEY_COMMA',
454 189: 'KEY_HYPHEN-MINUS',
455 190: 'KEY_FULL_STOP',
456 191: 'KEY_SOLIDUS',
457 192: 'KEY_GRAVE_ACCENT',
458 219: 'KEY_LEFT_SQUARE_BRACKET',
459 220: 'KEY_REVERSE_SOLIDUS',
460 221: 'KEY_RIGHT_SQUARE_BRACKET',
461 222: 'KEY_APOSTROPHE'
462 // undefined: 'KEY_UNKNOWN'
463};
464
465(function () {
466 /* for KEY_0 - KEY_9 */
467 var _specialKeys = MochiKit.Signal._specialKeys;
468 for (var i = 48; i <= 57; i++) {
469 _specialKeys[i] = 'KEY_' + (i - 48);
470 }
471
472 /* for KEY_A - KEY_Z */
473 for (i = 65; i <= 90; i++) {
474 _specialKeys[i] = 'KEY_' + String.fromCharCode(i);
475 }
476
477 /* for KEY_NUM_PAD_0 - KEY_NUM_PAD_9 */
478 for (i = 96; i <= 105; i++) {
479 _specialKeys[i] = 'KEY_NUM_PAD_' + (i - 96);
480 }
481
482 /* for KEY_F1 - KEY_F12 */
483 for (i = 112; i <= 123; i++) {
484 // no F0
485 _specialKeys[i] = 'KEY_F' + (i - 112 + 1);
486 }
487})();
488
489/* Internal object to keep track of created signals. */
490MochiKit.Signal.Ident = function (ident) {
491 this.source = ident.source;
492 this.signal = ident.signal;
493 this.listener = ident.listener;
494 this.isDOM = ident.isDOM;
495 this.objOrFunc = ident.objOrFunc;
496 this.funcOrStr = ident.funcOrStr;
497 this.connected = ident.connected;
498};
499MochiKit.Signal.Ident.__export__ = false;
500MochiKit.Signal.Ident.prototype = {};
501
502MochiKit.Base.update(MochiKit.Signal, {
503
504 _unloadCache: function () {
505 var self = MochiKit.Signal;
506 var observers = self._observers;
507
508 for (var i = 0; i < observers.length; i++) {
509 if (observers[i].signal !== 'onload' && observers[i].signal !== 'onunload') {
510 self._disconnect(observers[i]);
511 }
512 }
513 },
514
515 _listener: function (src, sig, func, obj, isDOM) {
516 var self = MochiKit.Signal;
517 var E = self.Event;
518 if (!isDOM) {
519 /* We don't want to re-bind already bound methods */
520 if (typeof(func.im_self) == 'undefined') {
521 return MochiKit.Base.bindLate(func, obj);
522 } else {
523 return func;
524 }
525 }
526 obj = obj || src;
527 if (typeof(func) == "string") {
528 if (sig === 'onload' || sig === 'onunload') {
529 return function (nativeEvent) {
530 obj[func].apply(obj, [new E(src, nativeEvent)]);
531
532 var ident = new MochiKit.Signal.Ident({
533 source: src, signal: sig, objOrFunc: obj, funcOrStr: func});
534
535 MochiKit.Signal._disconnect(ident);
536 };
537 } else {
538 return function (nativeEvent) {
539 obj[func].apply(obj, [new E(src, nativeEvent)]);
540 };
541 }
542 } else {
543 if (sig === 'onload' || sig === 'onunload') {
544 return function (nativeEvent) {
545 func.apply(obj, [new E(src, nativeEvent)]);
546
547 var ident = new MochiKit.Signal.Ident({
548 source: src, signal: sig, objOrFunc: func});
549
550 MochiKit.Signal._disconnect(ident);
551 };
552 } else {
553 return function (nativeEvent) {
554 func.apply(obj, [new E(src, nativeEvent)]);
555 };
556 }
557 }
558 },
559
560 _browserAlreadyHasMouseEnterAndLeave: function () {
561 return /MSIE/.test(navigator.userAgent);
562 },
563
564 _browserLacksMouseWheelEvent: function () {
565 return /Gecko\//.test(navigator.userAgent);
566 },
567
568 _mouseEnterListener: function (src, sig, func, obj) {
569 var E = MochiKit.Signal.Event;
570 return function (nativeEvent) {
571 var e = new E(src, nativeEvent);
572 try {
573 e.relatedTarget().nodeName;
574 } catch (err) {
575 /* probably hit a permission denied error; possibly one of
576 * firefox's screwy anonymous DIVs inside an input element.
577 * Allow this event to propogate up.
578 */
579 return;
580 }
581 e.stop();
582 if (MochiKit.DOM.isChildNode(e.relatedTarget(), src)) {
583 /* We've moved between our node and a child. Ignore. */
584 return;
585 }
586 e.type = function () { return sig; };
587 if (typeof(func) == "string") {
588 return obj[func].apply(obj, [e]);
589 } else {
590 return func.apply(obj, [e]);
591 }
592 };
593 },
594
595 _getDestPair: function (objOrFunc, funcOrStr) {
596 var obj = null;
597 var func = null;
598 if (typeof(funcOrStr) != 'undefined') {
599 obj = objOrFunc;
600 func = funcOrStr;
601 if (typeof(funcOrStr) == 'string') {
602 if (typeof(objOrFunc[funcOrStr]) != "function") {
603 throw new Error("'funcOrStr' must be a function on 'objOrFunc'");
604 }
605 } else if (typeof(funcOrStr) != 'function') {
606 throw new Error("'funcOrStr' must be a function or string");
607 }
608 } else if (typeof(objOrFunc) != "function") {
609 throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
610 } else {
611 func = objOrFunc;
612 }
613 return [obj, func];
614 },
615
616 /** @id MochiKit.Signal.connect */
617 connect: function (src, sig, objOrFunc/* optional */, funcOrStr) {
618 if (typeof(src) == "string") {
619 src = MochiKit.DOM.getElement(src);
620 }
621 var self = MochiKit.Signal;
622
623 if (typeof(sig) != 'string') {
624 throw new Error("'sig' must be a string");
625 }
626
627 var destPair = self._getDestPair(objOrFunc, funcOrStr);
628 var obj = destPair[0];
629 var func = destPair[1];
630 if (typeof(obj) == 'undefined' || obj === null) {
631 obj = src;
632 }
633
634 var isDOM = !!(src.addEventListener || src.attachEvent);
635 if (isDOM && (sig === "onmouseenter" || sig === "onmouseleave")
636 && !self._browserAlreadyHasMouseEnterAndLeave()) {
637 var listener = self._mouseEnterListener(src, sig.substr(2), func, obj);
638 if (sig === "onmouseenter") {
639 sig = "onmouseover";
640 } else {
641 sig = "onmouseout";
642 }
643 } else if (isDOM && sig == "onmousewheel" && self._browserLacksMouseWheelEvent()) {
644 var listener = self._listener(src, sig, func, obj, isDOM);
645 sig = "onDOMMouseScroll";
646 } else {
647 var listener = self._listener(src, sig, func, obj, isDOM);
648 }
649
650 if (src.addEventListener) {
651 src.addEventListener(sig.substr(2), listener, false);
652 } else if (src.attachEvent) {
653 src.attachEvent(sig, listener); // useCapture unsupported
654 }
655
656 var ident = new MochiKit.Signal.Ident({
657 source: src,
658 signal: sig,
659 listener: listener,
660 isDOM: isDOM,
661 objOrFunc: objOrFunc,
662 funcOrStr: funcOrStr,
663 connected: true
664 });
665 self._observers.push(ident);
666
667 if (!isDOM && typeof(src.__connect__) == 'function') {
668 var args = MochiKit.Base.extend([ident], arguments, 1);
669 src.__connect__.apply(src, args);
670 }
671
672 return ident;
673 },
674
675 _disconnect: function (ident) {
676 // already disconnected
677 if (!ident.connected) {
678 return;
679 }
680 ident.connected = false;
681 var src = ident.source;
682 var sig = ident.signal;
683 var listener = ident.listener;
684 // check isDOM
685 if (!ident.isDOM) {
686 if (typeof(src.__disconnect__) == 'function') {
687 src.__disconnect__(ident, sig, ident.objOrFunc, ident.funcOrStr);
688 }
689 return;
690 }
691 if (src.removeEventListener) {
692 src.removeEventListener(sig.substr(2), listener, false);
693 } else if (src.detachEvent) {
694 src.detachEvent(sig, listener); // useCapture unsupported
695 } else {
696 throw new Error("'src' must be a DOM element");
697 }
698 },
699
700 /** @id MochiKit.Signal.disconnect */
701 disconnect: function (ident) {
702 var self = MochiKit.Signal;
703 var observers = self._observers;
704 var m = MochiKit.Base;
705 if (arguments.length > 1) {
706 // compatibility API
707 var src = arguments[0];
708 if (typeof(src) == "string") {
709 src = MochiKit.DOM.getElement(src);
710 }
711 var sig = arguments[1];
712 var obj = arguments[2];
713 var func = arguments[3];
714 for (var i = observers.length - 1; i >= 0; i--) {
715 var o = observers[i];
716 if (o.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) {
717 self._disconnect(o);
718 if (!self._lock) {
719 observers.splice(i, 1);
720 } else {
721 self._dirty = true;
722 }
723 return true;
724 }
725 }
726 } else {
727 var idx = m.findIdentical(observers, ident);
728 if (idx >= 0) {
729 self._disconnect(ident);
730 if (!self._lock) {
731 observers.splice(idx, 1);
732 } else {
733 self._dirty = true;
734 }
735 return true;
736 }
737 }
738 return false;
739 },
740
741 /** @id MochiKit.Signal.disconnectAllTo */
742 disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) {
743 var self = MochiKit.Signal;
744 var observers = self._observers;
745 var disconnect = self._disconnect;
746 var locked = self._lock;
747 var dirty = self._dirty;
748 if (typeof(funcOrStr) === 'undefined') {
749 funcOrStr = null;
750 }
751 for (var i = observers.length - 1; i >= 0; i--) {
752 var ident = observers[i];
753 if (ident.objOrFunc === objOrFunc &&
754 (funcOrStr === null || ident.funcOrStr === funcOrStr)) {
755 disconnect(ident);
756 if (locked) {
757 dirty = true;
758 } else {
759 observers.splice(i, 1);
760 }
761 }
762 }
763 self._dirty = dirty;
764 },
765
766 /** @id MochiKit.Signal.disconnectAll */
767 disconnectAll: function (src/* optional */, sig) {
768 if (typeof(src) == "string") {
769 src = MochiKit.DOM.getElement(src);
770 }
771 var m = MochiKit.Base;
772 var signals = m.flattenArguments(m.extend(null, arguments, 1));
773 var self = MochiKit.Signal;
774 var disconnect = self._disconnect;
775 var observers = self._observers;
776 var i, ident;
777 var locked = self._lock;
778 var dirty = self._dirty;
779 if (signals.length === 0) {
780 // disconnect all
781 for (i = observers.length - 1; i >= 0; i--) {
782 ident = observers[i];
783 if (ident.source === src) {
784 disconnect(ident);
785 if (!locked) {
786 observers.splice(i, 1);
787 } else {
788 dirty = true;
789 }
790 }
791 }
792 } else {
793 var sigs = {};
794 for (i = 0; i < signals.length; i++) {
795 sigs[signals[i]] = true;
796 }
797 for (i = observers.length - 1; i >= 0; i--) {
798 ident = observers[i];
799 if (ident.source === src && ident.signal in sigs) {
800 disconnect(ident);
801 if (!locked) {
802 observers.splice(i, 1);
803 } else {
804 dirty = true;
805 }
806 }
807 }
808 }
809 self._dirty = dirty;
810 },
811
812 /** @id MochiKit.Signal.signal */
813 signal: function (src, sig) {
814 var self = MochiKit.Signal;
815 var observers = self._observers;
816 if (typeof(src) == "string") {
817 src = MochiKit.DOM.getElement(src);
818 }
819 var args = MochiKit.Base.extend(null, arguments, 2);
820 var errors = [];
821 self._lock = true;
822 for (var i = 0; i < observers.length; i++) {
823 var ident = observers[i];
824 if (ident.source === src && ident.signal === sig &&
825 ident.connected) {
826 try {
827 if (ident.isDOM && ident.funcOrStr != null) {
828 var obj = ident.objOrFunc;
829 obj[ident.funcOrStr].apply(obj, args);
830 } else if (ident.isDOM) {
831 ident.objOrFunc.apply(src, args);
832 } else {
833 ident.listener.apply(src, args);
834 }
835 } catch (e) {
836 errors.push(e);
837 }
838 }
839 }
840 self._lock = false;
841 if (self._dirty) {
842 self._dirty = false;
843 for (var i = observers.length - 1; i >= 0; i--) {
844 if (!observers[i].connected) {
845 observers.splice(i, 1);
846 }
847 }
848 }
849 if (errors.length == 1) {
850 throw errors[0];
851 } else if (errors.length > 1) {
852 var e = new Error("Multiple errors thrown in handling 'sig', see errors property");
853 e.errors = errors;
854 throw e;
855 }
856 }
857
858});
859
860MochiKit.Signal.__new__ = function (win) {
861 var m = MochiKit.Base;
862 this._document = document;
863 this._window = win;
864 this._lock = false;
865 this._dirty = false;
866
867 try {
868 this.connect(window, 'onunload', this._unloadCache);
869 } catch (e) {
870 // pass: might not be a browser
871 }
872
873 m.nameFunctions(this);
874};
875
876MochiKit.Signal.__new__(this);
877
878//
879// XXX: Internet Explorer blows
880//
881if (MochiKit.__export__) {
882 connect = MochiKit.Signal.connect;
883 disconnect = MochiKit.Signal.disconnect;
884 disconnectAll = MochiKit.Signal.disconnectAll;
885 signal = MochiKit.Signal.signal;
886}
887
888MochiKit.Base._exportSymbols(this, MochiKit.Signal);
diff --git a/frontend/gamma/js/MochiKit/Sortable.js b/frontend/gamma/js/MochiKit/Sortable.js
new file mode 100644
index 0000000..863b506
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Sortable.js
@@ -0,0 +1,569 @@
1/***
2Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
3 Mochi-ized By Thomas Herve (_firstname_@nimail.org)
4
5See scriptaculous.js for full license.
6
7***/
8
9MochiKit.Base._module('Sortable', '1.5', ['Base', 'Iter', 'DOM', 'Position', 'DragAndDrop']);
10
11MochiKit.Base.update(MochiKit.Sortable, {
12 __export__: false,
13
14 /***
15
16 Manage sortables. Mainly use the create function to add a sortable.
17
18 ***/
19 sortables: {},
20
21 _findRootElement: function (element) {
22 while (element.tagName.toUpperCase() != "BODY") {
23 if (element.id && MochiKit.Sortable.sortables[element.id]) {
24 return element;
25 }
26 element = element.parentNode;
27 }
28 },
29
30 _createElementId: function(element) {
31 if (element.id == null || element.id == "") {
32 var d = MochiKit.DOM;
33 var id;
34 var count = 1;
35 while (d.getElement(id = "sortable" + count) != null) {
36 count += 1;
37 }
38 d.setNodeAttribute(element, "id", id);
39 }
40 },
41
42 /** @id MochiKit.Sortable.options */
43 options: function (element) {
44 element = MochiKit.Sortable._findRootElement(MochiKit.DOM.getElement(element));
45 if (!element) {
46 return;
47 }
48 return MochiKit.Sortable.sortables[element.id];
49 },
50
51 /** @id MochiKit.Sortable.destroy */
52 destroy: function (element){
53 var s = MochiKit.Sortable.options(element);
54 var b = MochiKit.Base;
55 var d = MochiKit.DragAndDrop;
56
57 if (s) {
58 MochiKit.Signal.disconnect(s.startHandle);
59 MochiKit.Signal.disconnect(s.endHandle);
60 b.map(function (dr) {
61 d.Droppables.remove(dr);
62 }, s.droppables);
63 b.map(function (dr) {
64 dr.destroy();
65 }, s.draggables);
66
67 delete MochiKit.Sortable.sortables[s.element.id];
68 }
69 },
70
71 /** @id MochiKit.Sortable.create */
72 create: function (element, options) {
73 element = MochiKit.DOM.getElement(element);
74 var self = MochiKit.Sortable;
75 self._createElementId(element);
76
77 /** @id MochiKit.Sortable.options */
78 options = MochiKit.Base.update({
79
80 /** @id MochiKit.Sortable.element */
81 element: element,
82
83 /** @id MochiKit.Sortable.tag */
84 tag: 'li', // assumes li children, override with tag: 'tagname'
85
86 /** @id MochiKit.Sortable.dropOnEmpty */
87 dropOnEmpty: false,
88
89 /** @id MochiKit.Sortable.tree */
90 tree: false,
91
92 /** @id MochiKit.Sortable.treeTag */
93 treeTag: 'ul',
94
95 /** @id MochiKit.Sortable.overlap */
96 overlap: 'vertical', // one of 'vertical', 'horizontal'
97
98 /** @id MochiKit.Sortable.constraint */
99 constraint: 'vertical', // one of 'vertical', 'horizontal', false
100 // also takes array of elements (or ids); or false
101
102 /** @id MochiKit.Sortable.containment */
103 containment: [element],
104
105 /** @id MochiKit.Sortable.handle */
106 handle: false, // or a CSS class
107
108 /** @id MochiKit.Sortable.only */
109 only: false,
110
111 /** @id MochiKit.Sortable.hoverclass */
112 hoverclass: null,
113
114 /** @id MochiKit.Sortable.ghosting */
115 ghosting: false,
116
117 /** @id MochiKit.Sortable.scroll */
118 scroll: false,
119
120 /** @id MochiKit.Sortable.scrollSensitivity */
121 scrollSensitivity: 20,
122
123 /** @id MochiKit.Sortable.scrollSpeed */
124 scrollSpeed: 15,
125
126 /** @id MochiKit.Sortable.format */
127 format: /^[^_]*_(.*)$/,
128
129 /** @id MochiKit.Sortable.onChange */
130 onChange: MochiKit.Base.noop,
131
132 /** @id MochiKit.Sortable.onUpdate */
133 onUpdate: MochiKit.Base.noop,
134
135 /** @id MochiKit.Sortable.accept */
136 accept: null
137 }, options);
138
139 // clear any old sortable with same element
140 self.destroy(element);
141
142 // build options for the draggables
143 var options_for_draggable = {
144 revert: true,
145 ghosting: options.ghosting,
146 scroll: options.scroll,
147 scrollSensitivity: options.scrollSensitivity,
148 scrollSpeed: options.scrollSpeed,
149 constraint: options.constraint,
150 handle: options.handle
151 };
152
153 if (options.starteffect) {
154 options_for_draggable.starteffect = options.starteffect;
155 }
156
157 if (options.reverteffect) {
158 options_for_draggable.reverteffect = options.reverteffect;
159 } else if (options.ghosting) {
160 options_for_draggable.reverteffect = function (innerelement) {
161 innerelement.style.top = 0;
162 innerelement.style.left = 0;
163 };
164 }
165
166 if (options.endeffect) {
167 options_for_draggable.endeffect = options.endeffect;
168 }
169
170 if (options.zindex) {
171 options_for_draggable.zindex = options.zindex;
172 }
173
174 // build options for the droppables
175 var options_for_droppable = {
176 overlap: options.overlap,
177 containment: options.containment,
178 hoverclass: options.hoverclass,
179 onhover: self.onHover,
180 tree: options.tree,
181 accept: options.accept
182 }
183
184 var options_for_tree = {
185 onhover: self.onEmptyHover,
186 overlap: options.overlap,
187 containment: options.containment,
188 hoverclass: options.hoverclass,
189 accept: options.accept
190 }
191
192 // fix for gecko engine
193 MochiKit.DOM.removeEmptyTextNodes(element);
194
195 options.draggables = [];
196 options.droppables = [];
197
198 // drop on empty handling
199 if (options.dropOnEmpty || options.tree) {
200 new MochiKit.DragAndDrop.Droppable(element, options_for_tree);
201 options.droppables.push(element);
202 }
203 MochiKit.Base.map(function (e) {
204 // handles are per-draggable
205 var handle = options.handle ?
206 MochiKit.DOM.getFirstElementByTagAndClassName(null,
207 options.handle, e) : e;
208 options.draggables.push(
209 new MochiKit.DragAndDrop.Draggable(e,
210 MochiKit.Base.update(options_for_draggable,
211 {handle: handle})));
212 new MochiKit.DragAndDrop.Droppable(e, options_for_droppable);
213 if (options.tree) {
214 e.treeNode = element;
215 }
216 options.droppables.push(e);
217 }, (self.findElements(element, options) || []));
218
219 if (options.tree) {
220 MochiKit.Base.map(function (e) {
221 new MochiKit.DragAndDrop.Droppable(e, options_for_tree);
222 e.treeNode = element;
223 options.droppables.push(e);
224 }, (self.findTreeElements(element, options) || []));
225 }
226
227 // keep reference
228 self.sortables[element.id] = options;
229
230 options.lastValue = self.serialize(element);
231 options.startHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'start',
232 MochiKit.Base.partial(self.onStart, element));
233 options.endHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'end',
234 MochiKit.Base.partial(self.onEnd, element));
235 },
236
237 /** @id MochiKit.Sortable.onStart */
238 onStart: function (element, draggable) {
239 var self = MochiKit.Sortable;
240 var options = self.options(element);
241 options.lastValue = self.serialize(options.element);
242 },
243
244 /** @id MochiKit.Sortable.onEnd */
245 onEnd: function (element, draggable) {
246 var self = MochiKit.Sortable;
247 self.unmark();
248 var options = self.options(element);
249 if (options.lastValue != self.serialize(options.element)) {
250 options.onUpdate(options.element);
251 }
252 },
253
254 // return all suitable-for-sortable elements in a guaranteed order
255
256 /** @id MochiKit.Sortable.findElements */
257 findElements: function (element, options) {
258 return MochiKit.Sortable.findChildren(element, options.only, options.tree, options.tag);
259 },
260
261 /** @id MochiKit.Sortable.findTreeElements */
262 findTreeElements: function (element, options) {
263 return MochiKit.Sortable.findChildren(
264 element, options.only, options.tree ? true : false, options.treeTag);
265 },
266
267 /** @id MochiKit.Sortable.findChildren */
268 findChildren: function (element, only, recursive, tagName) {
269 if (!element.hasChildNodes()) {
270 return null;
271 }
272 tagName = tagName.toUpperCase();
273 if (only) {
274 only = MochiKit.Base.flattenArray([only]);
275 }
276 var elements = [];
277 MochiKit.Base.map(function (e) {
278 if (e.tagName &&
279 e.tagName.toUpperCase() == tagName &&
280 (!only ||
281 MochiKit.Iter.some(only, function (c) {
282 return MochiKit.DOM.hasElementClass(e, c);
283 }))) {
284 elements.push(e);
285 }
286 if (recursive) {
287 var grandchildren = MochiKit.Sortable.findChildren(e, only, recursive, tagName);
288 if (grandchildren && grandchildren.length > 0) {
289 elements = elements.concat(grandchildren);
290 }
291 }
292 }, element.childNodes);
293 return elements;
294 },
295
296 /** @id MochiKit.Sortable.onHover */
297 onHover: function (element, dropon, overlap) {
298 if (MochiKit.DOM.isChildNode(dropon, element)) {
299 return;
300 }
301 var self = MochiKit.Sortable;
302
303 if (overlap > .33 && overlap < .66 && self.options(dropon).tree) {
304 return;
305 } else if (overlap > 0.5) {
306 self.mark(dropon, 'before');
307 if (dropon.previousSibling != element) {
308 var oldParentNode = element.parentNode;
309 element.style.visibility = 'hidden'; // fix gecko rendering
310 dropon.parentNode.insertBefore(element, dropon);
311 if (dropon.parentNode != oldParentNode) {
312 self.options(oldParentNode).onChange(element);
313 }
314 self.options(dropon.parentNode).onChange(element);
315 }
316 } else {
317 self.mark(dropon, 'after');
318 var nextElement = dropon.nextSibling || null;
319 if (nextElement != element) {
320 var oldParentNode = element.parentNode;
321 element.style.visibility = 'hidden'; // fix gecko rendering
322 dropon.parentNode.insertBefore(element, nextElement);
323 if (dropon.parentNode != oldParentNode) {
324 self.options(oldParentNode).onChange(element);
325 }
326 self.options(dropon.parentNode).onChange(element);
327 }
328 }
329 },
330
331 _offsetSize: function (element, type) {
332 if (type == 'vertical' || type == 'height') {
333 return element.offsetHeight;
334 } else {
335 return element.offsetWidth;
336 }
337 },
338
339 /** @id MochiKit.Sortable.onEmptyHover */
340 onEmptyHover: function (element, dropon, overlap) {
341 var oldParentNode = element.parentNode;
342 var self = MochiKit.Sortable;
343 var droponOptions = self.options(dropon);
344
345 if (!MochiKit.DOM.isChildNode(dropon, element)) {
346 var index;
347
348 var children = self.findElements(dropon, {tag: droponOptions.tag,
349 only: droponOptions.only});
350 var child = null;
351
352 if (children) {
353 var offset = self._offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
354
355 for (index = 0; index < children.length; index += 1) {
356 if (offset - self._offsetSize(children[index], droponOptions.overlap) >= 0) {
357 offset -= self._offsetSize(children[index], droponOptions.overlap);
358 } else if (offset - (self._offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
359 child = index + 1 < children.length ? children[index + 1] : null;
360 break;
361 } else {
362 child = children[index];
363 break;
364 }
365 }
366 }
367
368 dropon.insertBefore(element, child);
369
370 self.options(oldParentNode).onChange(element);
371 droponOptions.onChange(element);
372 }
373 },
374
375 /** @id MochiKit.Sortable.unmark */
376 unmark: function () {
377 var m = MochiKit.Sortable._marker;
378 if (m) {
379 MochiKit.Style.hideElement(m);
380 }
381 },
382
383 /** @id MochiKit.Sortable.mark */
384 mark: function (dropon, position) {
385 // mark on ghosting only
386 var d = MochiKit.DOM;
387 var self = MochiKit.Sortable;
388 var sortable = self.options(dropon.parentNode);
389 if (sortable && !sortable.ghosting) {
390 return;
391 }
392
393 if (!self._marker) {
394 self._marker = d.getElement('dropmarker') ||
395 document.createElement('DIV');
396 MochiKit.Style.hideElement(self._marker);
397 d.addElementClass(self._marker, 'dropmarker');
398 self._marker.style.position = 'absolute';
399 document.getElementsByTagName('body').item(0).appendChild(self._marker);
400 }
401 var offsets = MochiKit.Position.cumulativeOffset(dropon);
402 self._marker.style.left = offsets.x + 'px';
403 self._marker.style.top = offsets.y + 'px';
404
405 if (position == 'after') {
406 if (sortable.overlap == 'horizontal') {
407 self._marker.style.left = (offsets.x + dropon.clientWidth) + 'px';
408 } else {
409 self._marker.style.top = (offsets.y + dropon.clientHeight) + 'px';
410 }
411 }
412 MochiKit.Style.showElement(self._marker);
413 },
414
415 _tree: function (element, options, parent) {
416 var self = MochiKit.Sortable;
417 var children = self.findElements(element, options) || [];
418
419 for (var i = 0; i < children.length; ++i) {
420 var match = children[i].id.match(options.format);
421
422 if (!match) {
423 continue;
424 }
425
426 var child = {
427 id: encodeURIComponent(match ? match[1] : null),
428 element: element,
429 parent: parent,
430 children: [],
431 position: parent.children.length,
432 container: self._findChildrenElement(children[i], options.treeTag.toUpperCase())
433 }
434
435 /* Get the element containing the children and recurse over it */
436 if (child.container) {
437 self._tree(child.container, options, child)
438 }
439
440 parent.children.push (child);
441 }
442
443 return parent;
444 },
445
446 /* Finds the first element of the given tag type within a parent element.
447 Used for finding the first LI[ST] within a L[IST]I[TEM].*/
448 _findChildrenElement: function (element, containerTag) {
449 if (element && element.hasChildNodes) {
450 containerTag = containerTag.toUpperCase();
451 for (var i = 0; i < element.childNodes.length; ++i) {
452 if (element.childNodes[i].tagName.toUpperCase() == containerTag) {
453 return element.childNodes[i];
454 }
455 }
456 }
457 return null;
458 },
459
460 /** @id MochiKit.Sortable.tree */
461 tree: function (element, options) {
462 element = MochiKit.DOM.getElement(element);
463 var sortableOptions = MochiKit.Sortable.options(element);
464 options = MochiKit.Base.update({
465 tag: sortableOptions.tag,
466 treeTag: sortableOptions.treeTag,
467 only: sortableOptions.only,
468 name: element.id,
469 format: sortableOptions.format
470 }, options || {});
471
472 var root = {
473 id: null,
474 parent: null,
475 children: new Array,
476 container: element,
477 position: 0
478 }
479
480 return MochiKit.Sortable._tree(element, options, root);
481 },
482
483 /**
484 * Specifies the sequence for the Sortable.
485 * @param {Node} element Element to use as the Sortable.
486 * @param {Object} newSequence New sequence to use.
487 * @param {Object} options Options to use fro the Sortable.
488 */
489 setSequence: function (element, newSequence, options) {
490 var self = MochiKit.Sortable;
491 var b = MochiKit.Base;
492 element = MochiKit.DOM.getElement(element);
493 options = b.update(self.options(element), options || {});
494
495 var nodeMap = {};
496 b.map(function (n) {
497 var m = n.id.match(options.format);
498 if (m) {
499 nodeMap[m[1]] = [n, n.parentNode];
500 }
501 n.parentNode.removeChild(n);
502 }, self.findElements(element, options));
503
504 b.map(function (ident) {
505 var n = nodeMap[ident];
506 if (n) {
507 n[1].appendChild(n[0]);
508 delete nodeMap[ident];
509 }
510 }, newSequence);
511 },
512
513 /* Construct a [i] index for a particular node */
514 _constructIndex: function (node) {
515 var index = '';
516 do {
517 if (node.id) {
518 index = '[' + node.position + ']' + index;
519 }
520 } while ((node = node.parent) != null);
521 return index;
522 },
523
524 /** @id MochiKit.Sortable.sequence */
525 sequence: function (element, options) {
526 element = MochiKit.DOM.getElement(element);
527 var self = MochiKit.Sortable;
528 var options = MochiKit.Base.update(self.options(element), options || {});
529
530 return MochiKit.Base.map(function (item) {
531 return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
532 }, MochiKit.DOM.getElement(self.findElements(element, options) || []));
533 },
534
535 /**
536 * Serializes the content of a Sortable. Useful to send this content through a XMLHTTPRequest.
537 * These options override the Sortable options for the serialization only.
538 * @param {Node} element Element to serialize.
539 * @param {Object} options Serialization options.
540 */
541 serialize: function (element, options) {
542 element = MochiKit.DOM.getElement(element);
543 var self = MochiKit.Sortable;
544 options = MochiKit.Base.update(self.options(element), options || {});
545 var name = encodeURIComponent(options.name || element.id);
546
547 if (options.tree) {
548 return MochiKit.Base.flattenArray(MochiKit.Base.map(function (item) {
549 return [name + self._constructIndex(item) + "[id]=" +
550 encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
551 }, self.tree(element, options).children)).join('&');
552 } else {
553 return MochiKit.Base.map(function (item) {
554 return name + "[]=" + encodeURIComponent(item);
555 }, self.sequence(element, options)).join('&');
556 }
557 }
558});
559
560// trunk compatibility
561MochiKit.Sortable.Sortable = MochiKit.Sortable;
562
563MochiKit.Sortable.__new__ = function () {
564 MochiKit.Base.nameFunctions(this);
565};
566
567MochiKit.Sortable.__new__();
568
569MochiKit.Base._exportSymbols(this, MochiKit.Sortable);
diff --git a/frontend/gamma/js/MochiKit/Style.js b/frontend/gamma/js/MochiKit/Style.js
new file mode 100644
index 0000000..7f10117
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Style.js
@@ -0,0 +1,558 @@
1/***
2
3MochiKit.Style 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Style', '1.5', ['Base', 'DOM']);
12
13
14/** @id MochiKit.Style.Dimensions */
15MochiKit.Style.Dimensions = function (w, h) {
16 if (!(this instanceof MochiKit.Style.Dimensions)) {
17 return new MochiKit.Style.Dimensions(w, h);
18 }
19 this.w = w;
20 this.h = h;
21};
22
23MochiKit.Style.Dimensions.prototype.__repr__ = function () {
24 var repr = MochiKit.Base.repr;
25 return '{w: ' + repr(this.w) + ', h: ' + repr(this.h) + '}';
26};
27
28MochiKit.Style.Dimensions.prototype.toString = function () {
29 return this.__repr__();
30};
31
32
33/** @id MochiKit.Style.Coordinates */
34MochiKit.Style.Coordinates = function (x, y) {
35 if (!(this instanceof MochiKit.Style.Coordinates)) {
36 return new MochiKit.Style.Coordinates(x, y);
37 }
38 this.x = x;
39 this.y = y;
40};
41
42MochiKit.Style.Coordinates.prototype.__repr__ = function () {
43 var repr = MochiKit.Base.repr;
44 return '{x: ' + repr(this.x) + ', y: ' + repr(this.y) + '}';
45};
46
47MochiKit.Style.Coordinates.prototype.toString = function () {
48 return this.__repr__();
49};
50
51
52MochiKit.Base.update(MochiKit.Style, {
53
54 /** @id MochiKit.Style.getStyle */
55 getStyle: function (elem, cssProperty) {
56 var dom = MochiKit.DOM;
57 var d = dom._document;
58
59 elem = dom.getElement(elem);
60 cssProperty = MochiKit.Base.camelize(cssProperty);
61
62 if (!elem || elem == d) {
63 return undefined;
64 }
65 if (cssProperty == 'opacity' && typeof(elem.filters) != 'undefined') {
66 var opacity = (MochiKit.Style.getStyle(elem, 'filter') || '').match(/alpha\(opacity=(.*)\)/);
67 if (opacity && opacity[1]) {
68 return parseFloat(opacity[1]) / 100;
69 }
70 return 1.0;
71 }
72 if (cssProperty == 'float' || cssProperty == 'cssFloat' || cssProperty == 'styleFloat') {
73 if (elem.style["float"]) {
74 return elem.style["float"];
75 } else if (elem.style.cssFloat) {
76 return elem.style.cssFloat;
77 } else if (elem.style.styleFloat) {
78 return elem.style.styleFloat;
79 } else {
80 return "none";
81 }
82 }
83 var value = elem.style ? elem.style[cssProperty] : null;
84 if (!value) {
85 if (d.defaultView && d.defaultView.getComputedStyle) {
86 var css = d.defaultView.getComputedStyle(elem, null);
87 cssProperty = cssProperty.replace(/([A-Z])/g, '-$1'
88 ).toLowerCase(); // from dojo.style.toSelectorCase
89 value = css ? css.getPropertyValue(cssProperty) : null;
90 } else if (elem.currentStyle) {
91 value = elem.currentStyle[cssProperty];
92 if (/^\d/.test(value) && !/px$/.test(value) && cssProperty != 'fontWeight') {
93 /* Convert to px using an hack from Dean Edwards */
94 var left = elem.style.left;
95 var rsLeft = elem.runtimeStyle.left;
96 elem.runtimeStyle.left = elem.currentStyle.left;
97 elem.style.left = value || 0;
98 value = elem.style.pixelLeft + "px";
99 elem.style.left = left;
100 elem.runtimeStyle.left = rsLeft;
101 }
102 }
103 }
104 if (cssProperty == 'opacity') {
105 value = parseFloat(value);
106 }
107
108 if (/Opera/.test(navigator.userAgent) && (MochiKit.Base.findValue(['left', 'top', 'right', 'bottom'], cssProperty) != -1)) {
109 if (MochiKit.Style.getStyle(elem, 'position') == 'static') {
110 value = 'auto';
111 }
112 }
113
114 return value == 'auto' ? null : value;
115 },
116
117 /** @id MochiKit.Style.setStyle */
118 setStyle: function (elem, style) {
119 elem = MochiKit.DOM.getElement(elem);
120 for (var name in style) {
121 switch (name) {
122 case 'opacity':
123 MochiKit.Style.setOpacity(elem, style[name]);
124 break;
125 case 'float':
126 case 'cssFloat':
127 case 'styleFloat':
128 if (typeof(elem.style["float"]) != "undefined") {
129 elem.style["float"] = style[name];
130 } else if (typeof(elem.style.cssFloat) != "undefined") {
131 elem.style.cssFloat = style[name];
132 } else {
133 elem.style.styleFloat = style[name];
134 }
135 break;
136 default:
137 elem.style[MochiKit.Base.camelize(name)] = style[name];
138 }
139 }
140 },
141
142 /** @id MochiKit.Style.setOpacity */
143 setOpacity: function (elem, o) {
144 elem = MochiKit.DOM.getElement(elem);
145 var self = MochiKit.Style;
146 if (o == 1) {
147 var toSet = /Gecko/.test(navigator.userAgent) && !(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent));
148 elem.style["opacity"] = toSet ? 0.999999 : 1.0;
149 if (/MSIE/.test(navigator.userAgent)) {
150 elem.style['filter'] =
151 self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '');
152 }
153 } else {
154 if (o < 0.00001) {
155 o = 0;
156 }
157 elem.style["opacity"] = o;
158 if (/MSIE/.test(navigator.userAgent)) {
159 elem.style['filter'] =
160 self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + o * 100 + ')';
161 }
162 }
163 },
164
165 /*
166
167 getElementPosition is adapted from YAHOO.util.Dom.getXY v0.9.0.
168 Copyright: Copyright (c) 2006, Yahoo! Inc. All rights reserved.
169 License: BSD, http://developer.yahoo.net/yui/license.txt
170
171 */
172
173 /** @id MochiKit.Style.getElementPosition */
174 getElementPosition: function (elem, /* optional */relativeTo) {
175 var self = MochiKit.Style;
176 var dom = MochiKit.DOM;
177 var isCoordinates = function (o) {
178 return o != null &&
179 o.nodeType == null &&
180 typeof(o.x) == "number" &&
181 typeof(o.y) == "number";
182 }
183
184 if (typeof(elem) == "string") {
185 elem = dom.getElement(elem);
186 }
187 if (elem == null ||
188 (!isCoordinates(elem) && self.getStyle(elem, 'display') == 'none')) {
189 return undefined;
190 }
191
192 var c = new self.Coordinates(0, 0);
193 var box = null;
194 var parent = null;
195
196 var d = MochiKit.DOM._document;
197 var de = d.documentElement;
198 var b = d.body;
199
200 if (!elem.parentNode && elem.x && elem.y) {
201 /* it's just a MochiKit.Style.Coordinates object */
202 c.x += elem.x || 0;
203 c.y += elem.y || 0;
204 } else if (elem.getBoundingClientRect) { // IE shortcut
205 /*
206
207 The IE shortcut can be off by two. We fix it. See:
208 http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp
209
210 This is similar to the method used in
211 MochiKit.Signal.Event.mouse().
212
213 */
214 box = elem.getBoundingClientRect();
215
216 c.x += box.left +
217 (de.scrollLeft || b.scrollLeft) -
218 (de.clientLeft || 0);
219
220 c.y += box.top +
221 (de.scrollTop || b.scrollTop) -
222 (de.clientTop || 0);
223
224 } else if (elem.offsetParent) {
225 c.x += elem.offsetLeft;
226 c.y += elem.offsetTop;
227 parent = elem.offsetParent;
228
229 if (parent != elem) {
230 while (parent) {
231 c.x += parseInt(parent.style.borderLeftWidth) || 0;
232 c.y += parseInt(parent.style.borderTopWidth) || 0;
233 c.x += parent.offsetLeft;
234 c.y += parent.offsetTop;
235 parent = parent.offsetParent;
236 }
237 }
238
239 /*
240
241 Opera < 9 and old Safari (absolute) incorrectly account for
242 body offsetTop and offsetLeft.
243
244 */
245 var ua = navigator.userAgent.toLowerCase();
246 if ((typeof(opera) != 'undefined' &&
247 parseFloat(opera.version()) < 9) ||
248 (ua.indexOf('AppleWebKit') != -1 &&
249 self.getStyle(elem, 'position') == 'absolute')) {
250
251 c.x -= b.offsetLeft;
252 c.y -= b.offsetTop;
253
254 }
255
256 // Adjust position for strange Opera scroll bug
257 if (elem.parentNode) {
258 parent = elem.parentNode;
259 } else {
260 parent = null;
261 }
262 while (parent) {
263 var tagName = parent.tagName.toUpperCase();
264 if (tagName === 'BODY' || tagName === 'HTML') {
265 break;
266 }
267 var disp = self.getStyle(parent, 'display');
268 // Handle strange Opera bug for some display
269 if (disp.search(/^inline|table-row.*$/i)) {
270 c.x -= parent.scrollLeft;
271 c.y -= parent.scrollTop;
272 }
273 if (parent.parentNode) {
274 parent = parent.parentNode;
275 } else {
276 parent = null;
277 }
278 }
279 }
280
281 if (relativeTo) {
282 relativeTo = arguments.callee(relativeTo);
283 if (relativeTo) {
284 c.x -= (relativeTo.x || 0);
285 c.y -= (relativeTo.y || 0);
286 }
287 }
288
289 return c;
290 },
291
292 /** @id MochiKit.Style.setElementPosition */
293 setElementPosition: function (elem, newPos/* optional */, units) {
294 elem = MochiKit.DOM.getElement(elem);
295 if (typeof(units) == 'undefined') {
296 units = 'px';
297 }
298 var newStyle = {};
299 var isUndefNull = MochiKit.Base.isUndefinedOrNull;
300 if (!isUndefNull(newPos.x)) {
301 newStyle['left'] = newPos.x + units;
302 }
303 if (!isUndefNull(newPos.y)) {
304 newStyle['top'] = newPos.y + units;
305 }
306 MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle});
307 },
308
309 /** @id MochiKit.Style.makePositioned */
310 makePositioned: function (element) {
311 element = MochiKit.DOM.getElement(element);
312 var pos = MochiKit.Style.getStyle(element, 'position');
313 if (pos == 'static' || !pos) {
314 element.style.position = 'relative';
315 // Opera returns the offset relative to the positioning context,
316 // when an element is position relative but top and left have
317 // not been defined
318 if (/Opera/.test(navigator.userAgent)) {
319 element.style.top = 0;
320 element.style.left = 0;
321 }
322 }
323 },
324
325 /** @id MochiKit.Style.undoPositioned */
326 undoPositioned: function (element) {
327 element = MochiKit.DOM.getElement(element);
328 if (element.style.position == 'relative') {
329 element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = '';
330 }
331 },
332
333 /** @id MochiKit.Style.makeClipping */
334 makeClipping: function (element) {
335 element = MochiKit.DOM.getElement(element);
336 var s = element.style;
337 var oldOverflow = { 'overflow': s.overflow,
338 'overflow-x': s.overflowX,
339 'overflow-y': s.overflowY };
340 if ((MochiKit.Style.getStyle(element, 'overflow') || 'visible') != 'hidden') {
341 element.style.overflow = 'hidden';
342 element.style.overflowX = 'hidden';
343 element.style.overflowY = 'hidden';
344 }
345 return oldOverflow;
346 },
347
348 /** @id MochiKit.Style.undoClipping */
349 undoClipping: function (element, overflow) {
350 element = MochiKit.DOM.getElement(element);
351 if (typeof(overflow) == 'string') {
352 element.style.overflow = overflow;
353 } else if (overflow != null) {
354 element.style.overflow = overflow['overflow'];
355 element.style.overflowX = overflow['overflow-x'];
356 element.style.overflowY = overflow['overflow-y'];
357 }
358 },
359
360 /** @id MochiKit.Style.getElementDimensions */
361 getElementDimensions: function (elem, contentSize/*optional*/) {
362 var self = MochiKit.Style;
363 var dom = MochiKit.DOM;
364 if (typeof(elem.w) == 'number' || typeof(elem.h) == 'number') {
365 return new self.Dimensions(elem.w || 0, elem.h || 0);
366 }
367 elem = dom.getElement(elem);
368 if (!elem) {
369 return undefined;
370 }
371 var disp = self.getStyle(elem, 'display');
372 // display can be empty/undefined on WebKit/KHTML
373 if (disp == 'none' || disp == '' || typeof(disp) == 'undefined') {
374 var s = elem.style;
375 var originalVisibility = s.visibility;
376 var originalPosition = s.position;
377 var originalDisplay = s.display;
378 s.visibility = 'hidden';
379 s.position = 'absolute';
380 s.display = self._getDefaultDisplay(elem);
381 var originalWidth = elem.offsetWidth;
382 var originalHeight = elem.offsetHeight;
383 s.display = originalDisplay;
384 s.position = originalPosition;
385 s.visibility = originalVisibility;
386 } else {
387 originalWidth = elem.offsetWidth || 0;
388 originalHeight = elem.offsetHeight || 0;
389 }
390 if (contentSize) {
391 var tableCell = 'colSpan' in elem && 'rowSpan' in elem;
392 var collapse = (tableCell && elem.parentNode && self.getStyle(
393 elem.parentNode, 'borderCollapse') == 'collapse')
394 if (collapse) {
395 if (/MSIE/.test(navigator.userAgent)) {
396 var borderLeftQuota = elem.previousSibling? 0.5 : 1;
397 var borderRightQuota = elem.nextSibling? 0.5 : 1;
398 }
399 else {
400 var borderLeftQuota = 0.5;
401 var borderRightQuota = 0.5;
402 }
403 } else {
404 var borderLeftQuota = 1;
405 var borderRightQuota = 1;
406 }
407 originalWidth -= Math.round(
408 (parseFloat(self.getStyle(elem, 'paddingLeft')) || 0)
409 + (parseFloat(self.getStyle(elem, 'paddingRight')) || 0)
410 + borderLeftQuota *
411 (parseFloat(self.getStyle(elem, 'borderLeftWidth')) || 0)
412 + borderRightQuota *
413 (parseFloat(self.getStyle(elem, 'borderRightWidth')) || 0)
414 );
415 if (tableCell) {
416 if (/Gecko|Opera/.test(navigator.userAgent)
417 && !/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)) {
418 var borderHeightQuota = 0;
419 } else if (/MSIE/.test(navigator.userAgent)) {
420 var borderHeightQuota = 1;
421 } else {
422 var borderHeightQuota = collapse? 0.5 : 1;
423 }
424 } else {
425 var borderHeightQuota = 1;
426 }
427 originalHeight -= Math.round(
428 (parseFloat(self.getStyle(elem, 'paddingTop')) || 0)
429 + (parseFloat(self.getStyle(elem, 'paddingBottom')) || 0)
430 + borderHeightQuota * (
431 (parseFloat(self.getStyle(elem, 'borderTopWidth')) || 0)
432 + (parseFloat(self.getStyle(elem, 'borderBottomWidth')) || 0))
433 );
434 }
435 return new self.Dimensions(originalWidth, originalHeight);
436 },
437
438 /** @id MochiKit.Style.setElementDimensions */
439 setElementDimensions: function (elem, newSize/* optional */, units) {
440 elem = MochiKit.DOM.getElement(elem);
441 if (typeof(units) == 'undefined') {
442 units = 'px';
443 }
444 var newStyle = {};
445 var isUndefNull = MochiKit.Base.isUndefinedOrNull;
446 if (!isUndefNull(newSize.w)) {
447 newStyle['width'] = newSize.w + units;
448 }
449 if (!isUndefNull(newSize.h)) {
450 newStyle['height'] = newSize.h + units;
451 }
452 MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle});
453 },
454
455 _getDefaultDisplay: function (elem) {
456 var self = MochiKit.Style;
457 var dom = MochiKit.DOM;
458 elem = dom.getElement(elem);
459 if (!elem) {
460 return undefined;
461 }
462 var tagName = elem.tagName.toUpperCase();
463 return self._defaultDisplay[tagName] || 'block';
464 },
465
466 /** @id MochiKit.Style.setDisplayForElement */
467 setDisplayForElement: function (display, element/*, ...*/) {
468 var elements = MochiKit.Base.extend(null, arguments, 1);
469 var getElement = MochiKit.DOM.getElement;
470 for (var i = 0; i < elements.length; i++) {
471 element = getElement(elements[i]);
472 if (element) {
473 element.style.display = display;
474 }
475 }
476 },
477
478 /** @id MochiKit.Style.getViewportDimensions */
479 getViewportDimensions: function () {
480 var d = new MochiKit.Style.Dimensions();
481 var w = MochiKit.DOM._window;
482 var b = MochiKit.DOM._document.body;
483 if (w.innerWidth) {
484 d.w = w.innerWidth;
485 d.h = w.innerHeight;
486 } else if (b && b.parentElement && b.parentElement.clientWidth) {
487 d.w = b.parentElement.clientWidth;
488 d.h = b.parentElement.clientHeight;
489 } else if (b && b.clientWidth) {
490 d.w = b.clientWidth;
491 d.h = b.clientHeight;
492 }
493 return d;
494 },
495
496 /** @id MochiKit.Style.getViewportPosition */
497 getViewportPosition: function () {
498 var c = new MochiKit.Style.Coordinates(0, 0);
499 var d = MochiKit.DOM._document;
500 var de = d.documentElement;
501 var db = d.body;
502 if (de && (de.scrollTop || de.scrollLeft)) {
503 c.x = de.scrollLeft;
504 c.y = de.scrollTop;
505 } else if (db) {
506 c.x = db.scrollLeft;
507 c.y = db.scrollTop;
508 }
509 return c;
510 },
511
512 __new__: function () {
513 var m = MochiKit.Base;
514
515 var inlines = ['A','ABBR','ACRONYM','B','BASEFONT','BDO','BIG','BR',
516 'CITE','CODE','DFN','EM','FONT','I','IMG','KBD','LABEL',
517 'Q','S','SAMP','SMALL','SPAN','STRIKE','STRONG','SUB',
518 'SUP','TEXTAREA','TT','U','VAR'];
519 this._defaultDisplay = { 'TABLE': 'table',
520 'THEAD': 'table-header-group',
521 'TBODY': 'table-row-group',
522 'TFOOT': 'table-footer-group',
523 'COLGROUP': 'table-column-group',
524 'COL': 'table-column',
525 'TR': 'table-row',
526 'TD': 'table-cell',
527 'TH': 'table-cell',
528 'CAPTION': 'table-caption',
529 'LI': 'list-item',
530 'INPUT': 'inline-block',
531 'SELECT': 'inline-block' };
532 // CSS 'display' support in IE6/7 is just broken...
533 if (/MSIE/.test(navigator.userAgent)) {
534 for (var k in this._defaultDisplay) {
535 var v = this._defaultDisplay[k];
536 if (v.indexOf('table') == 0) {
537 this._defaultDisplay[k] = 'block';
538 }
539 }
540 }
541 for (var i = 0; i < inlines.length; i++) {
542 this._defaultDisplay[inlines[i]] = 'inline';
543 }
544
545 // Backwards compatibility aliases
546 m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.3');
547 m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.3');
548
549 this.hideElement = m.partial(this.setDisplayForElement, 'none');
550 // TODO: showElement could be improved by using getDefaultDisplay.
551 this.showElement = m.partial(this.setDisplayForElement, 'block');
552
553 m.nameFunctions(this);
554 }
555});
556
557MochiKit.Style.__new__();
558MochiKit.Base._exportSymbols(this, MochiKit.Style);
diff --git a/frontend/gamma/js/MochiKit/Test.js b/frontend/gamma/js/MochiKit/Test.js
new file mode 100644
index 0000000..9520ab2
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Test.js
@@ -0,0 +1,144 @@
1/***
2
3MochiKit.Test 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Test', '1.5', ['Base']);
12
13MochiKit.Test.runTests = function (obj) {
14 if (typeof(obj) == "string") {
15 // TODO: Remove this temporary API change advertisement
16 throw new TypeError("Automatic module import not supported, call runTests() with proper object: " + obj);
17 }
18 var suite = new MochiKit.Test.Suite();
19 suite.run(obj);
20};
21
22MochiKit.Test.Suite = function () {
23 this.testIndex = 0;
24 MochiKit.Base.bindMethods(this);
25};
26
27MochiKit.Test.Suite.prototype = {
28 run: function (obj) {
29 try {
30 obj(this);
31 } catch (e) {
32 this.traceback(e);
33 }
34 },
35 traceback: function (e) {
36 var items = MochiKit.Iter.sorted(MochiKit.Base.items(e));
37 print("not ok " + this.testIndex + " - Error thrown");
38 for (var i = 0; i < items.length; i++) {
39 var kv = items[i];
40 if (kv[0] == "stack") {
41 kv[1] = kv[1].split(/\n/)[0];
42 }
43 this.print("# " + kv.join(": "));
44 }
45 },
46 print: function (s) {
47 print(s);
48 },
49 is: function (got, expected, /* optional */message) {
50 var res = 1;
51 var msg = null;
52 try {
53 res = MochiKit.Base.compare(got, expected);
54 } catch (e) {
55 msg = "Can not compare " + typeof(got) + ":" + typeof(expected);
56 }
57 if (res) {
58 msg = "Expected value did not compare equal";
59 }
60 if (!res) {
61 return this.testResult(true, message);
62 }
63 return this.testResult(false, message,
64 [[msg], ["got:", got], ["expected:", expected]]);
65 },
66
67 testResult: function (pass, msg, failures) {
68 this.testIndex += 1;
69 if (pass) {
70 this.print("ok " + this.testIndex + " - " + msg);
71 return;
72 }
73 this.print("not ok " + this.testIndex + " - " + msg);
74 if (failures) {
75 for (var i = 0; i < failures.length; i++) {
76 this.print("# " + failures[i].join(" "));
77 }
78 }
79 },
80
81 isDeeply: function (got, expected, /* optional */message) {
82 var m = MochiKit.Base;
83 var res = 1;
84 try {
85 res = m.compare(got, expected);
86 } catch (e) {
87 // pass
88 }
89 if (res === 0) {
90 return this.ok(true, message);
91 }
92 var gk = m.keys(got);
93 var ek = m.keys(expected);
94 gk.sort();
95 ek.sort();
96 if (m.compare(gk, ek)) {
97 // differing keys
98 var cmp = {};
99 var i;
100 for (i = 0; i < gk.length; i++) {
101 cmp[gk[i]] = "got";
102 }
103 for (i = 0; i < ek.length; i++) {
104 if (ek[i] in cmp) {
105 delete cmp[ek[i]];
106 } else {
107 cmp[ek[i]] = "expected";
108 }
109 }
110 var diffkeys = m.keys(cmp);
111 diffkeys.sort();
112 var gotkeys = [];
113 var expkeys = [];
114 while (diffkeys.length) {
115 var k = diffkeys.shift();
116 if (k in Object.prototype) {
117 continue;
118 }
119 (cmp[k] == "got" ? gotkeys : expkeys).push(k);
120 }
121
122
123 }
124
125 return this.testResult((!res), msg,
126 (msg ? [["got:", got], ["expected:", expected]] : undefined)
127 );
128 },
129
130 ok: function (res, message) {
131 return this.testResult(res, message);
132 }
133};
134
135MochiKit.Test.__new__ = function () {
136 var m = MochiKit.Base;
137 this.Suite.__export__ = false;
138 m.nameFunctions(this);
139
140};
141
142MochiKit.Test.__new__();
143
144MochiKit.Base._exportSymbols(this, MochiKit.Test);
diff --git a/frontend/gamma/js/MochiKit/Text.js b/frontend/gamma/js/MochiKit/Text.js
new file mode 100644
index 0000000..a44f7e4
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Text.js
@@ -0,0 +1,577 @@
1/***
2
3MochiKit.Text 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2008 Per Cederberg. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Text', '1.5', ['Base', 'Format']);
12
13/**
14 * Checks if a text string starts with the specified substring. If
15 * either of the two strings is null, false will be returned.
16 *
17 * @param {String} substr the substring to search for
18 * @param {String} str the string to search in
19 *
20 * @return {Boolean} true if the string starts with the substring, or
21 * false otherwise
22 */
23MochiKit.Text.startsWith = function (substr, str) {
24 return str != null && substr != null && str.indexOf(substr) == 0;
25}
26
27/**
28 * Checks if a text string ends with the specified substring. If
29 * either of the two strings is null, false will be returned.
30 *
31 * @param {String} substr the substring to search for
32 * @param {String} str the string to search in
33 *
34 * @return {Boolean} true if the string ends with the substring, or
35 * false otherwise
36 */
37MochiKit.Text.endsWith = function (substr, str) {
38 return str != null && substr != null &&
39 str.lastIndexOf(substr) == Math.max(str.length - substr.length, 0);
40}
41
42/**
43 * Checks if a text string contains the specified substring. If
44 * either of the two strings is null, false will be returned.
45 *
46 * @param {String} substr the substring to search for
47 * @param {String} str the string to search in
48 *
49 * @return {Boolean} true if the string contains the substring, or
50 * false otherwise
51 */
52MochiKit.Text.contains = function (substr, str) {
53 return str != null && substr != null && str.indexOf(substr) >= 0;
54}
55
56/**
57 * Adds a character to the left-hand side of a string until it
58 * reaches the specified minimum length.
59 *
60 * @param {String} str the string to process
61 * @param {Number} minLength the requested minimum length
62 * @param {String} fillChar the padding character to add, defaults
63 * to a space
64 *
65 * @return {String} the padded string
66 */
67MochiKit.Text.padLeft = function (str, minLength, fillChar) {
68 str = str || "";
69 fillChar = fillChar || " ";
70 while (str.length < minLength) {
71 str = fillChar + str;
72 }
73 return str;
74}
75
76/**
77 * Adds a character to the right-hand side of a string until it
78 * reaches the specified minimum length.
79 *
80 * @param {String} str the string to process
81 * @param {Number} minLength the requested minimum length
82 * @param {String} fillChar the padding character to add, defaults
83 * to a space
84 *
85 * @return {String} the padded string
86 */
87MochiKit.Text.padRight = function (str, minLength, fillChar) {
88 str = str || "";
89 fillChar = fillChar || " ";
90 while (str.length < minLength) {
91 str += fillChar;
92 }
93 return str;
94}
95
96/**
97 * Returns a truncated copy of a string. If the string is shorter
98 * than the specified maximum length, the object will be returned
99 * unmodified. If an optional tail string is specified, additional
100 * elements will be removed in order to accomodate the tail (that
101 * will be appended). This function also works on arrays.
102 *
103 * @param {String} str the string to truncate
104 * @param {Number} maxLength the maximum length
105 * @param {String} [tail] the tail to append on truncation
106 *
107 * @return {String} the truncated string
108 */
109MochiKit.Text.truncate = function (str, maxLength, tail) {
110 if (str == null || str.length <= maxLength || maxLength < 0) {
111 return str;
112 } else if (tail != null) {
113 str = str.slice(0, Math.max(0, maxLength - tail.length));
114 if (typeof(str) == "string") {
115 return str + tail;
116 } else {
117 return MochiKit.Base.extend(str, tail);
118 }
119 } else {
120 return str.slice(0, maxLength);
121 }
122}
123
124/**
125 * Splits a text string, applies a function and joins the results
126 * back together again. This is a convenience function for calling
127 * split(), map() and join() separately. It can be used to easily
128 * trim each line in a text string (using the strip function), or to
129 * translate a text word-by-word.
130 *
131 * @param {Function} func the function to apply
132 * @param {String} str the string to split
133 * @param {String} [separator] the separator character to use,
134 * defaults to newline
135 *
136 * @return {String} a string with the joined up results
137 */
138MochiKit.Text.splitJoin = function (func, str, separator) {
139 if (str == null || str.length == 0) {
140 return str;
141 }
142 separator = separator || '\n'
143 return MochiKit.Base.map(func, str.split(separator)).join(separator);
144}
145
146/**
147 * Creates a formatter function for the specified formatter pattern
148 * and locale. The returned function takes as many arguments as the
149 * formatter pattern requires. See separate documentation for
150 * information about the formatter pattern syntax.
151 *
152 * @param {String} pattern the formatter pattern string
153 * @param {Object} [locale] the locale to use, defaults to
154 * LOCALE.en_US
155 *
156 * @return {Function} the formatter function created
157 *
158 * @throws FormatPatternError if the format pattern was invalid
159 */
160MochiKit.Text.formatter = function (pattern, locale) {
161 if (typeof(locale) == "undefined") {
162 locale = MochiKit.Format.formatLocale();
163 } else if (typeof(locale) == "string") {
164 locale = MochiKit.Format.formatLocale(locale);
165 }
166 var parts = MochiKit.Text._parsePattern(pattern);
167 return function() {
168 var values = MochiKit.Base.extend([], arguments);
169 var res = [];
170 for (var i = 0; i < parts.length; i++) {
171 if (typeof(parts[i]) == "string") {
172 res.push(parts[i]);
173 } else {
174 res.push(MochiKit.Text.formatValue(parts[i], values, locale));
175 }
176 }
177 return res.join("");
178 }
179}
180
181/**
182 * Formats the specified arguments according to a formatter pattern.
183 * See separate documentation for information about the formatter
184 * pattern syntax.
185 *
186 * @param {String} pattern the formatter pattern string
187 * @param {Object} [...] the optional values to format
188 *
189 * @return {String} the formatted output string
190 *
191 * @throws FormatPatternError if the format pattern was invalid
192 */
193MochiKit.Text.format = function (pattern/*, ...*/) {
194 var func = MochiKit.Text.formatter(pattern);
195 return func.apply(this, MochiKit.Base.extend([], arguments, 1));
196}
197
198/**
199 * Format a value with the specified format specifier.
200 *
201 * @param {String/Object} spec the format specifier string or parsed
202 * format specifier object
203 * @param {Object} value the value to format
204 * @param {Object} [locale] the locale to use, defaults to
205 * LOCALE.en_US
206 *
207 * @return {String} the formatted output string
208 */
209MochiKit.Text.formatValue = function (spec, value, locale) {
210 var self = MochiKit.Text;
211 if (typeof(spec) === "string") {
212 spec = self._parseFormatFlags(spec, 0, spec.length - 1);
213 }
214 for (var i = 0; spec.path != null && i < spec.path.length; i++) {
215 if (value != null) {
216 value = value[spec.path[i]];
217 }
218 }
219 if (typeof(locale) == "undefined") {
220 locale = MochiKit.Format.formatLocale();
221 } else if (typeof(locale) == "string") {
222 locale = MochiKit.Format.formatLocale(locale);
223 }
224 var str = "";
225 if (spec.numeric) {
226 if (typeof(value) != "number" || isNaN(value)) {
227 str = "";
228 } else if (value === Number.POSITIVE_INFINITY) {
229 str = "\u221e";
230 } else if (value === Number.NEGATIVE_INFINITY) {
231 str = "-\u221e";
232 } else {
233 var sign = (spec.sign === "-") ? "" : spec.sign;
234 sign = (value < 0) ? "-" : sign;
235 value = Math.abs(value);
236 if (spec.format === "%") {
237 str = self._truncToPercent(value, spec.precision);
238 } else if (spec.format === "d") {
239 str = MochiKit.Format.roundToFixed(value, 0);
240 } else if (spec.radix != 10) {
241 str = Math.floor(value).toString(spec.radix);
242 if (spec.format === "x") {
243 str = str.toLowerCase();
244 } else if (spec.format === "X") {
245 str = str.toUpperCase();
246 }
247 } else if (spec.precision >= 0) {
248 str = MochiKit.Format.roundToFixed(value, spec.precision);
249 } else {
250 str = value.toString();
251 }
252 if (spec.padding === "0" && spec.format === "%") {
253 str = self.padLeft(str, spec.width - sign.length - 1, "0");
254 } else if (spec.padding == "0") {
255 str = self.padLeft(str, spec.width - sign.length, "0");
256 }
257 str = self._localizeNumber(str, locale, spec.grouping);
258 str = sign + str;
259 }
260 if (str !== "" && spec.format === "%") {
261 str = str + locale.percent;
262 }
263 } else {
264 if (spec.format == "r") {
265 str = MochiKit.Base.repr(value);
266 } else {
267 str = (value == null) ? "null" : value.toString();
268 }
269 str = self.truncate(str, spec.precision);
270 }
271 if (spec.align == "<") {
272 str = self.padRight(str, spec.width);
273 } else {
274 str = self.padLeft(str, spec.width);
275 }
276 return str;
277}
278
279/**
280 * Adjust an already formatted numeric string for locale-specific
281 * grouping and decimal separators. The grouping is optional and
282 * will attempt to keep the number string length intact by removing
283 * padded zeros (if possible).
284 *
285 * @param {String} num the formatted number string
286 * @param {Object} locale the formatting locale to use
287 * @param {Boolean} grouping the grouping flag
288 *
289 * @return {String} the localized number string
290 */
291MochiKit.Text._localizeNumber = function (num, locale, grouping) {
292 var parts = num.split(/\./);
293 var whole = parts[0];
294 var frac = (parts.length == 1) ? "" : parts[1];
295 var res = (frac.length > 0) ? locale.decimal : "";
296 while (grouping && frac.length > 3) {
297 res = res + frac.substring(0, 3) + locale.separator;
298 frac = frac.substring(3);
299 if (whole.charAt(0) == "0") {
300 whole = whole.substring(1);
301 }
302 }
303 if (frac.length > 0) {
304 res += frac;
305 }
306 while (grouping && whole.length > 3) {
307 var pos = whole.length - 3;
308 res = locale.separator + whole.substring(pos) + res;
309 whole = whole.substring((whole.charAt(0) == "0") ? 1 : 0, pos);
310 }
311 return whole + res;
312}
313
314/**
315 * Parses a format pattern and returns an array of constant strings
316 * and format info objects.
317 *
318 * @param {String} pattern the format pattern to analyze
319 *
320 * @return {Array} an array of strings and format info objects
321 *
322 * @throws FormatPatternError if the format pattern was invalid
323 */
324MochiKit.Text._parsePattern = function (pattern) {
325 var self = MochiKit.Text;
326 var parts = [];
327 var start = 0;
328 var pos = 0;
329 for (pos = 0; pos < pattern.length; pos++) {
330 if (pattern.charAt(pos) == "{") {
331 if (pos + 1 >= pattern.length) {
332 var msg = "unescaped { char, should be escaped as {{";
333 throw new self.FormatPatternError(pattern, pos, msg);
334 } else if (pattern.charAt(pos + 1) == "{") {
335 parts.push(pattern.substring(start, pos + 1));
336 start = pos + 2;
337 pos++;
338 } else {
339 if (start < pos) {
340 parts.push(pattern.substring(start, pos));
341 }
342 start = pattern.indexOf("}", pos) + 1;
343 if (start <= 0) {
344 var msg = "unmatched { char, not followed by a } char";
345 throw new self.FormatPatternError(pattern, pos, msg);
346 }
347 parts.push(self._parseFormat(pattern, pos + 1, start - 1));
348 pos = start - 1;
349 }
350 } else if (pattern.charAt(pos) == "}") {
351 if (pos + 1 >= pattern.length || pattern.charAt(pos + 1) != "}") {
352 var msg = "unescaped } char, should be escaped as }}";
353 throw new self.FormatPatternError(pattern, pos, msg);
354 }
355 parts.push(pattern.substring(start, pos + 1));
356 start = pos + 2;
357 pos++;
358 }
359 }
360 if (start < pos) {
361 parts.push(pattern.substring(start, pos));
362 }
363 return parts;
364}
365
366/**
367 * Parses a format instruction and returns a format info object.
368 *
369 * @param {String} pattern the format pattern string
370 * @param {Number} startPos the first index of the format instruction
371 * @param {Number} endPos the last index of the format instruction
372 *
373 * @return {Object} the format info object
374 *
375 * @throws FormatPatternError if the format pattern was invalid
376 */
377MochiKit.Text._parseFormat = function (pattern, startPos, endPos) {
378 var self = MochiKit.Text;
379 var text = pattern.substring(startPos, endPos);
380 var info;
381 var pos = text.indexOf(":");
382 if (pos == 0) {
383 info = self._parseFormatFlags(pattern, startPos + 1, endPos);
384 info.path = [0];
385 } else if (pos > 0) {
386 info = self._parseFormatFlags(pattern, startPos + pos + 1, endPos);
387 info.path = text.substring(0, pos).split(".");
388 } else {
389 info = self._parseFormatFlags(pattern, endPos, endPos);
390 info.path = text.split(".");
391 }
392 var DIGITS = /^\d+$/;
393 for (var i = 0; i < info.path.length; i++) {
394 var e = info.path[i];
395 if (typeof(e) == "string") {
396 // TODO: replace with MochiKit.Format.strip?
397 e = e.replace(/^\s+/, "").replace(/\s+$/, "");
398 if (e == "" && info.path.length == 1) {
399 e = 0;
400 } else if (e == "") {
401 var msg = "format value path contains blanks";
402 throw new self.FormatPatternError(pattern, startPos, msg);
403 } else if (DIGITS.test(e)) {
404 e = parseInt(e);
405 }
406 }
407 info.path[i] = e;
408 }
409 if (info.path.length < 0 || typeof(info.path[0]) != "number") {
410 info.path.unshift(0);
411 }
412 return info;
413}
414
415/**
416 * Parses a string with format flags and returns a format info object.
417 *
418 * @param {String} pattern the format pattern string
419 * @param {Number} startPos the first index of the format instruction
420 * @param {Number} endPos the last index of the format instruction
421 *
422 * @return {Object} the format info object
423 *
424 * @throws FormatPatternError if the format pattern was invalid
425 */
426MochiKit.Text._parseFormatFlags = function (pattern, startPos, endPos) {
427 var self = MochiKit.Text;
428 var info = { numeric: false, format: "s", width: 0, precision: -1,
429 align: ">", sign: "-", padding: " ", grouping: false };
430 // TODO: replace with MochiKit.Format.rstrip?
431 var flags = pattern.substring(startPos, endPos).replace(/\s+$/, "");
432 while (flags.length > 0) {
433 switch (flags.charAt(0)) {
434 case ">":
435 case "<":
436 info.align = flags.charAt(0);
437 flags = flags.substring(1);
438 break;
439 case "+":
440 case "-":
441 case " ":
442 info.sign = flags.charAt(0);
443 flags = flags.substring(1);
444 break;
445 case ",":
446 info.grouping = true;
447 flags = flags.substring(1);
448 break;
449 case ".":
450 var chars = /^\d*/.exec(flags.substring(1))[0];
451 info.precision = parseInt(chars);
452 flags = flags.substring(1 + chars.length);
453 break;
454 case "0":
455 info.padding = flags.charAt(0);
456 flags = flags.substring(1);
457 break;
458 case "1":
459 case "2":
460 case "3":
461 case "4":
462 case "5":
463 case "6":
464 case "7":
465 case "8":
466 case "9":
467 var chars = /^\d*/.exec(flags)[0];
468 info.width = parseInt(chars);
469 flags = flags.substring(chars.length);
470 break;
471 case "s":
472 case "r":
473 info.format = flags.charAt(0);
474 flags = flags.substring(1);
475 break;
476 case "b":
477 case "d":
478 case "o":
479 case "x":
480 case "X":
481 case "f":
482 case "%":
483 info.numeric = true;
484 info.format = flags.charAt(0);
485 info.radix = 10;
486 if (info.format === "b") {
487 info.radix = 2;
488 } else if (info.format === "o") {
489 info.radix = 8;
490 } else if (info.format === "x" || info.format === "X") {
491 info.radix = 16;
492 }
493 flags = flags.substring(1);
494 break;
495 default:
496 var msg = "unsupported format flag: " + flags.charAt(0);
497 throw new self.FormatPatternError(pattern, startPos, msg);
498 }
499 }
500 return info;
501}
502
503/**
504 * Formats a value as a percentage. This method avoids multiplication
505 * by 100 since it leads to weird numeric rounding errors. Instead it
506 * just move the decimal separator in the text string. It is ugly,
507 * but works...
508 *
509 * @param {Number} value the value to format
510 * @param {Number} precision the number of precision digits
511 */
512MochiKit.Text._truncToPercent = function (value, precision) {
513 // TODO: This can be simplified by using the same helper function
514 // as roundToFixed now does.
515 var str;
516 if (precision >= 0) {
517 str = MochiKit.Format.roundToFixed(value, precision + 2);
518 } else {
519 str = (value == null) ? "0" : value.toString();
520 }
521 var fracPos = str.indexOf(".");
522 if (fracPos < 0) {
523 str = str + "00";
524 } else if (fracPos + 3 >= str.length) {
525 var fraction = str.substring(fracPos + 1);
526 while (fraction.length < 2) {
527 fraction = fraction + "0";
528 }
529 str = str.substring(0, fracPos) + fraction;
530 } else {
531 var fraction = str.substring(fracPos + 1);
532 str = str.substring(0, fracPos) + fraction.substring(0, 2) +
533 "." + fraction.substring(2);
534 }
535 while (str.length > 1 && str.charAt(0) == "0" && str.charAt(1) != ".") {
536 str = str.substring(1);
537 }
538 return str;
539}
540
541/**
542 * Creates a new format pattern error.
543 *
544 * @param {String} pattern the format pattern string
545 * @param {Number} pos the position of the error
546 * @param {String} message the error message text
547 *
548 * @return {Error} the format pattern error
549 *
550 * @class The format pattern error class. This error is thrown when
551 * a syntax error is encountered inside a format string.
552 * @property {String} pattern The format pattern string.
553 * @property {Number} pos The position of the error.
554 * @property {String} message The error message text.
555 * @extends MochiKit.Base.NamedError
556 */
557MochiKit.Text.FormatPatternError = function (pattern, pos, message) {
558 this.pattern = pattern;
559 this.pos = pos;
560 this.message = message;
561}
562MochiKit.Text.FormatPatternError.prototype =
563 new MochiKit.Base.NamedError("MochiKit.Text.FormatPatternError");
564
565
566//
567//XXX: Internet Explorer exception handling blows
568//
569if (MochiKit.__export__) {
570 formatter = MochiKit.Text.formatter;
571 format = MochiKit.Text.format;
572 formatValue = MochiKit.Text.formatValue;
573}
574
575
576MochiKit.Base.nameFunctions(MochiKit.Text);
577MochiKit.Base._exportSymbols(this, MochiKit.Text);
diff --git a/frontend/gamma/js/MochiKit/Visual.js b/frontend/gamma/js/MochiKit/Visual.js
new file mode 100644
index 0000000..648d82a
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/Visual.js
@@ -0,0 +1,1975 @@
1/***
2
3MochiKit.Visual 1.5
4
5See <http://mochikit.com/> for documentation, downloads, license, etc.
6
7(c) 2005 Bob Ippolito and others. All rights Reserved.
8
9***/
10
11MochiKit.Base._module('Visual', '1.5', ['Base', 'DOM', 'Style', 'Color', 'Position']);
12
13MochiKit.Visual._RoundCorners = function (e, options) {
14 e = MochiKit.DOM.getElement(e);
15 this._setOptions(options);
16 if (this.options.__unstable__wrapElement) {
17 e = this._doWrap(e);
18 }
19
20 var color = this.options.color;
21 var C = MochiKit.Color.Color;
22 if (this.options.color === "fromElement") {
23 color = C.fromBackground(e);
24 } else if (!(color instanceof C)) {
25 color = C.fromString(color);
26 }
27 this.isTransparent = (color.asRGB().a <= 0);
28
29 var bgColor = this.options.bgColor;
30 if (this.options.bgColor === "fromParent") {
31 bgColor = C.fromBackground(e.offsetParent);
32 } else if (!(bgColor instanceof C)) {
33 bgColor = C.fromString(bgColor);
34 }
35
36 this._roundCornersImpl(e, color, bgColor);
37};
38
39MochiKit.Visual._RoundCorners.prototype = {
40 _doWrap: function (e) {
41 var parent = e.parentNode;
42 var doc = MochiKit.DOM.currentDocument();
43 if (typeof(doc.defaultView) === "undefined"
44 || doc.defaultView === null) {
45 return e;
46 }
47 var style = doc.defaultView.getComputedStyle(e, null);
48 if (typeof(style) === "undefined" || style === null) {
49 return e;
50 }
51 var wrapper = MochiKit.DOM.DIV({"style": {
52 display: "block",
53 // convert padding to margin
54 marginTop: style.getPropertyValue("padding-top"),
55 marginRight: style.getPropertyValue("padding-right"),
56 marginBottom: style.getPropertyValue("padding-bottom"),
57 marginLeft: style.getPropertyValue("padding-left"),
58 // remove padding so the rounding looks right
59 padding: "0px"
60 /*
61 paddingRight: "0px",
62 paddingLeft: "0px"
63 */
64 }});
65 wrapper.innerHTML = e.innerHTML;
66 e.innerHTML = "";
67 e.appendChild(wrapper);
68 return e;
69 },
70
71 _roundCornersImpl: function (e, color, bgColor) {
72 if (this.options.border) {
73 this._renderBorder(e, bgColor);
74 }
75 if (this._isTopRounded()) {
76 this._roundTopCorners(e, color, bgColor);
77 }
78 if (this._isBottomRounded()) {
79 this._roundBottomCorners(e, color, bgColor);
80 }
81 },
82
83 _renderBorder: function (el, bgColor) {
84 var borderValue = "1px solid " + this._borderColor(bgColor);
85 var borderL = "border-left: " + borderValue;
86 var borderR = "border-right: " + borderValue;
87 var style = "style='" + borderL + ";" + borderR + "'";
88 el.innerHTML = "<div " + style + ">" + el.innerHTML + "</div>";
89 },
90
91 _roundTopCorners: function (el, color, bgColor) {
92 var corner = this._createCorner(bgColor);
93 for (var i = 0; i < this.options.numSlices; i++) {
94 corner.appendChild(
95 this._createCornerSlice(color, bgColor, i, "top")
96 );
97 }
98 el.style.paddingTop = 0;
99 el.insertBefore(corner, el.firstChild);
100 },
101
102 _roundBottomCorners: function (el, color, bgColor) {
103 var corner = this._createCorner(bgColor);
104 for (var i = (this.options.numSlices - 1); i >= 0; i--) {
105 corner.appendChild(
106 this._createCornerSlice(color, bgColor, i, "bottom")
107 );
108 }
109 el.style.paddingBottom = 0;
110 el.appendChild(corner);
111 },
112
113 _createCorner: function (bgColor) {
114 var dom = MochiKit.DOM;
115 return dom.DIV({style: {backgroundColor: bgColor.toString()}});
116 },
117
118 _createCornerSlice: function (color, bgColor, n, position) {
119 var slice = MochiKit.DOM.SPAN();
120
121 var inStyle = slice.style;
122 inStyle.backgroundColor = color.toString();
123 inStyle.display = "block";
124 inStyle.height = "1px";
125 inStyle.overflow = "hidden";
126 inStyle.fontSize = "1px";
127
128 var borderColor = this._borderColor(color, bgColor);
129 if (this.options.border && n === 0) {
130 inStyle.borderTopStyle = "solid";
131 inStyle.borderTopWidth = "1px";
132 inStyle.borderLeftWidth = "0px";
133 inStyle.borderRightWidth = "0px";
134 inStyle.borderBottomWidth = "0px";
135 // assumes css compliant box model
136 inStyle.height = "0px";
137 inStyle.borderColor = borderColor.toString();
138 } else if (borderColor) {
139 inStyle.borderColor = borderColor.toString();
140 inStyle.borderStyle = "solid";
141 inStyle.borderWidth = "0px 1px";
142 }
143
144 if (!this.options.compact && (n == (this.options.numSlices - 1))) {
145 inStyle.height = "2px";
146 }
147
148 this._setMargin(slice, n, position);
149 this._setBorder(slice, n, position);
150
151 return slice;
152 },
153
154 _setOptions: function (options) {
155 this.options = {
156 corners: "all",
157 color: "fromElement",
158 bgColor: "fromParent",
159 blend: true,
160 border: false,
161 compact: false,
162 __unstable__wrapElement: false
163 };
164 MochiKit.Base.update(this.options, options);
165
166 this.options.numSlices = (this.options.compact ? 2 : 4);
167 },
168
169 _whichSideTop: function () {
170 var corners = this.options.corners;
171 if (this._hasString(corners, "all", "top")) {
172 return "";
173 }
174
175 var has_tl = (corners.indexOf("tl") != -1);
176 var has_tr = (corners.indexOf("tr") != -1);
177 if (has_tl && has_tr) {
178 return "";
179 }
180 if (has_tl) {
181 return "left";
182 }
183 if (has_tr) {
184 return "right";
185 }
186 return "";
187 },
188
189 _whichSideBottom: function () {
190 var corners = this.options.corners;
191 if (this._hasString(corners, "all", "bottom")) {
192 return "";
193 }
194
195 var has_bl = (corners.indexOf('bl') != -1);
196 var has_br = (corners.indexOf('br') != -1);
197 if (has_bl && has_br) {
198 return "";
199 }
200 if (has_bl) {
201 return "left";
202 }
203 if (has_br) {
204 return "right";
205 }
206 return "";
207 },
208
209 _borderColor: function (color, bgColor) {
210 if (color == "transparent") {
211 return bgColor;
212 } else if (this.options.border) {
213 return this.options.border;
214 } else if (this.options.blend) {
215 return bgColor.blendedColor(color);
216 }
217 return "";
218 },
219
220
221 _setMargin: function (el, n, corners) {
222 var marginSize = this._marginSize(n) + "px";
223 var whichSide = (
224 corners == "top" ? this._whichSideTop() : this._whichSideBottom()
225 );
226 var style = el.style;
227
228 if (whichSide == "left") {
229 style.marginLeft = marginSize;
230 style.marginRight = "0px";
231 } else if (whichSide == "right") {
232 style.marginRight = marginSize;
233 style.marginLeft = "0px";
234 } else {
235 style.marginLeft = marginSize;
236 style.marginRight = marginSize;
237 }
238 },
239
240 _setBorder: function (el, n, corners) {
241 var borderSize = this._borderSize(n) + "px";
242 var whichSide = (
243 corners == "top" ? this._whichSideTop() : this._whichSideBottom()
244 );
245
246 var style = el.style;
247 if (whichSide == "left") {
248 style.borderLeftWidth = borderSize;
249 style.borderRightWidth = "0px";
250 } else if (whichSide == "right") {
251 style.borderRightWidth = borderSize;
252 style.borderLeftWidth = "0px";
253 } else {
254 style.borderLeftWidth = borderSize;
255 style.borderRightWidth = borderSize;
256 }
257 },
258
259 _marginSize: function (n) {
260 if (this.isTransparent) {
261 return 0;
262 }
263
264 var o = this.options;
265 if (o.compact && o.blend) {
266 var smBlendedMarginSizes = [1, 0];
267 return smBlendedMarginSizes[n];
268 } else if (o.compact) {
269 var compactMarginSizes = [2, 1];
270 return compactMarginSizes[n];
271 } else if (o.blend) {
272 var blendedMarginSizes = [3, 2, 1, 0];
273 return blendedMarginSizes[n];
274 } else {
275 var marginSizes = [5, 3, 2, 1];
276 return marginSizes[n];
277 }
278 },
279
280 _borderSize: function (n) {
281 var o = this.options;
282 var borderSizes;
283 if (o.compact && (o.blend || this.isTransparent)) {
284 return 1;
285 } else if (o.compact) {
286 borderSizes = [1, 0];
287 } else if (o.blend) {
288 borderSizes = [2, 1, 1, 1];
289 } else if (o.border) {
290 borderSizes = [0, 2, 0, 0];
291 } else if (this.isTransparent) {
292 borderSizes = [5, 3, 2, 1];
293 } else {
294 return 0;
295 }
296 return borderSizes[n];
297 },
298
299 _hasString: function (str) {
300 for (var i = 1; i< arguments.length; i++) {
301 if (str.indexOf(arguments[i]) != -1) {
302 return true;
303 }
304 }
305 return false;
306 },
307
308 _isTopRounded: function () {
309 return this._hasString(this.options.corners,
310 "all", "top", "tl", "tr"
311 );
312 },
313
314 _isBottomRounded: function () {
315 return this._hasString(this.options.corners,
316 "all", "bottom", "bl", "br"
317 );
318 },
319
320 _hasSingleTextChild: function (el) {
321 return (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3);
322 }
323};
324
325/** @id MochiKit.Visual.roundElement */
326MochiKit.Visual.roundElement = function (e, options) {
327 new MochiKit.Visual._RoundCorners(e, options);
328};
329
330/** @id MochiKit.Visual.roundClass */
331MochiKit.Visual.roundClass = function (tagName, className, options) {
332 var elements = MochiKit.DOM.getElementsByTagAndClassName(
333 tagName, className
334 );
335 for (var i = 0; i < elements.length; i++) {
336 MochiKit.Visual.roundElement(elements[i], options);
337 }
338};
339
340/** @id MochiKit.Visual.tagifyText */
341MochiKit.Visual.tagifyText = function (element, /* optional */tagifyStyle) {
342 /***
343
344 Change a node text to character in tags.
345
346 @param tagifyStyle: the style to apply to character nodes, default to
347 'position: relative'.
348
349 ***/
350 tagifyStyle = tagifyStyle || 'position:relative';
351 if (/MSIE/.test(navigator.userAgent)) {
352 tagifyStyle += ';zoom:1';
353 }
354 element = MochiKit.DOM.getElement(element);
355 var ma = MochiKit.Base.map;
356 ma(function (child) {
357 if (child.nodeType == 3) {
358 ma(function (character) {
359 element.insertBefore(
360 MochiKit.DOM.SPAN({style: tagifyStyle},
361 character == ' ' ? String.fromCharCode(160) : character), child);
362 }, child.nodeValue.split(''));
363 MochiKit.DOM.removeElement(child);
364 }
365 }, element.childNodes);
366};
367
368MochiKit.Visual._forceRerendering = function (element) {
369 try {
370 element = MochiKit.DOM.getElement(element);
371 var n = document.createTextNode(' ');
372 element.appendChild(n);
373 element.removeChild(n);
374 } catch(e) {
375 }
376};
377
378/** @id MochiKit.Visual.multiple */
379MochiKit.Visual.multiple = function (elements, effect, /* optional */options) {
380 /***
381
382 Launch the same effect subsequently on given elements.
383
384 ***/
385 options = MochiKit.Base.update({
386 speed: 0.1, delay: 0.0
387 }, options);
388 var masterDelay = options.delay;
389 var index = 0;
390 MochiKit.Base.map(function (innerelement) {
391 options.delay = index * options.speed + masterDelay;
392 new effect(innerelement, options);
393 index += 1;
394 }, elements);
395};
396
397MochiKit.Visual.PAIRS = {
398 'slide': ['slideDown', 'slideUp'],
399 'blind': ['blindDown', 'blindUp'],
400 'appear': ['appear', 'fade'],
401 'size': ['grow', 'shrink']
402};
403
404/** @id MochiKit.Visual.toggle */
405MochiKit.Visual.toggle = function (element, /* optional */effect, /* optional */options) {
406 /***
407
408 Toggle an item between two state depending of its visibility, making
409 a effect between these states. Default effect is 'appear', can be
410 'slide' or 'blind'.
411
412 ***/
413 element = MochiKit.DOM.getElement(element);
414 effect = (effect || 'appear').toLowerCase();
415 options = MochiKit.Base.update({
416 queue: {position: 'end', scope: (element.id || 'global'), limit: 1}
417 }, options);
418 var v = MochiKit.Visual;
419 v[MochiKit.Style.getStyle(element, 'display') != 'none' ?
420 v.PAIRS[effect][1] : v.PAIRS[effect][0]](element, options);
421};
422
423/***
424
425Transitions: define functions calculating variations depending of a position.
426
427***/
428
429MochiKit.Visual.Transitions = { __export__: false };
430
431/** @id MochiKit.Visual.Transitions.linear */
432MochiKit.Visual.Transitions.linear = function (pos) {
433 return pos;
434};
435
436/** @id MochiKit.Visual.Transitions.sinoidal */
437MochiKit.Visual.Transitions.sinoidal = function (pos) {
438 return 0.5 - Math.cos(pos*Math.PI)/2;
439};
440
441/** @id MochiKit.Visual.Transitions.reverse */
442MochiKit.Visual.Transitions.reverse = function (pos) {
443 return 1 - pos;
444};
445
446/** @id MochiKit.Visual.Transitions.flicker */
447MochiKit.Visual.Transitions.flicker = function (pos) {
448 return 0.25 - Math.cos(pos*Math.PI)/4 + Math.random()/2;
449};
450
451/** @id MochiKit.Visual.Transitions.wobble */
452MochiKit.Visual.Transitions.wobble = function (pos) {
453 return 0.5 - Math.cos(9*pos*Math.PI)/2;
454};
455
456/** @id MochiKit.Visual.Transitions.pulse */
457MochiKit.Visual.Transitions.pulse = function (pos, pulses) {
458 if (pulses) {
459 pos *= 2 * pulses;
460 } else {
461 pos *= 10;
462 }
463 var decimals = pos - Math.floor(pos);
464 return (Math.floor(pos) % 2 == 0) ? decimals : 1 - decimals;
465};
466
467/** @id MochiKit.Visual.Transitions.parabolic */
468MochiKit.Visual.Transitions.parabolic = function (pos) {
469 return pos * pos;
470};
471
472/** @id MochiKit.Visual.Transitions.none */
473MochiKit.Visual.Transitions.none = function (pos) {
474 return 0;
475};
476
477/** @id MochiKit.Visual.Transitions.full */
478MochiKit.Visual.Transitions.full = function (pos) {
479 return 1;
480};
481
482/***
483
484Core effects
485
486***/
487
488MochiKit.Visual.ScopedQueue = function () {
489 var cls = arguments.callee;
490 if (!(this instanceof cls)) {
491 return new cls();
492 }
493 this.__init__();
494};
495MochiKit.Visual.ScopedQueue.__export__ = false;
496
497MochiKit.Base.update(MochiKit.Visual.ScopedQueue.prototype, {
498 __init__: function () {
499 this.effects = [];
500 this.interval = null;
501 },
502
503 /** @id MochiKit.Visual.ScopedQueue.prototype.add */
504 add: function (effect) {
505 var timestamp = new Date().getTime();
506
507 var position = (typeof(effect.options.queue) == 'string') ?
508 effect.options.queue : effect.options.queue.position;
509
510 var ma = MochiKit.Base.map;
511 switch (position) {
512 case 'front':
513 // move unstarted effects after this effect
514 ma(function (e) {
515 if (e.state == 'idle') {
516 e.startOn += effect.finishOn;
517 e.finishOn += effect.finishOn;
518 }
519 }, this.effects);
520 break;
521 case 'end':
522 var finish;
523 // start effect after last queued effect has finished
524 ma(function (e) {
525 var i = e.finishOn;
526 if (i >= (finish || i)) {
527 finish = i;
528 }
529 }, this.effects);
530 timestamp = finish || timestamp;
531 break;
532 case 'break':
533 ma(function (e) {
534 e.finalize();
535 }, this.effects);
536 break;
537 }
538
539 effect.startOn += timestamp;
540 effect.finishOn += timestamp;
541 if (!effect.options.queue.limit ||
542 this.effects.length < effect.options.queue.limit) {
543 this.effects.push(effect);
544 }
545
546 if (!this.interval) {
547 this.interval = this.startLoop(MochiKit.Base.bind(this.loop, this),
548 40);
549 }
550 },
551
552 /** @id MochiKit.Visual.ScopedQueue.prototype.startLoop */
553 startLoop: function (func, interval) {
554 return setInterval(func, interval);
555 },
556
557 /** @id MochiKit.Visual.ScopedQueue.prototype.remove */
558 remove: function (effect) {
559 this.effects = MochiKit.Base.filter(function (e) {
560 return e != effect;
561 }, this.effects);
562 if (!this.effects.length) {
563 this.stopLoop(this.interval);
564 this.interval = null;
565 }
566 },
567
568 /** @id MochiKit.Visual.ScopedQueue.prototype.stopLoop */
569 stopLoop: function (interval) {
570 clearInterval(interval);
571 },
572
573 /** @id MochiKit.Visual.ScopedQueue.prototype.loop */
574 loop: function () {
575 var timePos = new Date().getTime();
576 MochiKit.Base.map(function (effect) {
577 effect.loop(timePos);
578 }, this.effects);
579 }
580});
581
582MochiKit.Visual.Queues = {
583 __export__: false,
584 instances: {},
585 get: function (queueName) {
586 if (typeof(queueName) != 'string') {
587 return queueName;
588 }
589
590 if (!this.instances[queueName]) {
591 this.instances[queueName] = new MochiKit.Visual.ScopedQueue();
592 }
593 return this.instances[queueName];
594 }
595};
596
597MochiKit.Visual.Queue = MochiKit.Visual.Queues.get('global');
598MochiKit.Visual.Queue.__export__ = false;
599
600MochiKit.Visual.DefaultOptions = {
601 __export__: false,
602 transition: MochiKit.Visual.Transitions.sinoidal,
603 duration: 1.0, // seconds
604 fps: 25.0, // max. 25fps due to MochiKit.Visual.Queue implementation
605 sync: false, // true for combining
606 from: 0.0,
607 to: 1.0,
608 delay: 0.0,
609 queue: 'parallel'
610};
611
612MochiKit.Visual.Base = function () {};
613
614MochiKit.Visual.Base.prototype = {
615 /***
616
617 Basic class for all Effects. Define a looping mechanism called for each step
618 of an effect. Don't instantiate it, only subclass it.
619
620 ***/
621
622 __class__ : MochiKit.Visual.Base,
623
624 /** @id MochiKit.Visual.Base.prototype.start */
625 start: function (options) {
626 var v = MochiKit.Visual;
627 this.options = MochiKit.Base.setdefault(options,
628 v.DefaultOptions);
629 this.currentFrame = 0;
630 this.state = 'idle';
631 this.startOn = this.options.delay*1000;
632 this.finishOn = this.startOn + (this.options.duration*1000);
633 this.event('beforeStart');
634 if (!this.options.sync) {
635 v.Queues.get(typeof(this.options.queue) == 'string' ?
636 'global' : this.options.queue.scope).add(this);
637 }
638 },
639
640 /** @id MochiKit.Visual.Base.prototype.loop */
641 loop: function (timePos) {
642 if (timePos >= this.startOn) {
643 if (timePos >= this.finishOn) {
644 return this.finalize();
645 }
646 var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
647 var frame =
648 Math.round(pos * this.options.fps * this.options.duration);
649 if (frame > this.currentFrame) {
650 this.render(pos);
651 this.currentFrame = frame;
652 }
653 }
654 },
655
656 /** @id MochiKit.Visual.Base.prototype.render */
657 render: function (pos) {
658 if (this.state == 'idle') {
659 this.state = 'running';
660 this.event('beforeSetup');
661 this.setup();
662 this.event('afterSetup');
663 }
664 if (this.state == 'running') {
665 if (this.options.transition) {
666 pos = this.options.transition(pos);
667 }
668 pos *= (this.options.to - this.options.from);
669 pos += this.options.from;
670 this.event('beforeUpdate');
671 this.update(pos);
672 this.event('afterUpdate');
673 }
674 },
675
676 /** @id MochiKit.Visual.Base.prototype.cancel */
677 cancel: function () {
678 if (!this.options.sync) {
679 MochiKit.Visual.Queues.get(typeof(this.options.queue) == 'string' ?
680 'global' : this.options.queue.scope).remove(this);
681 }
682 this.state = 'finished';
683 },
684
685 /** @id MochiKit.Visual.Base.prototype.finalize */
686 finalize: function () {
687 this.render(1.0);
688 this.cancel();
689 this.event('beforeFinish');
690 this.finish();
691 this.event('afterFinish');
692 },
693
694 setup: function () {
695 },
696
697 finish: function () {
698 },
699
700 update: function (position) {
701 },
702
703 /** @id MochiKit.Visual.Base.prototype.event */
704 event: function (eventName) {
705 if (this.options[eventName + 'Internal']) {
706 this.options[eventName + 'Internal'](this);
707 }
708 if (this.options[eventName]) {
709 this.options[eventName](this);
710 }
711 },
712
713 /** @id MochiKit.Visual.Base.prototype.repr */
714 repr: function () {
715 return '[' + this.__class__.NAME + ', options:' +
716 MochiKit.Base.repr(this.options) + ']';
717 }
718};
719
720/** @id MochiKit.Visual.Parallel */
721MochiKit.Visual.Parallel = function (effects, options) {
722 var cls = arguments.callee;
723 if (!(this instanceof cls)) {
724 return new cls(effects, options);
725 }
726
727 this.__init__(effects, options);
728};
729
730MochiKit.Visual.Parallel.prototype = new MochiKit.Visual.Base();
731
732MochiKit.Base.update(MochiKit.Visual.Parallel.prototype, {
733 /***
734
735 Run multiple effects at the same time.
736
737 ***/
738
739 __class__ : MochiKit.Visual.Parallel,
740
741 __init__: function (effects, options) {
742 this.effects = effects || [];
743 this.start(options);
744 },
745
746 /** @id MochiKit.Visual.Parallel.prototype.update */
747 update: function (position) {
748 MochiKit.Base.map(function (effect) {
749 effect.render(position);
750 }, this.effects);
751 },
752
753 /** @id MochiKit.Visual.Parallel.prototype.finish */
754 finish: function () {
755 MochiKit.Base.map(function (effect) {
756 effect.finalize();
757 }, this.effects);
758 }
759});
760
761/** @id MochiKit.Visual.Sequence */
762MochiKit.Visual.Sequence = function (effects, options) {
763 var cls = arguments.callee;
764 if (!(this instanceof cls)) {
765 return new cls(effects, options);
766 }
767 this.__init__(effects, options);
768};
769
770MochiKit.Visual.Sequence.prototype = new MochiKit.Visual.Base();
771
772MochiKit.Base.update(MochiKit.Visual.Sequence.prototype, {
773
774 __class__ : MochiKit.Visual.Sequence,
775
776 __init__: function (effects, options) {
777 var defs = { transition: MochiKit.Visual.Transitions.linear,
778 duration: 0 };
779 this.effects = effects || [];
780 MochiKit.Base.map(function (effect) {
781 defs.duration += effect.options.duration;
782 }, this.effects);
783 MochiKit.Base.setdefault(options, defs);
784 this.start(options);
785 },
786
787 /** @id MochiKit.Visual.Sequence.prototype.update */
788 update: function (position) {
789 var time = position * this.options.duration;
790 for (var i = 0; i < this.effects.length; i++) {
791 var effect = this.effects[i];
792 if (time <= effect.options.duration) {
793 effect.render(time / effect.options.duration);
794 break;
795 } else {
796 time -= effect.options.duration;
797 }
798 }
799 },
800
801 /** @id MochiKit.Visual.Sequence.prototype.finish */
802 finish: function () {
803 MochiKit.Base.map(function (effect) {
804 effect.finalize();
805 }, this.effects);
806 }
807});
808
809/** @id MochiKit.Visual.Opacity */
810MochiKit.Visual.Opacity = function (element, options) {
811 var cls = arguments.callee;
812 if (!(this instanceof cls)) {
813 return new cls(element, options);
814 }
815 this.__init__(element, options);
816};
817
818MochiKit.Visual.Opacity.prototype = new MochiKit.Visual.Base();
819
820MochiKit.Base.update(MochiKit.Visual.Opacity.prototype, {
821 /***
822
823 Change the opacity of an element.
824
825 @param options: 'from' and 'to' change the starting and ending opacities.
826 Must be between 0.0 and 1.0. Default to current opacity and 1.0.
827
828 ***/
829
830 __class__ : MochiKit.Visual.Opacity,
831
832 __init__: function (element, /* optional */options) {
833 var b = MochiKit.Base;
834 var s = MochiKit.Style;
835 this.element = MochiKit.DOM.getElement(element);
836 // make this work on IE on elements without 'layout'
837 if (this.element.currentStyle &&
838 (!this.element.currentStyle.hasLayout)) {
839 s.setStyle(this.element, {zoom: 1});
840 }
841 options = b.update({
842 from: s.getStyle(this.element, 'opacity') || 0.0,
843 to: 1.0
844 }, options);
845 this.start(options);
846 },
847
848 /** @id MochiKit.Visual.Opacity.prototype.update */
849 update: function (position) {
850 MochiKit.Style.setStyle(this.element, {'opacity': position});
851 }
852});
853
854/** @id MochiKit.Visual.Move.prototype */
855MochiKit.Visual.Move = function (element, options) {
856 var cls = arguments.callee;
857 if (!(this instanceof cls)) {
858 return new cls(element, options);
859 }
860 this.__init__(element, options);
861};
862
863MochiKit.Visual.Move.prototype = new MochiKit.Visual.Base();
864
865MochiKit.Base.update(MochiKit.Visual.Move.prototype, {
866 /***
867
868 Move an element between its current position to a defined position
869
870 @param options: 'x' and 'y' for final positions, default to 0, 0.
871
872 ***/
873
874 __class__ : MochiKit.Visual.Move,
875
876 __init__: function (element, /* optional */options) {
877 this.element = MochiKit.DOM.getElement(element);
878 options = MochiKit.Base.update({
879 x: 0,
880 y: 0,
881 mode: 'relative'
882 }, options);
883 this.start(options);
884 },
885
886 /** @id MochiKit.Visual.Move.prototype.setup */
887 setup: function () {
888 // Bug in Opera: Opera returns the 'real' position of a static element
889 // or relative element that does not have top/left explicitly set.
890 // ==> Always set top and left for position relative elements in your
891 // stylesheets (to 0 if you do not need them)
892 MochiKit.Style.makePositioned(this.element);
893
894 var s = this.element.style;
895 var originalVisibility = s.visibility;
896 var originalDisplay = s.display;
897 if (originalDisplay == 'none') {
898 s.visibility = 'hidden';
899 s.display = '';
900 }
901
902 this.originalLeft = parseFloat(MochiKit.Style.getStyle(this.element, 'left') || '0');
903 this.originalTop = parseFloat(MochiKit.Style.getStyle(this.element, 'top') || '0');
904
905 if (this.options.mode == 'absolute') {
906 // absolute movement, so we need to calc deltaX and deltaY
907 this.options.x -= this.originalLeft;
908 this.options.y -= this.originalTop;
909 }
910 if (originalDisplay == 'none') {
911 s.visibility = originalVisibility;
912 s.display = originalDisplay;
913 }
914 },
915
916 /** @id MochiKit.Visual.Move.prototype.update */
917 update: function (position) {
918 MochiKit.Style.setStyle(this.element, {
919 left: Math.round(this.options.x * position + this.originalLeft) + 'px',
920 top: Math.round(this.options.y * position + this.originalTop) + 'px'
921 });
922 }
923});
924
925/** @id MochiKit.Visual.Scale */
926MochiKit.Visual.Scale = function (element, percent, options) {
927 var cls = arguments.callee;
928 if (!(this instanceof cls)) {
929 return new cls(element, percent, options);
930 }
931 this.__init__(element, percent, options);
932};
933
934MochiKit.Visual.Scale.prototype = new MochiKit.Visual.Base();
935
936MochiKit.Base.update(MochiKit.Visual.Scale.prototype, {
937 /***
938
939 Change the size of an element.
940
941 @param percent: final_size = percent*original_size
942
943 @param options: several options changing scale behaviour
944
945 ***/
946
947 __class__ : MochiKit.Visual.Scale,
948
949 __init__: function (element, percent, /* optional */options) {
950 this.element = MochiKit.DOM.getElement(element);
951 options = MochiKit.Base.update({
952 scaleX: true,
953 scaleY: true,
954 scaleContent: true,
955 scaleFromCenter: false,
956 scaleMode: 'box', // 'box' or 'contents' or {} with provided values
957 scaleFrom: 100.0,
958 scaleTo: percent
959 }, options);
960 this.start(options);
961 },
962
963 /** @id MochiKit.Visual.Scale.prototype.setup */
964 setup: function () {
965 this.restoreAfterFinish = this.options.restoreAfterFinish || false;
966 this.elementPositioning = MochiKit.Style.getStyle(this.element,
967 'position');
968
969 var ma = MochiKit.Base.map;
970 var b = MochiKit.Base.bind;
971 this.originalStyle = {};
972 ma(b(function (k) {
973 this.originalStyle[k] = this.element.style[k];
974 }, this), ['top', 'left', 'width', 'height', 'fontSize']);
975
976 this.originalTop = this.element.offsetTop;
977 this.originalLeft = this.element.offsetLeft;
978
979 var fontSize = MochiKit.Style.getStyle(this.element,
980 'font-size') || '100%';
981 ma(b(function (fontSizeType) {
982 if (fontSize.indexOf(fontSizeType) > 0) {
983 this.fontSize = parseFloat(fontSize);
984 this.fontSizeType = fontSizeType;
985 }
986 }, this), ['em', 'px', '%']);
987
988 this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
989
990 if (/^content/.test(this.options.scaleMode)) {
991 this.dims = [this.element.scrollHeight, this.element.scrollWidth];
992 } else if (this.options.scaleMode == 'box') {
993 this.dims = [this.element.offsetHeight, this.element.offsetWidth];
994 } else {
995 this.dims = [this.options.scaleMode.originalHeight,
996 this.options.scaleMode.originalWidth];
997 }
998 },
999
1000 /** @id MochiKit.Visual.Scale.prototype.update */
1001 update: function (position) {
1002 var currentScale = (this.options.scaleFrom/100.0) +
1003 (this.factor * position);
1004 if (this.options.scaleContent && this.fontSize) {
1005 MochiKit.Style.setStyle(this.element, {
1006 fontSize: this.fontSize * currentScale + this.fontSizeType
1007 });
1008 }
1009 this.setDimensions(this.dims[0] * currentScale,
1010 this.dims[1] * currentScale);
1011 },
1012
1013 /** @id MochiKit.Visual.Scale.prototype.finish */
1014 finish: function () {
1015 if (this.restoreAfterFinish) {
1016 MochiKit.Style.setStyle(this.element, this.originalStyle);
1017 }
1018 },
1019
1020 /** @id MochiKit.Visual.Scale.prototype.setDimensions */
1021 setDimensions: function (height, width) {
1022 var d = {};
1023 var r = Math.round;
1024 if (/MSIE/.test(navigator.userAgent)) {
1025 r = Math.ceil;
1026 }
1027 if (this.options.scaleX) {
1028 d.width = r(width) + 'px';
1029 }
1030 if (this.options.scaleY) {
1031 d.height = r(height) + 'px';
1032 }
1033 if (this.options.scaleFromCenter) {
1034 var topd = (height - this.dims[0])/2;
1035 var leftd = (width - this.dims[1])/2;
1036 if (this.elementPositioning == 'absolute') {
1037 if (this.options.scaleY) {
1038 d.top = this.originalTop - topd + 'px';
1039 }
1040 if (this.options.scaleX) {
1041 d.left = this.originalLeft - leftd + 'px';
1042 }
1043 } else {
1044 if (this.options.scaleY) {
1045 d.top = -topd + 'px';
1046 }
1047 if (this.options.scaleX) {
1048 d.left = -leftd + 'px';
1049 }
1050 }
1051 }
1052 MochiKit.Style.setStyle(this.element, d);
1053 }
1054});
1055
1056/** @id MochiKit.Visual.Highlight */
1057MochiKit.Visual.Highlight = function (element, options) {
1058 var cls = arguments.callee;
1059 if (!(this instanceof cls)) {
1060 return new cls(element, options);
1061 }
1062 this.__init__(element, options);
1063};
1064
1065MochiKit.Visual.Highlight.prototype = new MochiKit.Visual.Base();
1066
1067MochiKit.Base.update(MochiKit.Visual.Highlight.prototype, {
1068 /***
1069
1070 Highlight an item of the page.
1071
1072 @param options: 'startcolor' for choosing highlighting color, default
1073 to '#ffff99'.
1074
1075 ***/
1076
1077 __class__ : MochiKit.Visual.Highlight,
1078
1079 __init__: function (element, /* optional */options) {
1080 this.element = MochiKit.DOM.getElement(element);
1081 options = MochiKit.Base.update({
1082 startcolor: '#ffff99'
1083 }, options);
1084 this.start(options);
1085 },
1086
1087 /** @id MochiKit.Visual.Highlight.prototype.setup */
1088 setup: function () {
1089 var b = MochiKit.Base;
1090 var s = MochiKit.Style;
1091 // Prevent executing on elements not in the layout flow
1092 if (s.getStyle(this.element, 'display') == 'none') {
1093 this.cancel();
1094 return;
1095 }
1096 // Disable background image during the effect
1097 this.oldStyle = {
1098 backgroundImage: s.getStyle(this.element, 'background-image')
1099 };
1100 s.setStyle(this.element, {
1101 backgroundImage: 'none'
1102 });
1103
1104 if (!this.options.endcolor) {
1105 this.options.endcolor =
1106 MochiKit.Color.Color.fromBackground(this.element).toHexString();
1107 }
1108 if (b.isUndefinedOrNull(this.options.restorecolor)) {
1109 this.options.restorecolor = s.getStyle(this.element,
1110 'background-color');
1111 }
1112 // init color calculations
1113 this._base = b.map(b.bind(function (i) {
1114 return parseInt(
1115 this.options.startcolor.slice(i*2 + 1, i*2 + 3), 16);
1116 }, this), [0, 1, 2]);
1117 this._delta = b.map(b.bind(function (i) {
1118 return parseInt(this.options.endcolor.slice(i*2 + 1, i*2 + 3), 16)
1119 - this._base[i];
1120 }, this), [0, 1, 2]);
1121 },
1122
1123 /** @id MochiKit.Visual.Highlight.prototype.update */
1124 update: function (position) {
1125 var m = '#';
1126 MochiKit.Base.map(MochiKit.Base.bind(function (i) {
1127 m += MochiKit.Color.toColorPart(Math.round(this._base[i] +
1128 this._delta[i]*position));
1129 }, this), [0, 1, 2]);
1130 MochiKit.Style.setStyle(this.element, {
1131 backgroundColor: m
1132 });
1133 },
1134
1135 /** @id MochiKit.Visual.Highlight.prototype.finish */
1136 finish: function () {
1137 MochiKit.Style.setStyle(this.element,
1138 MochiKit.Base.update(this.oldStyle, {
1139 backgroundColor: this.options.restorecolor
1140 }));
1141 }
1142});
1143
1144/** @id MochiKit.Visual.ScrollTo */
1145MochiKit.Visual.ScrollTo = function (element, options) {
1146 var cls = arguments.callee;
1147 if (!(this instanceof cls)) {
1148 return new cls(element, options);
1149 }
1150 this.__init__(element, options);
1151};
1152
1153MochiKit.Visual.ScrollTo.prototype = new MochiKit.Visual.Base();
1154
1155MochiKit.Base.update(MochiKit.Visual.ScrollTo.prototype, {
1156 /***
1157
1158 Scroll to an element in the page.
1159
1160 ***/
1161
1162 __class__ : MochiKit.Visual.ScrollTo,
1163
1164 __init__: function (element, /* optional */options) {
1165 this.element = MochiKit.DOM.getElement(element);
1166 this.start(options);
1167 },
1168
1169 /** @id MochiKit.Visual.ScrollTo.prototype.setup */
1170 setup: function () {
1171 var p = MochiKit.Position;
1172 p.prepare();
1173 var offsets = p.cumulativeOffset(this.element);
1174 if (this.options.offset) {
1175 offsets.y += this.options.offset;
1176 }
1177 var max;
1178 if (window.innerHeight) {
1179 max = window.innerHeight - window.height;
1180 } else if (document.documentElement &&
1181 document.documentElement.clientHeight) {
1182 max = document.documentElement.clientHeight -
1183 document.body.scrollHeight;
1184 } else if (document.body) {
1185 max = document.body.clientHeight - document.body.scrollHeight;
1186 }
1187 this.scrollStart = p.windowOffset.y;
1188 this.delta = (offsets.y > max ? max : offsets.y) - this.scrollStart;
1189 },
1190
1191 /** @id MochiKit.Visual.ScrollTo.prototype.update */
1192 update: function (position) {
1193 var p = MochiKit.Position;
1194 p.prepare();
1195 window.scrollTo(p.windowOffset.x, this.scrollStart + (position * this.delta));
1196 }
1197});
1198
1199MochiKit.Visual._CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
1200
1201MochiKit.Visual.Morph = function (element, options) {
1202 var cls = arguments.callee;
1203 if (!(this instanceof cls)) {
1204 return new cls(element, options);
1205 }
1206 this.__init__(element, options);
1207};
1208
1209MochiKit.Visual.Morph.prototype = new MochiKit.Visual.Base();
1210
1211MochiKit.Base.update(MochiKit.Visual.Morph.prototype, {
1212 /***
1213
1214 Morph effect: make a transformation from current style to the given style,
1215 automatically making a transition between the two.
1216
1217 ***/
1218
1219 __class__ : MochiKit.Visual.Morph,
1220
1221 __init__: function (element, /* optional */options) {
1222 this.element = MochiKit.DOM.getElement(element);
1223 this.start(options);
1224 },
1225
1226 /** @id MochiKit.Visual.Morph.prototype.setup */
1227 setup: function () {
1228 var b = MochiKit.Base;
1229 var style = this.options.style;
1230 this.styleStart = {};
1231 this.styleEnd = {};
1232 this.units = {};
1233 var value, unit;
1234 for (var s in style) {
1235 value = style[s];
1236 s = b.camelize(s);
1237 if (MochiKit.Visual._CSS_LENGTH.test(value)) {
1238 var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
1239 value = parseFloat(components[1]);
1240 unit = (components.length == 3) ? components[2] : null;
1241 this.styleEnd[s] = value;
1242 this.units[s] = unit;
1243 value = MochiKit.Style.getStyle(this.element, s);
1244 components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
1245 value = parseFloat(components[1]);
1246 this.styleStart[s] = value;
1247 } else if (/[Cc]olor$/.test(s)) {
1248 var c = MochiKit.Color.Color;
1249 value = c.fromString(value);
1250 if (value) {
1251 this.units[s] = "color";
1252 this.styleEnd[s] = value.toHexString();
1253 value = MochiKit.Style.getStyle(this.element, s);
1254 this.styleStart[s] = c.fromString(value).toHexString();
1255
1256 this.styleStart[s] = b.map(b.bind(function (i) {
1257 return parseInt(
1258 this.styleStart[s].slice(i*2 + 1, i*2 + 3), 16);
1259 }, this), [0, 1, 2]);
1260 this.styleEnd[s] = b.map(b.bind(function (i) {
1261 return parseInt(
1262 this.styleEnd[s].slice(i*2 + 1, i*2 + 3), 16);
1263 }, this), [0, 1, 2]);
1264 }
1265 } else {
1266 // For non-length & non-color properties, we just set the value
1267 this.element.style[s] = value;
1268 }
1269 }
1270 },
1271
1272 /** @id MochiKit.Visual.Morph.prototype.update */
1273 update: function (position) {
1274 var value;
1275 for (var s in this.styleStart) {
1276 if (this.units[s] == "color") {
1277 var m = '#';
1278 var start = this.styleStart[s];
1279 var end = this.styleEnd[s];
1280 MochiKit.Base.map(MochiKit.Base.bind(function (i) {
1281 m += MochiKit.Color.toColorPart(Math.round(start[i] +
1282 (end[i] - start[i])*position));
1283 }, this), [0, 1, 2]);
1284 this.element.style[s] = m;
1285 } else {
1286 value = this.styleStart[s] + Math.round((this.styleEnd[s] - this.styleStart[s]) * position * 1000) / 1000 + this.units[s];
1287 this.element.style[s] = value;
1288 }
1289 }
1290 }
1291});
1292
1293/***
1294
1295Combination effects.
1296
1297***/
1298
1299/** @id MochiKit.Visual.fade */
1300MochiKit.Visual.fade = function (element, /* optional */ options) {
1301 /***
1302
1303 Fade a given element: change its opacity and hide it in the end.
1304
1305 @param options: 'to' and 'from' to change opacity.
1306
1307 ***/
1308 var s = MochiKit.Style;
1309 var oldOpacity = s.getStyle(element, 'opacity');
1310 options = MochiKit.Base.update({
1311 from: s.getStyle(element, 'opacity') || 1.0,
1312 to: 0.0,
1313 afterFinishInternal: function (effect) {
1314 if (effect.options.to !== 0) {
1315 return;
1316 }
1317 s.hideElement(effect.element);
1318 s.setStyle(effect.element, {'opacity': oldOpacity});
1319 }
1320 }, options);
1321 return new MochiKit.Visual.Opacity(element, options);
1322};
1323
1324/** @id MochiKit.Visual.appear */
1325MochiKit.Visual.appear = function (element, /* optional */ options) {
1326 /***
1327
1328 Make an element appear.
1329
1330 @param options: 'to' and 'from' to change opacity.
1331
1332 ***/
1333 var s = MochiKit.Style;
1334 var v = MochiKit.Visual;
1335 options = MochiKit.Base.update({
1336 from: (s.getStyle(element, 'display') == 'none' ? 0.0 :
1337 s.getStyle(element, 'opacity') || 0.0),
1338 to: 1.0,
1339 // force Safari to render floated elements properly
1340 afterFinishInternal: function (effect) {
1341 v._forceRerendering(effect.element);
1342 },
1343 beforeSetupInternal: function (effect) {
1344 s.setStyle(effect.element, {'opacity': effect.options.from});
1345 s.showElement(effect.element);
1346 }
1347 }, options);
1348 return new v.Opacity(element, options);
1349};
1350
1351/** @id MochiKit.Visual.puff */
1352MochiKit.Visual.puff = function (element, /* optional */ options) {
1353 /***
1354
1355 'Puff' an element: grow it to double size, fading it and make it hidden.
1356
1357 ***/
1358 var s = MochiKit.Style;
1359 var v = MochiKit.Visual;
1360 element = MochiKit.DOM.getElement(element);
1361 var elementDimensions = MochiKit.Style.getElementDimensions(element, true);
1362 var oldStyle = {
1363 position: s.getStyle(element, 'position'),
1364 top: element.style.top,
1365 left: element.style.left,
1366 width: element.style.width,
1367 height: element.style.height,
1368 opacity: s.getStyle(element, 'opacity')
1369 };
1370 options = MochiKit.Base.update({
1371 beforeSetupInternal: function (effect) {
1372 MochiKit.Position.absolutize(effect.effects[0].element);
1373 },
1374 afterFinishInternal: function (effect) {
1375 s.hideElement(effect.effects[0].element);
1376 s.setStyle(effect.effects[0].element, oldStyle);
1377 },
1378 scaleContent: true,
1379 scaleFromCenter: true
1380 }, options);
1381 return new v.Parallel(
1382 [new v.Scale(element, 200,
1383 {sync: true, scaleFromCenter: options.scaleFromCenter,
1384 scaleMode: {originalHeight: elementDimensions.h,
1385 originalWidth: elementDimensions.w},
1386 scaleContent: options.scaleContent, restoreAfterFinish: true}),
1387 new v.Opacity(element, {sync: true, to: 0.0 })],
1388 options);
1389};
1390
1391/** @id MochiKit.Visual.blindUp */
1392MochiKit.Visual.blindUp = function (element, /* optional */ options) {
1393 /***
1394
1395 Blind an element up: change its vertical size to 0.
1396
1397 ***/
1398 var d = MochiKit.DOM;
1399 var s = MochiKit.Style;
1400 element = d.getElement(element);
1401 var elementDimensions = s.getElementDimensions(element, true);
1402 var elemClip = s.makeClipping(element);
1403 options = MochiKit.Base.update({
1404 scaleContent: false,
1405 scaleX: false,
1406 scaleMode: {originalHeight: elementDimensions.h,
1407 originalWidth: elementDimensions.w},
1408 restoreAfterFinish: true,
1409 afterFinishInternal: function (effect) {
1410 s.hideElement(effect.element);
1411 s.undoClipping(effect.element, elemClip);
1412 }
1413 }, options);
1414 return new MochiKit.Visual.Scale(element, 0, options);
1415};
1416
1417/** @id MochiKit.Visual.blindDown */
1418MochiKit.Visual.blindDown = function (element, /* optional */ options) {
1419 /***
1420
1421 Blind an element down: restore its vertical size.
1422
1423 ***/
1424 var d = MochiKit.DOM;
1425 var s = MochiKit.Style;
1426 element = d.getElement(element);
1427 var elementDimensions = s.getElementDimensions(element, true);
1428 var elemClip;
1429 options = MochiKit.Base.update({
1430 scaleContent: false,
1431 scaleX: false,
1432 scaleFrom: 0,
1433 scaleMode: {originalHeight: elementDimensions.h,
1434 originalWidth: elementDimensions.w},
1435 restoreAfterFinish: true,
1436 afterSetupInternal: function (effect) {
1437 elemClip = s.makeClipping(effect.element);
1438 s.setStyle(effect.element, {height: '0px'});
1439 s.showElement(effect.element);
1440 },
1441 afterFinishInternal: function (effect) {
1442 s.undoClipping(effect.element, elemClip);
1443 }
1444 }, options);
1445 return new MochiKit.Visual.Scale(element, 100, options);
1446};
1447
1448/** @id MochiKit.Visual.switchOff */
1449MochiKit.Visual.switchOff = function (element, /* optional */ options) {
1450 /***
1451
1452 Apply a switch-off-like effect.
1453
1454 ***/
1455 var d = MochiKit.DOM;
1456 var s = MochiKit.Style;
1457 element = d.getElement(element);
1458 var elementDimensions = s.getElementDimensions(element, true);
1459 var oldOpacity = s.getStyle(element, 'opacity');
1460 var elemClip;
1461 options = MochiKit.Base.update({
1462 duration: 0.7,
1463 restoreAfterFinish: true,
1464 beforeSetupInternal: function (effect) {
1465 s.makePositioned(element);
1466 elemClip = s.makeClipping(element);
1467 },
1468 afterFinishInternal: function (effect) {
1469 s.hideElement(element);
1470 s.undoClipping(element, elemClip);
1471 s.undoPositioned(element);
1472 s.setStyle(element, {'opacity': oldOpacity});
1473 }
1474 }, options);
1475 var v = MochiKit.Visual;
1476 return new v.Sequence(
1477 [new v.appear(element,
1478 { sync: true, duration: 0.57 * options.duration,
1479 from: 0, transition: v.Transitions.flicker }),
1480 new v.Scale(element, 1,
1481 { sync: true, duration: 0.43 * options.duration,
1482 scaleFromCenter: true, scaleX: false,
1483 scaleMode: {originalHeight: elementDimensions.h,
1484 originalWidth: elementDimensions.w},
1485 scaleContent: false, restoreAfterFinish: true })],
1486 options);
1487};
1488
1489/** @id MochiKit.Visual.dropOut */
1490MochiKit.Visual.dropOut = function (element, /* optional */ options) {
1491 /***
1492
1493 Make an element fall and disappear.
1494
1495 ***/
1496 var d = MochiKit.DOM;
1497 var s = MochiKit.Style;
1498 element = d.getElement(element);
1499 var oldStyle = {
1500 top: s.getStyle(element, 'top'),
1501 left: s.getStyle(element, 'left'),
1502 opacity: s.getStyle(element, 'opacity')
1503 };
1504
1505 options = MochiKit.Base.update({
1506 duration: 0.5,
1507 distance: 100,
1508 beforeSetupInternal: function (effect) {
1509 s.makePositioned(effect.effects[0].element);
1510 },
1511 afterFinishInternal: function (effect) {
1512 s.hideElement(effect.effects[0].element);
1513 s.undoPositioned(effect.effects[0].element);
1514 s.setStyle(effect.effects[0].element, oldStyle);
1515 }
1516 }, options);
1517 var v = MochiKit.Visual;
1518 return new v.Parallel(
1519 [new v.Move(element, {x: 0, y: options.distance, sync: true}),
1520 new v.Opacity(element, {sync: true, to: 0.0})],
1521 options);
1522};
1523
1524/** @id MochiKit.Visual.shake */
1525MochiKit.Visual.shake = function (element, /* optional */ options) {
1526 /***
1527
1528 Move an element from left to right several times.
1529
1530 ***/
1531 var d = MochiKit.DOM;
1532 var v = MochiKit.Visual;
1533 var s = MochiKit.Style;
1534 element = d.getElement(element);
1535 var oldStyle = {
1536 top: s.getStyle(element, 'top'),
1537 left: s.getStyle(element, 'left')
1538 };
1539 options = MochiKit.Base.update({
1540 duration: 0.5,
1541 afterFinishInternal: function (effect) {
1542 s.undoPositioned(element);
1543 s.setStyle(element, oldStyle);
1544 }
1545 }, options);
1546 return new v.Sequence(
1547 [new v.Move(element, { sync: true, duration: 0.1 * options.duration,
1548 x: 20, y: 0 }),
1549 new v.Move(element, { sync: true, duration: 0.2 * options.duration,
1550 x: -40, y: 0 }),
1551 new v.Move(element, { sync: true, duration: 0.2 * options.duration,
1552 x: 40, y: 0 }),
1553 new v.Move(element, { sync: true, duration: 0.2 * options.duration,
1554 x: -40, y: 0 }),
1555 new v.Move(element, { sync: true, duration: 0.2 * options.duration,
1556 x: 40, y: 0 }),
1557 new v.Move(element, { sync: true, duration: 0.1 * options.duration,
1558 x: -20, y: 0 })],
1559 options);
1560};
1561
1562/** @id MochiKit.Visual.slideDown */
1563MochiKit.Visual.slideDown = function (element, /* optional */ options) {
1564 /***
1565
1566 Slide an element down.
1567 It needs to have the content of the element wrapped in a container
1568 element with fixed height.
1569
1570 ***/
1571 var d = MochiKit.DOM;
1572 var b = MochiKit.Base;
1573 var s = MochiKit.Style;
1574 element = d.getElement(element);
1575 if (!element.firstChild) {
1576 throw new Error("MochiKit.Visual.slideDown must be used on a element with a child");
1577 }
1578 d.removeEmptyTextNodes(element);
1579 var oldInnerBottom = s.getStyle(element.firstChild, 'bottom') || 0;
1580 var elementDimensions = s.getElementDimensions(element, true);
1581 var elemClip;
1582 options = b.update({
1583 scaleContent: false,
1584 scaleX: false,
1585 scaleFrom: 0,
1586 scaleMode: {originalHeight: elementDimensions.h,
1587 originalWidth: elementDimensions.w},
1588 restoreAfterFinish: true,
1589 afterSetupInternal: function (effect) {
1590 s.makePositioned(effect.element);
1591 s.makePositioned(effect.element.firstChild);
1592 if (/Opera/.test(navigator.userAgent)) {
1593 s.setStyle(effect.element, {top: ''});
1594 }
1595 elemClip = s.makeClipping(effect.element);
1596 s.setStyle(effect.element, {height: '0px'});
1597 s.showElement(effect.element);
1598 },
1599 afterUpdateInternal: function (effect) {
1600 var elementDimensions = s.getElementDimensions(effect.element, true);
1601 s.setStyle(effect.element.firstChild,
1602 {bottom: (effect.dims[0] - elementDimensions.h) + 'px'});
1603 },
1604 afterFinishInternal: function (effect) {
1605 s.undoClipping(effect.element, elemClip);
1606 // IE will crash if child is undoPositioned first
1607 if (/MSIE/.test(navigator.userAgent)) {
1608 s.undoPositioned(effect.element);
1609 s.undoPositioned(effect.element.firstChild);
1610 } else {
1611 s.undoPositioned(effect.element.firstChild);
1612 s.undoPositioned(effect.element);
1613 }
1614 s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom});
1615 }
1616 }, options);
1617
1618 return new MochiKit.Visual.Scale(element, 100, options);
1619};
1620
1621/** @id MochiKit.Visual.slideUp */
1622MochiKit.Visual.slideUp = function (element, /* optional */ options) {
1623 /***
1624
1625 Slide an element up.
1626 It needs to have the content of the element wrapped in a container
1627 element with fixed height.
1628
1629 ***/
1630 var d = MochiKit.DOM;
1631 var b = MochiKit.Base;
1632 var s = MochiKit.Style;
1633 element = d.getElement(element);
1634 if (!element.firstChild) {
1635 throw new Error("MochiKit.Visual.slideUp must be used on a element with a child");
1636 }
1637 d.removeEmptyTextNodes(element);
1638 var oldInnerBottom = s.getStyle(element.firstChild, 'bottom');
1639 var elementDimensions = s.getElementDimensions(element, true);
1640 var elemClip;
1641 options = b.update({
1642 scaleContent: false,
1643 scaleX: false,
1644 scaleMode: {originalHeight: elementDimensions.h,
1645 originalWidth: elementDimensions.w},
1646 scaleFrom: 100,
1647 restoreAfterFinish: true,
1648 beforeStartInternal: function (effect) {
1649 s.makePositioned(effect.element);
1650 s.makePositioned(effect.element.firstChild);
1651 if (/Opera/.test(navigator.userAgent)) {
1652 s.setStyle(effect.element, {top: ''});
1653 }
1654 elemClip = s.makeClipping(effect.element);
1655 s.showElement(effect.element);
1656 },
1657 afterUpdateInternal: function (effect) {
1658 var elementDimensions = s.getElementDimensions(effect.element, true);
1659 s.setStyle(effect.element.firstChild,
1660 {bottom: (effect.dims[0] - elementDimensions.h) + 'px'});
1661 },
1662 afterFinishInternal: function (effect) {
1663 s.hideElement(effect.element);
1664 s.undoClipping(effect.element, elemClip);
1665 s.undoPositioned(effect.element.firstChild);
1666 s.undoPositioned(effect.element);
1667 s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom});
1668 }
1669 }, options);
1670 return new MochiKit.Visual.Scale(element, 0, options);
1671};
1672
1673// Bug in opera makes the TD containing this element expand for a instance
1674// after finish
1675/** @id MochiKit.Visual.squish */
1676MochiKit.Visual.squish = function (element, /* optional */ options) {
1677 /***
1678
1679 Reduce an element and make it disappear.
1680
1681 ***/
1682 var d = MochiKit.DOM;
1683 var b = MochiKit.Base;
1684 var s = MochiKit.Style;
1685 var elementDimensions = s.getElementDimensions(element, true);
1686 var elemClip;
1687 options = b.update({
1688 restoreAfterFinish: true,
1689 scaleMode: {originalHeight: elementDimensions.w,
1690 originalWidth: elementDimensions.h},
1691 beforeSetupInternal: function (effect) {
1692 elemClip = s.makeClipping(effect.element);
1693 },
1694 afterFinishInternal: function (effect) {
1695 s.hideElement(effect.element);
1696 s.undoClipping(effect.element, elemClip);
1697 }
1698 }, options);
1699
1700 return new MochiKit.Visual.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, options);
1701};
1702
1703/** @id MochiKit.Visual.grow */
1704MochiKit.Visual.grow = function (element, /* optional */ options) {
1705 /***
1706
1707 Grow an element to its original size. Make it zero-sized before
1708 if necessary.
1709
1710 ***/
1711 var d = MochiKit.DOM;
1712 var v = MochiKit.Visual;
1713 var s = MochiKit.Style;
1714 element = d.getElement(element);
1715 options = MochiKit.Base.update({
1716 direction: 'center',
1717 moveTransition: v.Transitions.sinoidal,
1718 scaleTransition: v.Transitions.sinoidal,
1719 opacityTransition: v.Transitions.full,
1720 scaleContent: true,
1721 scaleFromCenter: false
1722 }, options);
1723 var oldStyle = {
1724 top: element.style.top,
1725 left: element.style.left,
1726 height: element.style.height,
1727 width: element.style.width,
1728 opacity: s.getStyle(element, 'opacity')
1729 };
1730 var dims = s.getElementDimensions(element, true);
1731 var initialMoveX, initialMoveY;
1732 var moveX, moveY;
1733
1734 switch (options.direction) {
1735 case 'top-left':
1736 initialMoveX = initialMoveY = moveX = moveY = 0;
1737 break;
1738 case 'top-right':
1739 initialMoveX = dims.w;
1740 initialMoveY = moveY = 0;
1741 moveX = -dims.w;
1742 break;
1743 case 'bottom-left':
1744 initialMoveX = moveX = 0;
1745 initialMoveY = dims.h;
1746 moveY = -dims.h;
1747 break;
1748 case 'bottom-right':
1749 initialMoveX = dims.w;
1750 initialMoveY = dims.h;
1751 moveX = -dims.w;
1752 moveY = -dims.h;
1753 break;
1754 case 'center':
1755 initialMoveX = dims.w / 2;
1756 initialMoveY = dims.h / 2;
1757 moveX = -dims.w / 2;
1758 moveY = -dims.h / 2;
1759 break;
1760 }
1761
1762 var optionsParallel = MochiKit.Base.update({
1763 beforeSetupInternal: function (effect) {
1764 s.setStyle(effect.effects[0].element, {height: '0px'});
1765 s.showElement(effect.effects[0].element);
1766 },
1767 afterFinishInternal: function (effect) {
1768 s.undoClipping(effect.effects[0].element);
1769 s.undoPositioned(effect.effects[0].element);
1770 s.setStyle(effect.effects[0].element, oldStyle);
1771 }
1772 }, options);
1773
1774 return new v.Move(element, {
1775 x: initialMoveX,
1776 y: initialMoveY,
1777 duration: 0.01,
1778 beforeSetupInternal: function (effect) {
1779 s.hideElement(effect.element);
1780 s.makeClipping(effect.element);
1781 s.makePositioned(effect.element);
1782 },
1783 afterFinishInternal: function (effect) {
1784 new v.Parallel(
1785 [new v.Opacity(effect.element, {
1786 sync: true, to: 1.0, from: 0.0,
1787 transition: options.opacityTransition
1788 }),
1789 new v.Move(effect.element, {
1790 x: moveX, y: moveY, sync: true,
1791 transition: options.moveTransition
1792 }),
1793 new v.Scale(effect.element, 100, {
1794 scaleMode: {originalHeight: dims.h,
1795 originalWidth: dims.w},
1796 sync: true,
1797 scaleFrom: /Opera/.test(navigator.userAgent) ? 1 : 0,
1798 transition: options.scaleTransition,
1799 scaleContent: options.scaleContent,
1800 scaleFromCenter: options.scaleFromCenter,
1801 restoreAfterFinish: true
1802 })
1803 ], optionsParallel
1804 );
1805 }
1806 });
1807};
1808
1809/** @id MochiKit.Visual.shrink */
1810MochiKit.Visual.shrink = function (element, /* optional */ options) {
1811 /***
1812
1813 Shrink an element and make it disappear.
1814
1815 ***/
1816 var d = MochiKit.DOM;
1817 var v = MochiKit.Visual;
1818 var s = MochiKit.Style;
1819 element = d.getElement(element);
1820 options = MochiKit.Base.update({
1821 direction: 'center',
1822 moveTransition: v.Transitions.sinoidal,
1823 scaleTransition: v.Transitions.sinoidal,
1824 opacityTransition: v.Transitions.none,
1825 scaleContent: true,
1826 scaleFromCenter: false
1827 }, options);
1828 var oldStyle = {
1829 top: element.style.top,
1830 left: element.style.left,
1831 height: element.style.height,
1832 width: element.style.width,
1833 opacity: s.getStyle(element, 'opacity')
1834 };
1835
1836 var dims = s.getElementDimensions(element, true);
1837 var moveX, moveY;
1838
1839 switch (options.direction) {
1840 case 'top-left':
1841 moveX = moveY = 0;
1842 break;
1843 case 'top-right':
1844 moveX = dims.w;
1845 moveY = 0;
1846 break;
1847 case 'bottom-left':
1848 moveX = 0;
1849 moveY = dims.h;
1850 break;
1851 case 'bottom-right':
1852 moveX = dims.w;
1853 moveY = dims.h;
1854 break;
1855 case 'center':
1856 moveX = dims.w / 2;
1857 moveY = dims.h / 2;
1858 break;
1859 }
1860 var elemClip;
1861
1862 var optionsParallel = MochiKit.Base.update({
1863 beforeStartInternal: function (effect) {
1864 s.makePositioned(effect.effects[0].element);
1865 elemClip = s.makeClipping(effect.effects[0].element);
1866 },
1867 afterFinishInternal: function (effect) {
1868 s.hideElement(effect.effects[0].element);
1869 s.undoClipping(effect.effects[0].element, elemClip);
1870 s.undoPositioned(effect.effects[0].element);
1871 s.setStyle(effect.effects[0].element, oldStyle);
1872 }
1873 }, options);
1874
1875 return new v.Parallel(
1876 [new v.Opacity(element, {
1877 sync: true, to: 0.0, from: 1.0,
1878 transition: options.opacityTransition
1879 }),
1880 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, {
1881 scaleMode: {originalHeight: dims.h, originalWidth: dims.w},
1882 sync: true, transition: options.scaleTransition,
1883 scaleContent: options.scaleContent,
1884 scaleFromCenter: options.scaleFromCenter,
1885 restoreAfterFinish: true
1886 }),
1887 new v.Move(element, {
1888 x: moveX, y: moveY, sync: true, transition: options.moveTransition
1889 })
1890 ], optionsParallel
1891 );
1892};
1893
1894/** @id MochiKit.Visual.pulsate */
1895MochiKit.Visual.pulsate = function (element, /* optional */ options) {
1896 /***
1897
1898 Pulse an element between appear/fade.
1899
1900 ***/
1901 var d = MochiKit.DOM;
1902 var v = MochiKit.Visual;
1903 var b = MochiKit.Base;
1904 var oldOpacity = MochiKit.Style.getStyle(element, 'opacity');
1905 options = b.update({
1906 duration: 3.0,
1907 from: 0,
1908 afterFinishInternal: function (effect) {
1909 MochiKit.Style.setStyle(effect.element, {'opacity': oldOpacity});
1910 }
1911 }, options);
1912 var transition = options.transition || v.Transitions.sinoidal;
1913 options.transition = function (pos) {
1914 return transition(1 - v.Transitions.pulse(pos, options.pulses));
1915 };
1916 return new v.Opacity(element, options);
1917};
1918
1919/** @id MochiKit.Visual.fold */
1920MochiKit.Visual.fold = function (element, /* optional */ options) {
1921 /***
1922
1923 Fold an element, first vertically, then horizontally.
1924
1925 ***/
1926 var d = MochiKit.DOM;
1927 var v = MochiKit.Visual;
1928 var s = MochiKit.Style;
1929 element = d.getElement(element);
1930 var elementDimensions = s.getElementDimensions(element, true);
1931 var oldStyle = {
1932 top: element.style.top,
1933 left: element.style.left,
1934 width: element.style.width,
1935 height: element.style.height
1936 };
1937 var elemClip = s.makeClipping(element);
1938 options = MochiKit.Base.update({
1939 scaleContent: false,
1940 scaleX: false,
1941 scaleMode: {originalHeight: elementDimensions.h,
1942 originalWidth: elementDimensions.w},
1943 afterFinishInternal: function (effect) {
1944 new v.Scale(element, 1, {
1945 scaleContent: false,
1946 scaleY: false,
1947 scaleMode: {originalHeight: elementDimensions.h,
1948 originalWidth: elementDimensions.w},
1949 afterFinishInternal: function (effect) {
1950 s.hideElement(effect.element);
1951 s.undoClipping(effect.element, elemClip);
1952 s.setStyle(effect.element, oldStyle);
1953 }
1954 });
1955 }
1956 }, options);
1957 return new v.Scale(element, 5, options);
1958};
1959
1960
1961/* end of Rico adaptation */
1962
1963MochiKit.Visual.__new__ = function () {
1964 var m = MochiKit.Base;
1965
1966 // Backwards compatibility aliases
1967 m._deprecated(this, 'Color', 'MochiKit.Color.Color', '1.1');
1968 m._deprecated(this, 'getElementsComputedStyle', 'MochiKit.Style.getStyle', '1.1');
1969
1970 m.nameFunctions(this);
1971};
1972
1973MochiKit.Visual.__new__();
1974
1975MochiKit.Base._exportSymbols(this, MochiKit.Visual);
diff --git a/frontend/gamma/js/MochiKit/__package__.js b/frontend/gamma/js/MochiKit/__package__.js
new file mode 100644
index 0000000..8d644b1
--- a/dev/null
+++ b/frontend/gamma/js/MochiKit/__package__.js
@@ -0,0 +1,18 @@
1dojo.kwCompoundRequire({
2 "common": [
3 "MochiKit.Base",
4 "MochiKit.Iter",
5 "MochiKit.Logging",
6 "MochiKit.DateTime",
7 "MochiKit.Format",
8 "MochiKit.Async",
9 "MochiKit.DOM",
10 "MochiKit.Style",
11 "MochiKit.LoggingPane",
12 "MochiKit.Color",
13 "MochiKit.Signal",
14 "MochiKit.Position",
15 "MochiKit.Visual"
16 ]
17});
18dojo.provide("MochiKit.*");
diff --git a/frontend/gamma/js/main.js b/frontend/gamma/js/main.js
new file mode 100644
index 0000000..abb178f
--- a/dev/null
+++ b/frontend/gamma/js/main.js
@@ -0,0 +1,109 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29function _pm_logEvent(anEvent) {
30 //console.log("####", anEvent);
31
32 anEvent.preventDefault();
33}
34
35function handleGenericDeferredError(anError) {
36 var result;
37
38 if (anError instanceof MochiKit.Async.CancelledError) {
39 result = anError;
40 } else {
41MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
42//console.log(anError);
43 result = new MochiKit.Async.CancelledError(anError);
44 }
45
46 return result;
47}
48
49
50Clipperz.PM.RunTime = {};
51
52
53function run() {
54 var shouldShowRegistrationForm;
55 var useCompactDesign;
56 var controllerParameters;
57 //var iPhoneDesign;
58
59 //MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent);
60 //MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent);
61 //MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent);
62
63 controllerParameters = {};
64
65 MochiKit.DOM.removeElement('javaScriptAlert');
66 Clipperz.PM.Strings.Languages.initSetup();
67
68 if (window.location.search.indexOf('registration') != -1) {
69 shouldShowRegistrationForm = true;
70 } else {
71 shouldShowRegistrationForm = false;
72 }
73
74 if (window.location.search.indexOf('autocomplete') != -1) {
75 controllerParameters['autocomplete'] = 'on'
76 }
77
78 //if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) {
79 // iPhoneDesign = true;
80 //} else {
81 // iPhoneDesign = false;
82 //}
83
84 if (window.location.search.indexOf('compact') != -1) {
85 useCompactDesign = true;
86 } else {
87 useCompactDesign = false;
88 }
89
90 if (useCompactDesign == true) {
91 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters);
92 //} else if (iPhoneDesign == true) {
93 // Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController();
94 } else {
95 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters);
96 }
97
98 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm);
99
100//Clipperz.log("HASH: " + window.location.hash);
101if (window.location.hash != "") {
102 window.location.hash = ""
103}
104//Clipperz.log("HASH cleaned");
105 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'})
106 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
107}
108
109MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/js/main_iPhone.js b/frontend/gamma/js/main_iPhone.js
new file mode 100644
index 0000000..f13e95c
--- a/dev/null
+++ b/frontend/gamma/js/main_iPhone.js
@@ -0,0 +1,60 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29function _pm_logEvent(anEvent) {
30 //console.log("####", anEvent);
31
32 anEvent.preventDefault();
33}
34
35function handleGenericDeferredError(anError) {
36 var result;
37
38 if (anError instanceof MochiKit.Async.CancelledError) {
39 result = anError;
40 } else {
41MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
42 result = new MochiKit.Async.CancelledError(anError);
43 }
44
45 return result;
46}
47
48
49Clipperz.PM.RunTime = {};
50
51
52function run() {
53 MochiKit.DOM.removeElement('javaScriptAlert');
54 Clipperz.PM.Strings.Languages.initSetup();
55
56 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController();
57 Clipperz.PM.RunTime.mainController.run(false);
58}
59
60MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/properties/creditsAndCopyrights.txt b/frontend/gamma/properties/creditsAndCopyrights.txt
new file mode 100644
index 0000000..598440d
--- a/dev/null
+++ b/frontend/gamma/properties/creditsAndCopyrights.txt
@@ -0,0 +1,336 @@
1@clipperz.license@
2
3===============================================================================
4
5 This application is build using also the following libraries
6
7# MochiKit (http://www.mochikit.com)
8 - repository: @mochikit.repository@ (revision: @mochikit.version@)
9
10 * Software licence: http://svn.mochikit.com/mochikit/trunk/licence.txt
11
12 |MochiKit is dual-licensed software. It is available under the terms of the
13 |MIT License, or the Academic Free License version 2.1. The full text of
14 |each license is included below.
15 |
16 |MIT License
17 |===========
18 |
19 |Copyright (c) 2005 Bob Ippolito. All rights reserved.
20 |
21 |Permission is hereby granted, free of charge, to any person obtaining a copy of this
22 |software and associated documentation files (the "Software"), to deal in the Software
23 |without restriction, including without limitation the rights to use, copy, modify,
24 |merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
25 |permit persons to whom the Software is furnished to do so, subject to the following
26 |conditions:
27 |
28 |The above copyright notice and this permission notice shall be included in all copies
29 |or substantial portions of the Software.
30 |
31 |THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
32 |INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
33 |PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
34 |FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
35 |OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
36 |DEALINGS IN THE SOFTWARE.
37 |
38 |
39 |Academic Free License v. 2.1
40 |============================
41 |
42 |Copyright (c) 2005 Bob Ippolito. All rights reserved.
43 |
44 |This Academic Free License (the "License") applies to any original work of authorship (the
45 |"Original Work") whose owner (the "Licensor") has placed the following notice immediately
46 |following the copyright notice for the Original Work:
47 |
48 |Licensed under the Academic Free License version 2.1
49 |
50 |1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free,
51 |non-exclusive, perpetual, sublicenseable license to do the following:
52 |
53 |a) to reproduce the Original Work in copies;
54 |b) to prepare derivative works ("Derivative Works") based upon the Original Work;
55 |c) to distribute copies of the Original Work and Derivative Works to the public;
56 |d) to perform the Original Work publicly; and
57 |e) to display the Original Work publicly.
58 |
59 |2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free,
60 |non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled
61 |by the Licensor that are embodied in the Original Work as furnished by the Licensor, to
62 |make, use, sell and offer for sale the Original Work and Derivative Works.
63 |
64 |3) Grant of Source Code License. The term "Source Code" means the preferred form of the
65 |Original Work for making modifications to it and all available documentation describing
66 |how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy
67 |of the Source Code of the Original Work along with each copy of the Original Work that
68 |Licensor distributes. Licensor reserves the right to satisfy this obligation by placing
69 |a machine-readable copy of the Source Code in an information repository reasonably
70 |calculated to permit inexpensive and convenient access by You for as long as Licensor
71 |continues to distribute the Original Work, and by publishing the address of that information
72 |repository in a notice immediately following the copyright notice that applies to the Original
73 |Work.
74 |
75 |4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any
76 |contributors to the Original Work, nor any of their trademarks or service marks, may be used
77 |to endorse or promote products derived from this Original Work without express prior written
78 |permission of the Licensor. Nothing in this License shall be deemed to grant any rights to
79 |trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor
80 |except as expressly stated herein. No patent license is granted to make, use, sell or offer
81 |to sell embodiments of any patent claims other than the licensed claims defined in Section 2.
82 |No right is granted to the trademarks of Licensor even if such marks are included in the Original
83 |Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under
84 |different terms from this License any Original Work that Licensor otherwise would have a right
85 |to license.
86 |
87 |5) This section intentionally omitted.
88 |
89 |6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You
90 |create, all copyright, patent or trademark notices from the Source Code of the Original Work,
91 |as well as any notices of licensing and any descriptive text identified therein as an "Attribution
92 |Notice." You must cause the Source Code for any Derivative Works that You create to carry a
93 |prominent Attribution Notice reasonably calculated to inform recipients that You have modified the
94 |Original Work.
95 |
96 |7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and
97 |to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or
98 |are sublicensed to You under the terms of this License with the permission of the contributor(s)
99 |of those copyrights and patent rights. Except as expressly stated in the immediately proceeding
100 |sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY,
101 |either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT,
102 |MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL
103 |WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license
104 |to Original Work is granted hereunder except under this disclaimer.
105 |
106 |8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including
107 |negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect,
108 |special, incidental, or consequential damages of any character arising as a result of this License or the
109 |use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage,
110 |computer failure or malfunction, or any and all other commercial damages or losses. This limitation of
111 |liability shall not apply to liability for death or personal injury resulting from Licensor's negligence
112 |to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or
113 |limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.
114 |
115 |9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must
116 |make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of
117 |this License. Nothing else but this License (or another written agreement between Licensor and You) grants
118 |You permission to create Derivative Works based upon the Original Work or to exercise any of the rights
119 |granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another
120 |written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent
121 |laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted
122 |to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions.
123 |
124 |10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise
125 |any of the rights granted to You by this License as of the date You commence an action, including a cross-claim
126 |or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This
127 |termination provision shall not apply for an action alleging patent infringement by combinations of the Original
128 |Work with other software or hardware.
129 |
130 |11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in
131 |the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business,
132 |and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United
133 |Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the
134 |Original Work outside the scope of this License or after its termination shall be subject to the requirements
135 |and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries,
136 |and international treaty. This section shall survive the termination of this License.
137 |
138 |12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages
139 |relating thereto, the prevailing party shall be entitled to recover its costs and expenses,
140 |including, without limitation, reasonable attorneys' fees and costs incurred in connection
141 |with such action, including any appeal of such action. This section shall survive the
142 |termination of this License.
143 |
144 |13) Miscellaneous. This License represents the complete agreement concerning the subject
145 |matter hereof. If any provision of this License is held to be unenforceable, such provision
146 |shall be reformed only to the extent necessary to make it enforceable.
147 |
148 |14) Definition of "You" in This License. "You" throughout this License, whether in upper
149 |or lower case, means an individual or a legal entity exercising rights under, and complying
150 |with all of the terms of, this License. For legal entities, "You" includes any entity that
151 |controls, is controlled by, or is under common control with you. For purposes of this
152 |definition, "control" means (i) the power, direct or indirect, to cause the direction or
153 |management of such entity, whether by contract or otherwise, or (ii) ownership of fifty
154 |percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
155 |
156 |15) Right to Use. You may use the Original Work in all ways not otherwise restricted or
157 |conditioned by this License or by law, and Licensor promises not to interfere with or be
158 |responsible for such uses by You.
159 |
160 |This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission
161 |is hereby granted to copy and distribute this license without modification. This license
162 |may not be modified without the express written permission of its copyright owner.
163
164
165# Yahoo! UI Library (http://developer.yahoo.com/yui/)
166 - package version: 0.12
167
168 Copyright © 2005-2006 Yahoo! Inc. All rights reserved
169 * Copyright notes: http://docs.yahoo.com/info/copyright/copyright.html
170 * Software licence: http://developer.yahoo.com/yui/license.txt
171
172 |Software License Agreement (BSD License)
173 |
174 |Copyright (c) 2006, Yahoo! Inc.
175 |All rights reserved.
176 |
177 |Redistribution and use of this software in source and binary forms, with or without modification, are
178 |permitted provided that the following conditions are met:
179 |
180 |* Redistributions of source code must retain the above
181 | copyright notice, this list of conditions and the
182 | following disclaimer.
183 |
184 |* Redistributions in binary form must reproduce the above
185 | copyright notice, this list of conditions and the
186 | following disclaimer in the documentation and/or other
187 | materials provided with the distribution.
188 |
189 |* Neither the name of Yahoo! Inc. nor the names of its
190 | contributors may be used to endorse or promote products
191 | derived from this software without specific prior
192 | written permission of Yahoo! Inc.
193 |
194 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
195 |WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
196 |PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
197 |ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
198 |LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
199 |INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
200 |TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
201 |ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
202
203
204
205# YUI-ext (http://www.yui-ext.com)
206 - repository: http://yui-ext.googlecode.com/svn/trunk/ (revision: 120)
207
208 * Software licence: http://yui-ext.googlecode.com/svn/trunk/src/licence.txt
209
210 |yui-ext
211 |Copyright (c) 2006, Jack Slocum
212 |All rights reserved.
213 |
214 |Redistribution and use in source and binary forms, with or without modification,
215 |are permitted provided that the following conditions are met:
216 |
217 | * Redistributions of source code must retain the above copyright notice,
218 | this list of conditions and the following disclaimer.
219 | * Redistributions in binary form must reproduce the above copyright notice,
220 | this list of conditions and the following disclaimer in the documentation
221 | and/or other materials provided with the distribution.
222 | * Neither the name yui-ext nor the names of its contributors
223 | may be used to endorse or promote products derived from this software
224 | without specific prior written permission.
225 |
226 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
227 |ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
228 |WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
229 |IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
230 |INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
231 |BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232 |DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
233 |OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
234 |NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
235 |EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
236
237
238
239# iUI: iPhone User Interface Framework (http://code.google.com/p/iui/)
240 - package version: 282
241
242 Copyright (c) 2007-2009, iUI Project Members
243
244 |All rights reserved.
245 |
246 |Redistribution and use in source and binary forms, with or without modification,
247 |are permitted provided that the following conditions are met:
248 |
249 | * Redistributions of source code must retain the above copyright notice, this
250 | list of conditions and the following disclaimer.
251 | * Redistributions in binary form must reproduce the above copyright notice,
252 | this list of conditions and the following disclaimer in the documentation
253 | and/or other materials provided with the distribution.
254 | * Neither the name of the iUI Project nor the names of its contributors may
255 | be used to endorse or promote products derived from this software without
256 | specific prior written permission.
257 |
258 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
259 |"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
260 |LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
261 |A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
262 |CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
263 |EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
264 |PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
265 |PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
266 |LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
267 |NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
268 |SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
269
270
271
272# Big Integer Library v. 5.0
273 - code downloaded on March 5, 2007 from http://www.leemon.com/crypto/BigInt.js
274
275 |Big Integer Library v. 5.0
276 |Created 2000, last modified 2006
277 |Leemon Baird
278 |www.leemon.com
279 |
280 |This file is public domain. You can use it for any purpose without restriction.
281 |I do not guarantee that it is correct, so use it at your own risk. If you use
282 |it for something interesting, I'd appreciate hearing about it. If you find
283 |any bugs or make any improvements, I'd appreciate hearing about those too.
284 |It would also be nice if my name and address were left in the comments.
285 |But none of that is required.
286
287
288
289# JSON library
290 - code downloaded on October 13, 2008 from http://www.JSON.org/json2.js
291
292 |http://www.JSON.org/json2.js
293 |2008-09-01
294 |
295 |Public Domain.
296 |
297 |NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
298 |
299 |See http://www.JSON.org/js.html
300
301
302
303# Other code snippets used in the first demo of the program, and still present just to be able to
304 read record previously written using these same functions:
305
306 - Code downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip
307 File used: jsSha2/sha256.js
308
309 |A JavaScript implementation of the Secure Hash Algorithm, SHA-256
310 |Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
311 |Distributed under the BSD License
312 |Some bits taken from Paul Johnston's SHA-1 implementation
313
314
315 - Code downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip
316 Files used: entropy.js, aesprng.js, md5.js, aes.js, utf-8.js
317
318
319 - Code downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js
320
321 |A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
322 |Digest Algorithm, as defined in RFC 1321.
323 |Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
324 |Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
325 |Distributed under the BSD License
326 |See http://pajhome.org.uk/crypt/md5 for more info.
327
328
329
330 #General notes
331 The code in this page has been processed with a JavaScript compressor and is thus
332 difficult to read.
333 To get the exact version of the code used to build this application you
334 can take a look here:
335 - http://www.clipperz.com/security_privacy/security_code_review
336
diff --git a/frontend/gamma/properties/gamma.properties.json b/frontend/gamma/properties/gamma.properties.json
new file mode 100644
index 0000000..57f26f1
--- a/dev/null
+++ b/frontend/gamma/properties/gamma.properties.json
@@ -0,0 +1,189 @@
1{
2 "copyright.values": {
3 "mochikit.repository": "http://svn.mochikit.com/mochikit/trunk/",
4 "mochikit.version": "1506"
5 },
6 "js": [
7 "MochiKit/Base.js",
8 "MochiKit/Iter.js",
9 "MochiKit/Logging.js",
10 "-- MochiKit/DateTime.js",
11 "MochiKit/Format.js",
12 "MochiKit/Async.js",
13 "MochiKit/DOM.js",
14 "MochiKit/Style.js",
15 "MochiKit/LoggingPane.js",
16 "MochiKit/Color.js",
17 "MochiKit/Signal.js",
18 "MochiKit/Position.js",
19 "MochiKit/Selector.js",
20 "MochiKit/Visual.js",
21
22 "JSON/json2.js",
23
24 "Clipperz/YUI/Utils.js",
25 "Clipperz/YUI/DomHelper.js",
26
27 "Clipperz/ByteArray.js",
28 "Clipperz/Base.js",
29 "Clipperz/Async.js",
30 "Clipperz/CSVProcessor.js",
31 "Clipperz/KeePassExportProcessor.js",
32 "Clipperz/Date.js",
33 "Clipperz/DOM.js",
34 "Clipperz/Logging.js",
35 "Clipperz/Signal.js",
36 "Clipperz/Style.js",
37 "Clipperz/Visual.js",
38 "Clipperz/Set.js",
39 "-- Clipperz/Profile.js",
40 "Clipperz/KeyValueObjectStore.js",
41
42 "Clipperz/Crypto/SHA.js",
43 "Clipperz/Crypto/AES.js",
44 "Clipperz/Crypto/PRNG.js",
45 "Clipperz/Crypto/BigInt.js",
46 "Clipperz/Crypto/Base.js",
47 "Clipperz/Crypto/SRP.js",
48 "Clipperz/Crypto/RSA.js",
49
50 "Clipperz/PM/Strings/Strings_defaults.js",
51 "Clipperz/PM/Strings/Strings_en-US.js",
52 "-- # Clipperz/PM/Strings/Strings_en-GB.js",
53 "-- # Clipperz/PM/Strings/Strings_en-CA.js",
54 "-- Clipperz/PM/Strings/Strings_it-IT.js",
55 "-- Clipperz/PM/Strings/Strings_pt-BR.js",
56 "-- # Clipperz/PM/Strings/Strings_pt-PT.js",
57 "-- Clipperz/PM/Strings/Strings_ja-JP.js",
58 "-- Clipperz/PM/Strings/Strings_zh-CN.js",
59 "-- Clipperz/PM/Strings/Strings_es-ES.js",
60 "-- Clipperz/PM/Strings/Strings_fr-FR.js",
61 "-- # Clipperz/PM/Strings/Strings_de-DE.js",
62 "-- # Clipperz/PM/Strings/Strings_el-GR.js",
63 "-- # Clipperz/PM/Strings/Strings_ru-RU.js",
64 "-- # Clipperz/PM/Strings/Strings_he-IL.js",
65 "Clipperz/PM/Strings.js",
66 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js",
67
68 "Clipperz/PM/Date.js",
69
70 "Clipperz/PM/Toll.js",
71 "Clipperz/PM/Proxy.js",
72 "Clipperz/PM/Proxy/Proxy.JSON.js",
73 "Clipperz/PM/Proxy/Proxy.Offline.js",
74 "Clipperz/PM/Proxy/Proxy.Offline.DataStore.js",
75 "Clipperz/PM/Connection.js",
76 "Clipperz/PM/Crypto.js",
77 "Clipperz/PM/BookmarkletProcessor.js",
78
79 "Clipperz/PM/DataModel/EncryptedRemoteObject.js",
80 "Clipperz/PM/DataModel/User.js",
81 "Clipperz/PM/DataModel/User.Header.Legacy.js",
82 "Clipperz/PM/DataModel/User.Header.RecordIndex.js",
83 "Clipperz/PM/DataModel/User.Header.Preferences.js",
84 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js",
85 "Clipperz/PM/DataModel/Record.js",
86 "Clipperz/PM/DataModel/Record.Version.js",
87 "Clipperz/PM/DataModel/Record.Version.Field.js",
88 "Clipperz/PM/DataModel/DirectLogin.js",
89 "Clipperz/PM/DataModel/DirectLoginInput.js",
90 "Clipperz/PM/DataModel/DirectLoginBinding.js",
91 "Clipperz/PM/DataModel/DirectLoginFormValue.js",
92 "Clipperz/PM/DataModel/OneTimePassword.js",
93
94 "Clipperz/PM/UI/Canvas/Marks/exclamationMark.js",
95 "Clipperz/PM/UI/Canvas/Marks/questionMark.js",
96 "Clipperz/PM/UI/Canvas/Marks/info.js",
97
98 "Clipperz/PM/UI/Canvas/Features/store.js",
99 "Clipperz/PM/UI/Canvas/Features/protect.js",
100 "Clipperz/PM/UI/Canvas/Features/directLogin.js",
101 "Clipperz/PM/UI/Canvas/Features/share.js",
102
103 "Clipperz/PM/UI/Canvas/Star/normal.js",
104
105 "Clipperz/PM/UI/Canvas/CoverActions/look.js",
106 "Clipperz/PM/UI/Canvas/CoverActions/download.js",
107
108 "Clipperz/PM/UI/Canvas/Tips/open.js",
109 "Clipperz/PM/UI/Canvas/Tips/close.js",
110
111 "Clipperz/PM/UI/Canvas/RegisterButton/normal.js",
112
113 "Clipperz/PM/UI/Canvas/Logo/normal.js",
114
115 "Clipperz/PM/UI/Canvas/GraphicFunctions.js",
116
117 "Clipperz/PM/UI/Common/Components/BaseComponent.js",
118 "Clipperz/PM/UI/Common/Components/Button.js",
119 "Clipperz/PM/UI/Common/Components/ComponentSlot.js",
120 "Clipperz/PM/UI/Common/Components/FaviconComponent.js",
121 "Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js",
122 "Clipperz/PM/UI/Common/Components/ProgressBar.js",
123 "Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js",
124 "Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js",
125 "Clipperz/PM/UI/Common/Components/TabPanelComponent.js",
126 "Clipperz/PM/UI/Common/Components/Tooltip.js",
127 "Clipperz/PM/UI/Common/Components/TranslatorWidget.js",
128
129 "Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js",
130 "Clipperz/PM/UI/Common/Controllers/ProgressBarController.js",
131 "Clipperz/PM/UI/Common/Controllers/TabPanelController.js",
132 "Clipperz/PM/UI/Common/Controllers/WizardController.js",
133
134 "Clipperz/PM/UI/Web/Components/Page.js",
135 "Clipperz/PM/UI/Web/Components/PageHeader.js",
136 "Clipperz/PM/UI/Web/Components/PageFooter.js",
137 "Clipperz/PM/UI/Web/Components/LoginPage.js",
138 "Clipperz/PM/UI/Web/Components/LoginForm.js",
139 "Clipperz/PM/UI/Web/Components/LoginProgress.js",
140 "Clipperz/PM/UI/Web/Components/AppPage.js",
141 "Clipperz/PM/UI/Web/Components/UserInfoBox.js",
142 "Clipperz/PM/UI/Web/Components/TabSidePanel.js",
143 "Clipperz/PM/UI/Web/Components/GridComponent.js",
144
145 "Clipperz/PM/UI/Web/Components/ColumnManager.js",
146 "Clipperz/PM/UI/Web/Components/TextColumnManager.js",
147 "Clipperz/PM/UI/Web/Components/FaviconColumnManager.js",
148 "Clipperz/PM/UI/Web/Components/ImageColumnManager.js",
149 "Clipperz/PM/UI/Web/Components/DateColumnManager.js",
150 "Clipperz/PM/UI/Web/Components/LinkColumnManager.js",
151 "Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js",
152 "Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js",
153 "Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js",
154 "Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js",
155
156 "Clipperz/PM/UI/Web/Components/AccountPanel.js",
157 "Clipperz/PM/UI/Web/Components/DataPanel.js",
158 "Clipperz/PM/UI/Web/Components/ToolsPanel.js",
159 "Clipperz/PM/UI/Web/Components/RulerComponent.js",
160 "Clipperz/PM/UI/Web/Components/CardDialogComponent.js",
161 "Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js",
162 "Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js",
163 "Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js",
164 "Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js",
165 "Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js",
166 "Clipperz/PM/UI/Web/Components/BookmarkletComponent.js",
167 "Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js",
168 "Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js",
169 "Clipperz/PM/UI/Web/Components/PasswordTooltip.js",
170
171 "Clipperz/PM/UI/Web/Controllers/MainController.js",
172 "Clipperz/PM/UI/Web/Controllers/LoginController.js",
173 "Clipperz/PM/UI/Web/Controllers/AppController.js",
174 "Clipperz/PM/UI/Web/Controllers/FilterController.js",
175 "Clipperz/PM/UI/Web/Controllers/GridController.js",
176 "Clipperz/PM/UI/Web/Controllers/CardsController.js",
177 "Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js",
178 "Clipperz/PM/UI/Web/Controllers/CardDialogController.js",
179 "Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js",
180 "Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js",
181
182 "main.js"
183 ],
184
185 "css": [
186 "clipperz/clipperz.css",
187 "clipperz/compact.css"
188 ]
189} \ No newline at end of file
diff --git a/frontend/gamma/properties/mobile.properties.json b/frontend/gamma/properties/mobile.properties.json
new file mode 100644
index 0000000..e26b95f
--- a/dev/null
+++ b/frontend/gamma/properties/mobile.properties.json
@@ -0,0 +1,119 @@
1{
2 "copyright.values": {
3 "mochikit.repository": "http://svn.mochikit.com/mochikit/trunk/",
4 "mochikit.version": "1506"
5 },
6 "js": [
7 "MochiKit/Base.js",
8 "MochiKit/Iter.js",
9 "MochiKit/Logging.js",
10 "-- MochiKit/DateTime.js",
11 "MochiKit/Format.js",
12 "MochiKit/Async.js",
13 "MochiKit/DOM.js",
14 "MochiKit/Style.js",
15 "MochiKit/LoggingPane.js",
16 "MochiKit/Color.js",
17 "MochiKit/Signal.js",
18 "MochiKit/Position.js",
19 "MochiKit/Selector.js",
20 "MochiKit/Visual.js",
21
22 "JSON/json2.js",
23
24 "Clipperz/YUI/Utils.js",
25 "Clipperz/YUI/DomHelper.js",
26
27 "Clipperz/ByteArray.js",
28 "Clipperz/Base.js",
29 "Clipperz/Async.js",
30 "-- Clipperz/CSVProcessor.js",
31 "-- Clipperz/KeePassExportProcessor.js",
32 "Clipperz/Date.js",
33 "Clipperz/DOM.js",
34 "Clipperz/Logging.js",
35 "Clipperz/Signal.js",
36 "Clipperz/Style.js",
37 "Clipperz/Visual.js",
38 "Clipperz/Set.js",
39 "Clipperz/KeyValueObjectStore.js",
40
41 "Clipperz/Crypto/SHA.js",
42 "Clipperz/Crypto/AES.js",
43 "Clipperz/Crypto/PRNG.js",
44 "Clipperz/Crypto/BigInt.js",
45 "Clipperz/Crypto/Base.js",
46 "Clipperz/Crypto/SRP.js",
47 "Clipperz/Crypto/RSA.js",
48
49 "Clipperz/PM/Strings/Strings_defaults.js",
50 "Clipperz/PM/Strings/Strings_en-US.js",
51 "-- # Clipperz/PM/Strings/Strings_en-GB.js",
52 "-- # Clipperz/PM/Strings/Strings_en-CA.js",
53 "-- Clipperz/PM/Strings/Strings_it-IT.js",
54 "-- Clipperz/PM/Strings/Strings_pt-BR.js",
55 "-- # Clipperz/PM/Strings/Strings_pt-PT.js",
56 "-- Clipperz/PM/Strings/Strings_ja-JP.js",
57 "-- Clipperz/PM/Strings/Strings_zh-CN.js",
58 "-- Clipperz/PM/Strings/Strings_es-ES.js",
59 "-- Clipperz/PM/Strings/Strings_fr-FR.js",
60 "-- # Clipperz/PM/Strings/Strings_de-DE.js",
61 "-- # Clipperz/PM/Strings/Strings_el-GR.js",
62 "-- # Clipperz/PM/Strings/Strings_ru-RU.js",
63 "-- # Clipperz/PM/Strings/Strings_he-IL.js",
64 "Clipperz/PM/Strings.js",
65 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js",
66
67 "Clipperz/PM/Date.js",
68
69 "Clipperz/PM/Toll.js",
70 "Clipperz/PM/Proxy.js",
71 "Clipperz/PM/Proxy/Proxy.JSON.js",
72 "Clipperz/PM/Proxy/Proxy.Offline.js",
73 "Clipperz/PM/Connection.js",
74 "Clipperz/PM/Crypto.js",
75 "-- Clipperz/PM/BookmarkletProcessor.js",
76
77 "Clipperz/PM/DataModel/EncryptedRemoteObject.js",
78 "Clipperz/PM/DataModel/User.js",
79 "Clipperz/PM/DataModel/User.Header.Legacy.js",
80 "Clipperz/PM/DataModel/User.Header.RecordIndex.js",
81 "Clipperz/PM/DataModel/User.Header.Preferences.js",
82 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js",
83 "Clipperz/PM/DataModel/Record.js",
84 "Clipperz/PM/DataModel/Record.Version.js",
85 "Clipperz/PM/DataModel/Record.Version.Field.js",
86 "Clipperz/PM/DataModel/DirectLogin.js",
87 "Clipperz/PM/DataModel/DirectLoginInput.js",
88 "Clipperz/PM/DataModel/DirectLoginBinding.js",
89 "Clipperz/PM/DataModel/DirectLoginFormValue.js",
90 "Clipperz/PM/DataModel/OneTimePassword.js",
91
92 "Clipperz/PM/UI/Common/Components/BaseComponent.js",
93 "-- Clipperz/PM/UI/Common/Components/Button.js",
94 "Clipperz/PM/UI/Common/Components/ComponentSlot.js",
95 "-- Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js",
96 "Clipperz/PM/UI/Common/Components/ProgressBar.js",
97 "-- Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js",
98 "-- Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js",
99 "-- Clipperz/PM/UI/Common/Components/TabPanelComponent.js",
100 "-- Clipperz/PM/UI/Common/Components/Tooltip.js",
101 "-- Clipperz/PM/UI/Common/Components/TranslatorWidget.js",
102
103 "Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js",
104 "Clipperz/PM/UI/Common/Controllers/ProgressBarController.js",
105 "-- Clipperz/PM/UI/Common/Controllers/TabPanelController.js",
106
107 "Clipperz/PM/UI/iPhone/Components/LoginForm.js",
108 "Clipperz/PM/UI/iPhone/Components/CardList.js",
109 "Clipperz/PM/UI/iPhone/Components/CardDetail.js",
110
111 "Clipperz/PM/UI/iPhone/Controllers/MainController.js",
112
113 "main_iPhone.js"
114 ],
115
116 "css": [
117 "clipperz/iPhone.css"
118 ]
119} \ No newline at end of file
diff --git a/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js b/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js
new file mode 100644
index 0000000..040cdbf
--- a/dev/null
+++ b/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js
@@ -0,0 +1,169 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29MochiKit.Base.update(Clipperz.Async.Deferred.prototype, {
30/*
31 '_addTest': function(anExpectedValue, aDescription, isDeep, aResult) {
32 if (isDeep) {
33 SimpleTest.isDeeply(aResult, anExpectedValue, aDescription);
34 } else {
35 SimpleTest.is(aResult, anExpectedValue, aDescription);
36 }
37
38 return aResult;
39 },
40*/
41 'addTest': function (anExpectedValue, aDescription, isDeep) {
42 // this.addMethod(this, '_addTest', anExpectedValue, aDescription, isDeep);
43 // this.addCallback(Clipperz.Async.test, anExpectedValue, aDescription, isDeep);
44
45 if (isDeep) {
46 // SimpleTest.isDeeply(aResult, anExpectedValue, aDescription);
47 this.addCallback(Clipperz.Async.Test.isDeeply(anExpectedValue, aDescription));
48 } else {
49 // SimpleTest.is(aResult, anExpectedValue, aDescription);
50 this.addCallback(Clipperz.Async.Test.is(anExpectedValue, aDescription));
51 }
52 },
53
54 //-------------------------------------------------------------------------
55
56 'shouldSucceed': function (aDescription) {
57 this.addCallbackPass(SimpleTest.ok, true, aDescription);
58 this.addErrbackPass (SimpleTest.ok, false, aDescription);
59 this.addBoth(MochiKit.Async.succeed, null);
60 },
61
62 'shouldFail': function (aDescription) {
63 this.addCallbackPass(SimpleTest.ok, false, aDescription);
64 this.addErrbackPass (SimpleTest.ok, true, aDescription);
65 this.addBoth(MochiKit.Async.succeed, null);
66 },
67
68 //-------------------------------------------------------------------------
69
70});
71
72
73Clipperz.Async.Test = {};
74MochiKit.Base.update(Clipperz.Async.Test, {
75
76 'is': function (anExpectedResult, aDescription) {
77 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) {
78 SimpleTest.is(aResult, anExpectedResult, aDescription);
79
80 return aResult;
81 }, anExpectedResult, aDescription);
82 },
83
84 //-------------------------------------------------------------------------
85
86 'ok': function (aDescription) {
87 return MochiKit.Base.partial(function (aDescription, aResult) {
88 SimpleTest.ok(aResult, aDescription);
89
90 return aResult;
91 }, aDescription);
92 },
93
94 //-------------------------------------------------------------------------
95
96 'fail': function(aDescription) {
97 return MochiKit.Base.partial(function (aDescription, aResult) {
98 SimpleTest.ok(!aResult, aDescription);
99
100 return aResult;
101 }, aDescription);
102 },
103
104 //-------------------------------------------------------------------------
105
106 'isDeeply': function (anExpectedResult, aDescription) {
107 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) {
108 SimpleTest.isDeeply(aResult, anExpectedResult, aDescription);
109
110 return aResult;
111 }, anExpectedResult, aDescription);
112 },
113
114 //-------------------------------------------------------------------------
115 __syntaxFix__: "syntax fix"
116});
117
118
119SimpleTest.runDeferredTests = function (aName, aTestSet, aTestArguments) {
120 try {
121 var deferredTests;
122 var aTestName;
123 var title;
124
125 deferredTests = new Clipperz.Async.Deferred(aName + " <deferred test set>", aTestArguments);
126
127 title = aName;
128
129 aTestName = window.location.href.match(/#.*/);
130 if (aTestName && (aTestName != '#')) {
131 aTestName = aTestName[0].slice(1);
132 if (aTestName in aTestSet) {
133 //Clipperz.log("single test execution, via fragment identifier", aTestName);
134 title += ' [' + aTestName + ']';
135 deferredTests.addCallback(aTestSet[aTestName], aTestArguments);
136 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
137 } else {
138 title = 'WRONG TEST NAME'
139 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run");
140 }
141 } else {
142 for (aTestName in aTestSet) {
143 deferredTests.addCallback(aTestSet[aTestName], aTestArguments);
144 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
145 deferredTests.addBoth(MochiKit.Async.wait, 0.5);
146 }
147 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests");
148 }
149
150 MochiKit.DOM.currentDocument().title = title;
151
152 deferredTests.addBoth(SimpleTest.finish);
153 deferredTests.callback();
154
155 SimpleTest.waitForExplicitFinish();
156 } catch (err) {
157 var s = "test suite failure!\n";
158 var o = {};
159 var k = null;
160 for (k in err) {
161 // ensure unique keys?!
162 if (!o[k]) {
163 s += k + ": " + err[k] + "\n";
164 o[k] = err[k];
165 }
166 }
167 ok ( false, s );
168 }
169}
diff --git a/frontend/gamma/tests/SimpleTest/SimpleTest.js b/frontend/gamma/tests/SimpleTest/SimpleTest.js
new file mode 100644
index 0000000..418954f
--- a/dev/null
+++ b/frontend/gamma/tests/SimpleTest/SimpleTest.js
@@ -0,0 +1,424 @@
1/**
2 * SimpleTest, a partial Test.Simple/Test.More API compatible test library.
3 *
4 * Why?
5 *
6 * Test.Simple doesn't work on IE < 6.
7 * TODO:
8 * * Support the Test.Simple API used by MochiKit, to be able to test MochiKit
9 * itself against IE 5.5
10 *
11**/
12
13if (typeof(SimpleTest) == "undefined") {
14 var SimpleTest = {};
15}
16
17// Check to see if the TestRunner is present and has logging
18if (typeof(parent) != "undefined" && parent.TestRunner) {
19 SimpleTest._logEnabled = parent.TestRunner.logEnabled;
20}
21
22SimpleTest._tests = [];
23SimpleTest._stopOnLoad = true;
24SimpleTest._scopeCopy = {};
25
26/**
27 * Saves a copy of the specified scope variables.
28 */
29SimpleTest.saveScope = function (scope) {
30 SimpleTest._scopeCopy = {};
31 for (var k in scope) {
32 SimpleTest._scopeCopy[k] = scope[k];
33 }
34}
35
36/**
37 * Verifies the specified scope against the stored copy and reports
38 * any differences as test failures.
39 */
40SimpleTest.verifyScope = function (scope) {
41 var filter = ['test', '_firebug','_FirebugConsole','XMLHttpRequest','Audio',
42 'XSLTProcessor','Option','Image','scrollMaxX','scrollMaxY',
43 'clipboardData'];
44 for (var k in scope) {
45 if (MochiKit.Base.findValue(filter, k) < 0) {
46 var v = scope[k];
47 var old = SimpleTest._scopeCopy[k];
48 if (v !== old && typeof(old) === "undefined") {
49 SimpleTest.ok(false, "scope modified, variable " + k + " was added");
50 } else if (v !== old) {
51 SimpleTest.ok(false, "scope modified, variable " + k + " changed from: " + old + ", to: " + v);
52 }
53 }
54 }
55 for (var k in SimpleTest._scopeCopy) {
56 if (!(k in scope)) {
57 SimpleTest.ok(false, "scope modified, variable " + k + " has been removed");
58 }
59 }
60}
61
62/**
63 * Something like assert.
64 */
65SimpleTest.ok = function (condition, name, diag) {
66 var test = {'result': !!condition, 'name': name, 'diag': diag || ""};
67 if (SimpleTest._logEnabled) {
68 var msg = test.result ? "PASS" : "FAIL";
69 msg += " | " + test.name;
70 if (test.result) {
71 parent.TestRunner.logger.log(msg);
72 } else {
73 msg += " | " + test.diag;
74 parent.TestRunner.logger.error(msg);
75 }
76 }
77 SimpleTest._tests.push(test);
78};
79
80/**
81 * Roughly equivalent to ok(a==b, name)
82 */
83SimpleTest.is = function (a, b, name) {
84 var repr = MochiKit.Base.repr;
85 SimpleTest.ok(a == b, name, "got " + repr(a) + ", expected " + repr(b));
86};
87
88/**
89 * Roughly equivalent to ok(compare(a,b)==0, name)
90 */
91SimpleTest.eq = function (a, b, name) {
92 var base = MochiKit.Base;
93 var repr = base.repr;
94 try {
95 SimpleTest.ok(base.compare(a, b) == 0, name, "got " + repr(a) + ", expected " + repr(b));
96 } catch (e) {
97 SimpleTest.ok(false, name, "exception in compare: " + repr(e));
98 }
99};
100
101
102/**
103 * Makes a test report, returns it as a DIV element.
104**/
105SimpleTest.report = function () {
106 var DIV = MochiKit.DOM.DIV;
107 var passed = 0;
108 var failed = 0;
109 var results = MochiKit.Base.map(
110 function (test) {
111 var cls, msg;
112 if (test.result) {
113 passed++;
114 cls = "test_ok";
115 msg = "ok - " + test.name;
116 } else {
117 failed++;
118 cls = "test_not_ok";
119 msg = "not ok - " + test.name;
120 if (test.diag != null && test.diag != "") {
121 msg += ": " + test.diag;
122 }
123 }
124 return DIV({"class": cls}, msg);
125 },
126 SimpleTest._tests
127 );
128 var summary_class = ((failed == 0) ? 'all_pass' : 'some_fail');
129 return DIV({'class': 'tests_report'},
130 DIV({'class': 'tests_summary ' + summary_class},
131 DIV({'class': 'tests_passed'}, "Passed: " + passed),
132 DIV({'class': 'tests_failed'}, "Failed: " + failed)),
133 results
134 );
135};
136
137/**
138 * Toggle element visibility
139**/
140SimpleTest.toggle = function(el) {
141 if (MochiKit.Style.getStyle(el, 'display') == 'block') {
142 el.style.display = 'none';
143 } else {
144 el.style.display = 'block';
145 }
146};
147
148/**
149 * Toggle visibility for divs with a specific class.
150**/
151SimpleTest.toggleByClass = function (cls) {
152 var elems = MochiKit.DOM.getElementsByTagAndClassName('div', cls);
153 MochiKit.Base.map(SimpleTest.toggle, elems);
154 return false;
155};
156
157/**
158 * Shows the report in the browser
159**/
160
161SimpleTest.showReport = function() {
162 var base = MochiKit.Base;
163 var dom = MochiKit.DOM;
164 var togglePassed = dom.A({'href': '#'}, "Toggle passed tests");
165 var toggleFailed = dom.A({'href': '#'}, "Toggle failed tests");
166 togglePassed.onclick = base.partial(SimpleTest.toggleByClass, 'test_ok');
167 toggleFailed.onclick = base.partial(SimpleTest.toggleByClass, 'test_not_ok');
168 var body = document.getElementsByTagName("body")[0];
169 var firstChild = body.childNodes[0];
170 var addNode;
171 if (firstChild) {
172 addNode = function (el) {
173 body.insertBefore(el, firstChild);
174 };
175 } else {
176 addNode = function (el) {
177 body.appendChild(el)
178 };
179 }
180 addNode(togglePassed);
181 addNode(dom.SPAN(null, " "));
182 addNode(toggleFailed);
183 addNode(SimpleTest.report());
184};
185
186/**
187 * Tells SimpleTest to don't finish the test when the document is loaded,
188 * useful for asynchronous tests.
189 *
190 * When SimpleTest.waitForExplicitFinish is called,
191 * explicit SimpleTest.finish() is required.
192**/
193SimpleTest.waitForExplicitFinish = function () {
194 SimpleTest._stopOnLoad = false;
195};
196
197/**
198 * Talks to the TestRunner if being ran on a iframe and the parent has a
199 * TestRunner object.
200**/
201SimpleTest.talkToRunner = function () {
202 if (typeof(parent) != "undefined" && parent.TestRunner) {
203 parent.TestRunner.testFinished(document);
204 }
205};
206
207/**
208 * Finishes the tests. This is automatically called, except when
209 * SimpleTest.waitForExplicitFinish() has been invoked.
210**/
211SimpleTest.finish = function () {
212 SimpleTest.showReport();
213 SimpleTest.talkToRunner();
214};
215
216
217MochiKit.DOM.addLoadEvent(function() {
218 if (SimpleTest._stopOnLoad) {
219 SimpleTest.finish();
220 }
221});
222
223// --------------- Test.Builder/Test.More isDeeply() -----------------
224
225
226SimpleTest.DNE = {dne: 'Does not exist'};
227SimpleTest.LF = "\r\n";
228SimpleTest._isRef = function (object) {
229 var type = typeof(object);
230 return type == 'object' || type == 'function';
231};
232
233
234SimpleTest._deepCheck = function (e1, e2, stack, seen) {
235 var ok = false;
236 // Either they're both references or both not.
237 var sameRef = !(!SimpleTest._isRef(e1) ^ !SimpleTest._isRef(e2));
238 if (e1 == null && e2 == null) {
239 ok = true;
240 } else if (e1 != null ^ e2 != null) {
241 ok = false;
242 } else if (e1 == SimpleTest.DNE ^ e2 == SimpleTest.DNE) {
243 ok = false;
244 } else if (sameRef && e1 == e2) {
245 // Handles primitives and any variables that reference the same
246 // object, including functions.
247 ok = true;
248 } else if (SimpleTest.isa(e1, 'Array') && SimpleTest.isa(e2, 'Array')) {
249 ok = SimpleTest._eqArray(e1, e2, stack, seen);
250 } else if (typeof e1 == "object" && typeof e2 == "object") {
251 ok = SimpleTest._eqAssoc(e1, e2, stack, seen);
252 } else {
253 // If we get here, they're not the same (function references must
254 // always simply rererence the same function).
255 stack.push({ vals: [e1, e2] });
256 ok = false;
257 }
258 return ok;
259};
260
261SimpleTest._eqArray = function (a1, a2, stack, seen) {
262 // Return if they're the same object.
263 if (a1 == a2) return true;
264
265 // JavaScript objects have no unique identifiers, so we have to store
266 // references to them all in an array, and then compare the references
267 // directly. It's slow, but probably won't be much of an issue in
268 // practice. Start by making a local copy of the array to as to avoid
269 // confusing a reference seen more than once (such as [a, a]) for a
270 // circular reference.
271 for (var j = 0; j < seen.length; j++) {
272 if (seen[j][0] == a1) {
273 return seen[j][1] == a2;
274 }
275 }
276
277 // If we get here, we haven't seen a1 before, so store it with reference
278 // to a2.
279 seen.push([ a1, a2 ]);
280
281 var ok = true;
282 // Only examines enumerable attributes. Only works for numeric arrays!
283 // Associative arrays return 0. So call _eqAssoc() for them, instead.
284 var max = a1.length > a2.length ? a1.length : a2.length;
285 if (max == 0) return SimpleTest._eqAssoc(a1, a2, stack, seen);
286 for (var i = 0; i < max; i++) {
287 var e1 = i > a1.length - 1 ? SimpleTest.DNE : a1[i];
288 var e2 = i > a2.length - 1 ? SimpleTest.DNE : a2[i];
289 stack.push({ type: 'Array', idx: i, vals: [e1, e2] });
290 if (ok = SimpleTest._deepCheck(e1, e2, stack, seen)) {
291 stack.pop();
292 } else {
293 break;
294 }
295 }
296 return ok;
297};
298
299SimpleTest._eqAssoc = function (o1, o2, stack, seen) {
300 // Return if they're the same object.
301 if (o1 == o2) return true;
302
303 // JavaScript objects have no unique identifiers, so we have to store
304 // references to them all in an array, and then compare the references
305 // directly. It's slow, but probably won't be much of an issue in
306 // practice. Start by making a local copy of the array to as to avoid
307 // confusing a reference seen more than once (such as [a, a]) for a
308 // circular reference.
309 seen = seen.slice(0);
310 for (var j = 0; j < seen.length; j++) {
311 if (seen[j][0] == o1) {
312 return seen[j][1] == o2;
313 }
314 }
315
316 // If we get here, we haven't seen o1 before, so store it with reference
317 // to o2.
318 seen.push([ o1, o2 ]);
319
320 // They should be of the same class.
321
322 var ok = true;
323 // Only examines enumerable attributes.
324 var o1Size = 0; for (var i in o1) o1Size++;
325 var o2Size = 0; for (var i in o2) o2Size++;
326 var bigger = o1Size > o2Size ? o1 : o2;
327 for (var i in bigger) {
328 var e1 = o1[i] == undefined ? SimpleTest.DNE : o1[i];
329 var e2 = o2[i] == undefined ? SimpleTest.DNE : o2[i];
330 stack.push({ type: 'Object', idx: i, vals: [e1, e2] });
331 if (ok = SimpleTest._deepCheck(e1, e2, stack, seen)) {
332 stack.pop();
333 } else {
334 break;
335 }
336 }
337 return ok;
338};
339
340SimpleTest._formatStack = function (stack) {
341 var variable = '$Foo';
342 for (var i = 0; i < stack.length; i++) {
343 var entry = stack[i];
344 var type = entry['type'];
345 var idx = entry['idx'];
346 if (idx != null) {
347 if (/^\d+$/.test(idx)) {
348 // Numeric array index.
349 variable += '[' + idx + ']';
350 } else {
351 // Associative array index.
352 idx = idx.replace("'", "\\'");
353 variable += "['" + idx + "']";
354 }
355 }
356 }
357
358 var vals = stack[stack.length-1]['vals'].slice(0, 2);
359 var vars = [
360 variable.replace('$Foo', 'got'),
361 variable.replace('$Foo', 'expected')
362 ];
363
364 var out = "Structures begin differing at:" + SimpleTest.LF;
365 for (var i = 0; i < vals.length; i++) {
366 var val = vals[i];
367 if (val == null) {
368 val = 'undefined';
369 } else {
370 val == SimpleTest.DNE ? "Does not exist" : "'" + val + "'";
371 }
372 }
373
374 out += vars[0] + ' = ' + vals[0] + SimpleTest.LF;
375 out += vars[1] + ' = ' + vals[1] + SimpleTest.LF;
376
377 return ' ' + out;
378};
379
380
381SimpleTest.isDeeply = function (it, as, name) {
382 var ok;
383 // ^ is the XOR operator.
384 if (SimpleTest._isRef(it) ^ SimpleTest._isRef(as)) {
385 // One's a reference, one isn't.
386 ok = false;
387 } else if (!SimpleTest._isRef(it) && !SimpleTest._isRef(as)) {
388 // Neither is an object.
389 ok = SimpleTest.is(it, as, name);
390 } else {
391 // We have two objects. Do a deep comparison.
392 var stack = [], seen = [];
393 if ( SimpleTest._deepCheck(it, as, stack, seen)) {
394 ok = SimpleTest.ok(true, name);
395 } else {
396 ok = SimpleTest.ok(false, name, SimpleTest._formatStack(stack));
397 }
398 }
399 return ok;
400};
401
402SimpleTest.typeOf = function (object) {
403 var c = Object.prototype.toString.apply(object);
404 var name = c.substring(8, c.length - 1);
405 if (name != 'Object') return name;
406 // It may be a non-core class. Try to extract the class name from
407 // the constructor function. This may not work in all implementations.
408 if (/function ([^(\s]+)/.test(Function.toString.call(object.constructor))) {
409 return RegExp.$1;
410 }
411 // No idea. :-(
412 return name;
413};
414
415SimpleTest.isa = function (object, clas) {
416 return SimpleTest.typeOf(object) == clas;
417};
418
419
420
421// Global symbols:
422var ok = SimpleTest.ok;
423var is = SimpleTest.is;
424var isDeeply = SimpleTest.isDeeply;
diff --git a/frontend/gamma/tests/SimpleTest/TestRunner.js b/frontend/gamma/tests/SimpleTest/TestRunner.js
new file mode 100644
index 0000000..81a36cf
--- a/dev/null
+++ b/frontend/gamma/tests/SimpleTest/TestRunner.js
@@ -0,0 +1,233 @@
1/**
2 * TestRunner: A test runner for SimpleTest
3 * TODO:
4 *
5 * * Avoid moving iframes: That causes reloads on mozilla and opera.
6 *
7 *
8**/
9var TestRunner = {};
10TestRunner.logEnabled = false;
11TestRunner._iframes = {};
12TestRunner._iframeDocuments = {};
13TestRunner._iframeRows = {};
14TestRunner._currentTest = 0;
15TestRunner._urls = [];
16TestRunner._testsDiv = DIV();
17TestRunner._progressDiv = DIV();
18TestRunner._summaryDiv = DIV(null,
19 H1(null, "Tests Summary"),
20 TABLE(null,
21 THEAD(null,
22 TR(null,
23 TH(null, "Test"),
24 TH(null, "Passed"),
25 TH(null, "Failed")
26 )
27 ),
28 TFOOT(/*null, TR(null, TH(null, "-"), TH(null, "--"), TH(null, "---"))*/),
29 TBODY()
30 )
31);
32
33/**
34 * This function is called after generating the summary.
35**/
36TestRunner.onComplete = null;
37
38/**
39 * If logEnabled is true, this is the logger that will be used.
40**/
41TestRunner.logger = MochiKit.Logging.logger;
42
43/**
44 * Toggle element visibility
45**/
46TestRunner._toggle = function(el) {
47 if (el.className == "noshow") {
48 el.className = "";
49 el.style.cssText = "";
50 } else {
51 el.className = "noshow";
52 el.style.cssText = "width:0px; height:0px; border:0px;";
53 }
54};
55
56
57/**
58 * Creates the iframe that contains a test
59**/
60TestRunner._makeIframe = function (url) {
61 var iframe = document.createElement('iframe');
62 iframe.src = url;
63 iframe.name = url;
64 iframe.width = "500";
65 var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0];
66 var tr = TR(null, TD({'colspan': '3'}, iframe));
67 iframe._row = tr;
68 tbody.appendChild(tr);
69 return iframe;
70};
71
72/**
73 * TestRunner entry point.
74 *
75 * The arguments are the URLs of the test to be ran.
76 *
77**/
78TestRunner.runTests = function (/*url...*/) {
79 if (TestRunner.logEnabled)
80 TestRunner.logger.log("SimpleTest START");
81
82 var body = document.getElementsByTagName("body")[0];
83 appendChildNodes(body,
84 TestRunner._testsDiv,
85 TestRunner._progressDiv,
86 TestRunner._summaryDiv
87 );
88 for (var i = 0; i < arguments.length; i++) {
89 TestRunner._urls.push(arguments[i]);
90 }
91
92 TestRunner.runNextTest();
93};
94
95/**
96 * Run the next test. If no test remains, calls makeSummary
97**/
98TestRunner.runNextTest = function() {
99 if (TestRunner._currentTest < TestRunner._urls.length) {
100 var url = TestRunner._urls[TestRunner._currentTest];
101 var progress = SPAN(null,
102 "Running ", A({href:url}, url), "..."
103 );
104
105 if (TestRunner.logEnabled)
106 TestRunner.logger.log(scrapeText(progress));
107
108 TestRunner._progressDiv.appendChild(progress);
109 TestRunner._iframes[url] = TestRunner._makeIframe(url);
110 } else {
111 TestRunner.makeSummary();
112 if (TestRunner.onComplete) {
113 TestRunner.onComplete();
114 }
115 }
116};
117
118/**
119 * This stub is called by SimpleTest when a test is finished.
120**/
121TestRunner.testFinished = function (doc) {
122 appendChildNodes(TestRunner._progressDiv, SPAN(null, "Done"), BR());
123 var finishedURL = TestRunner._urls[TestRunner._currentTest];
124
125 if (TestRunner.logEnabled)
126 TestRunner.logger.debug("SimpleTest finished " + finishedURL);
127
128 TestRunner._iframeDocuments[finishedURL] = doc;
129 // TestRunner._iframes[finishedURL].style.display = "none";
130 if (finishedURL != null) {
131 TestRunner._toggle(TestRunner._iframes[finishedURL]);
132 TestRunner._currentTest++;
133 TestRunner.runNextTest();
134 }
135};
136
137/**
138 * Display the summary in the browser
139**/
140/*
141TestRunner.makeSummary = function() {
142 if (TestRunner.logEnabled)
143 TestRunner.logger.log("SimpleTest FINISHED");
144 var rows = [];
145 for (var url in TestRunner._iframeDocuments) {
146 var doc = TestRunner._iframeDocuments[url];
147 var nOK = withDocument(doc,
148 partial(getElementsByTagAndClassName, 'div', 'test_ok')
149 ).length;
150 var nNotOK = withDocument(doc,
151 partial(getElementsByTagAndClassName, 'div', 'test_not_ok')
152 ).length;
153 var toggle = partial(TestRunner._toggle, TestRunner._iframes[url]);
154 var jsurl = "TestRunner._toggle(TestRunner._iframes['" + url + "'])";
155 var row = TR(
156 {'style': {'backgroundColor': nNotOK > 0 ? "#f00":"#0f0"}},
157 TD(null, url),
158 TD(null, nOK),
159 TD(null, nNotOK)
160 );
161 row.onclick = toggle;
162 var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0];
163 tbody.insertBefore(row, TestRunner._iframes[url]._row)
164 }
165};
166*/
167
168TestRunner.makeSummary = function() {
169 var base = MochiKit.Base;
170 var dom = MochiKit.DOM;
171 var iter = MochiKit.Iter;
172 vartotal_Ok, total_not_Ok;
173
174 total_Ok = 0;
175 total_not_Ok = 0;
176
177 if (TestRunner.logEnabled)
178 TestRunner.logger.log("SimpleTest FINISHED");
179 var rows = [];
180 for (var url in TestRunner._iframeDocuments) {
181 var doc = TestRunner._iframeDocuments[url];
182 var nOK = withDocument(doc,
183 partial(getElementsByTagAndClassName, 'div', 'test_ok')
184 ).length;
185 var nNotOK = withDocument(doc,
186 partial(getElementsByTagAndClassName, 'div', 'test_not_ok')
187 ).length;
188 var toggle = partial(TestRunner._toggle, TestRunner._iframes[url]);
189 var jsurl = "TestRunner._toggle(TestRunner._iframes['" + url + "'])";
190 var row = TR(
191 {'style': {'backgroundColor': nNotOK > 0 ? "#f00":"#0f0"}},
192 TD(null, url),
193 TD(null, nOK),
194 TD(null, nNotOK)
195 );
196 row.onclick = toggle;
197 var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0];
198 tbody.insertBefore(row, TestRunner._iframes[url]._row);
199
200 total_Ok += nOK;
201 total_not_Ok += nNotOK;
202 }
203
204 {
205 var tfoot = TestRunner._summaryDiv.getElementsByTagName("tfoot")[0];
206 tfoot.appendChild(TR(null,
207 TH(null, ""),
208 TH({'style':"color:green;"}, total_Ok),
209 TH({'style':"color:" + ((total_not_Ok == 0) ? 'black' : 'red') + ";"}, total_not_Ok)
210 ));
211 }
212
213 var testRunnerResults;
214 var i, c;
215
216 testRunnerResults = dom.DIV({'style': 'display:none; visibility:hidden;'}, null);
217
218 c = total_Ok;
219 for (i=0; i<c; i++) {
220 dom.appendChildNodes(testRunnerResults, dom.DIV({'class': 'test_ok'}, "ok"));
221 }
222
223 c = total_not_Ok;
224 for (i=0; i<c; i++) {
225 dom.appendChildNodes(testRunnerResults, dom.DIV({'class': 'test_not_ok'}, "fail"));
226 }
227
228 document.getElementsByTagName("body")[0].appendChild(testRunnerResults);
229
230 if (typeof(parent) != "undefined" && parent.TestRunner) {
231 parent.TestRunner.testFinished(document);
232 }
233};
diff --git a/frontend/gamma/tests/SimpleTest/test.css b/frontend/gamma/tests/SimpleTest/test.css
new file mode 100644
index 0000000..38a4014
--- a/dev/null
+++ b/frontend/gamma/tests/SimpleTest/test.css
@@ -0,0 +1,28 @@
1.test_ok {
2 color: green;
3 display: none;
4}
5.test_not_ok {
6 color: red;
7 display: block;
8}
9
10.test_ok, .test_not_ok {
11 border-bottom-width: 2px;
12 border-bottom-style: solid;
13 border-bottom-color: black;
14}
15
16.all_pass {
17 background-color: lime;
18}
19
20.some_fail {
21 background-color: red;
22}
23
24.tests_report {
25 border-width: 2px;
26 border-style: solid;
27 width: 20em;
28}
diff --git a/frontend/gamma/tests/index.html b/frontend/gamma/tests/index.html
new file mode 100755
index 0000000..865f8f1
--- a/dev/null
+++ b/frontend/gamma/tests/index.html
@@ -0,0 +1,56 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="./SimpleTest/TestRunner.js"></script>
33</head>
34<body>
35<script type="text/javascript">
36TestRunner.runTests(
37/*
38 //'tests/Clipperz/Base.html',
39 //'tests/Clipperz/Set.html',
40 'tests/Clipperz/index.html',
41
42 //'tests/Clipperz/Crypto/Base.html',
43 //'tests/Clipperz/Crypto/BigInt.html',
44 //'tests/Clipperz/Crypto/SRP.html'
45 'tests/Clipperz/Crypto/index.html',
46 'tests/Clipperz/PM/index.html',
47 'tests/Clipperz/PM/DataModel/index.html'
48*/
49
50 'tests/index.html'
51
52
53);
54</script>
55</body>
56</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css b/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css
new file mode 100644
index 0000000..3847475
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css
@@ -0,0 +1,201 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29/* @override
30 http://localhost:8000/tests/js/tests/Bookmarklet/Bookmarklet.css
31 http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/Bookmarklet.css
32*/
33
34div#clipperzBookmarklet {
35 margin: 0;
36 padding: 0;
37 border: 0;
38 outline: 0;
39 font-size: 100%;
40 vertical-align: baseline;
41 background: transparent;
42
43 position: absolute;
44 top: 80px;
45 left: 100px;
46 width: 202px;
47 height: 202px;
48 background: url(./background.png) no-repeat;
49}
50
51div#clipperzBookmarklet div#clipperzBookmarkletClose {
52 margin: 0;
53 padding: 0;
54 border: 0;
55 outline: 0;
56 font-size: 100%;
57 vertical-align: baseline;
58 background: transparent;
59
60 position: absolute;
61 left: 168px;
62 top: 5px;
63 width: 25px;
64 height: 25px;
65 background: url(./close.png) no-repeat;
66}
67
68div#clipperzBookmarklet div#clipperzBookmarkletClose:hover {
69 background: url(./close_selected.png) no-repeat;
70 cursor: pointer;
71}
72
73div#clipperzBookmarklet div#clipperzBookmarkletResult {
74 margin: 0;
75 padding: 0;
76 border: 0;
77 outline: 0;
78 font-size: 100%;
79 vertical-align: baseline;
80 background: transparent;
81
82 position: absolute;
83 width: 145px;
84 top: 61px;
85 left: 27px;
86 height: 63px;
87 overflow: hidden;
88}
89
90div#clipperzBookmarklet div#clipperzBookmarkletResultIcon {
91 margin: 0;
92 padding: 0;
93 border: 0;
94 outline: 0;
95 font-size: 100%;
96 vertical-align: baseline;
97
98 width: 28px;
99 height: 35px;
100 position: absolute;
101}
102
103div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.ok {
104 background: transparent url(./info.png);
105}
106
107div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.fail {
108 background: transparent url(./error.png);
109}
110
111div#clipperzBookmarklet div#clipperzBookmarkletResult p {
112 margin: 0;
113 padding: 0;
114 border: 0;
115 outline: 0;
116 font-size: 100%;
117 vertical-align: baseline;
118 background: transparent;
119
120 font-family: Helvetica, Arial, Geneva, sans-serif;
121 color: #898e7d;
122 font-size: 14px;
123 margin-left: 35px;
124}
125
126div#clipperzBookmarklet div#clipperzBookmarletButton {
127 margin: 0;
128 padding: 0;
129 border: 0;
130 outline: 0;
131 font-size: 100%;
132 vertical-align: baseline;
133 background: transparent;
134
135 position: absolute;
136 top: 125px;
137 left: 26px;
138 width: 148px;
139 height: 49px;
140 background: url(./copy.png) no-repeat;
141}
142
143div#clipperzBookmarklet div#clipperzBookmarletButton span {
144 margin: 0;
145 padding: 0;
146 border: 0;
147 outline: 0;
148 font-size: 100%;
149 vertical-align: baseline;
150 background: transparent;
151
152 display: block;
153 font-family: Helvetica, Arial, Geneva, sans-serif;
154 font-weight: bold;
155 font-size: 14pt;
156 padding-left: 60px;
157 padding-top: 12px;
158 color: #838975;
159}
160
161div#clipperzBookmarklet div#clipperzBookmarletButton.hover {
162 background: url(./copy_selected.png) no-repeat;
163}
164
165
166div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint.hidden {
167 display: none;
168}
169
170
171div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint {
172 margin: 0;
173 padding: 0;
174 border: 0;
175 outline: 0;
176 font-size: 100%;
177 vertical-align: baseline;
178 background: transparent;
179
180 position: absolute;
181 top: 78px;
182 left: 135px;
183 width: 171px;
184 height: 72px;
185 background: url(./hint.png) no-repeat;
186}
187
188div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint p {
189 margin: 0;
190 padding: 0;
191 border: 0;
192 outline: 0;
193 font-size: 100%;
194 vertical-align: baseline;
195 background: transparent;
196
197 padding: 10px;
198 font-family: Helvetica, Arial, Geneva, sans-serif;
199 color: white;
200 font-size: 13px;
201} \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Bookmarklet/Fail.html b/frontend/gamma/tests/tests/Bookmarklet/Fail.html
new file mode 100644
index 0000000..9a95bad
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/Fail.html
@@ -0,0 +1,113 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Bookmarlet TEST - fail</title>
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
35
36 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" -->
37 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script>
38 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script>
39</head>
40<body>
41
42<!-- TWITTER Login Form -->
43<!-- form id="signin" action="https://twitter.com/sessions" method="post">
44 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/>
45 <fieldset class="common-form standard-form">
46 <legend>Please sign in</legend>
47 <p>
48 <label class="inside" for="username" tabindex="1">user name or email address:</label>
49 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/>
50 </p>
51 <p>
52 <label class="inside" for="password" tabindex="2">password:</label>
53 <input id="password" type="password" title="password" value="" name="session[password]"/>
54 </p>
55 <p class="remember"></p>
56 <p class="submit"></p>
57 <p class="forgot"></p>
58 <p class="complete"></p>
59 </fieldset>
60</form -->
61
62<!-- ###################################################################### -->
63<!--
64<div id="clipperzBookmarklet" style="">
65 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div>
66 <div id="clipperzBookmarletButton" style=""></div>
67 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div>
68</div>
69-->
70<!--
71<div id="clipperzBookmarklet">
72 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div>
73 <div id="clipperzBookmarletButton"></div>
74 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div>
75</div>
76-->
77
78
79<!-- ###################################################################### -->
80
81<pre id="test">
82<script type="text/javascript">
83try {
84 runBookmarklet();
85 // varparameters;
86 //runBookmarklet();
87
88 //parameters = getLoginFormConfiguration();
89
90 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful");
91 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created");
92 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready");
93 SimpleTest.ok(true, "no exception raised");
94
95} catch (err) {
96
97 var s = "test suite failure!\n";
98 var o = {};
99 var k = null;
100 for (k in err) {
101 // ensure unique keys?!
102 if (!o[k]) {
103 s += k + ": " + err[k] + "\n";
104 o[k] = err[k];
105 }
106 }
107 ok ( false, s );
108}
109
110</script>
111</pre>
112</body>
113</html>
diff --git a/frontend/gamma/tests/tests/Bookmarklet/Twitter.html b/frontend/gamma/tests/tests/Bookmarklet/Twitter.html
new file mode 100644
index 0000000..c9ee827
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/Twitter.html
@@ -0,0 +1,113 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Bookmarlet TEST - ok</title>
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
35
36 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" -->
37 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script>
38 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script>
39</head>
40<body>
41
42<!-- TWITTER Login Form -->
43<form id="signin" action="https://twitter.com/sessions" method="post">
44 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/>
45 <fieldset class="common-form standard-form">
46 <legend>Please sign in</legend>
47 <p>
48 <label class="inside" for="username" tabindex="1">user name or email address:</label>
49 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/>
50 </p>
51 <p>
52 <label class="inside" for="password" tabindex="2">password:</label>
53 <input id="password" type="password" title="password" value="" name="session[password]"/>
54 </p>
55 <p class="remember"></p>
56 <p class="submit"></p>
57 <p class="forgot"></p>
58 <p class="complete"></p>
59 </fieldset>
60</form>
61
62<!-- ###################################################################### -->
63<!--
64<div id="clipperzBookmarklet" style="">
65 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div>
66 <div id="clipperzBookmarletButton" style=""></div>
67 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div>
68</div>
69-->
70<!--
71<div id="clipperzBookmarklet">
72 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div>
73 <div id="clipperzBookmarletButton"></div>
74 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div>
75</div>
76-->
77
78
79<!-- ###################################################################### -->
80
81<pre id="test">
82<script type="text/javascript">
83try {
84 runBookmarklet();
85 // varparameters;
86 //runBookmarklet();
87
88 //parameters = getLoginFormConfiguration();
89
90 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful");
91 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created");
92 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready");
93 SimpleTest.ok(true, "no exception raised");
94
95} catch (err) {
96
97 var s = "test suite failure!\n";
98 var o = {};
99 var k = null;
100 for (k in err) {
101 // ensure unique keys?!
102 if (!o[k]) {
103 s += k + ": " + err[k] + "\n";
104 o[k] = err[k];
105 }
106 }
107 ok ( false, s );
108}
109
110</script>
111</pre>
112</body>
113</html>
diff --git a/frontend/gamma/tests/tests/Bookmarklet/ZeroClipboard.swf b/frontend/gamma/tests/tests/Bookmarklet/ZeroClipboard.swf
new file mode 100755
index 0000000..13bf8e3
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/ZeroClipboard.swf
Binary files differ
diff --git a/frontend/gamma/tests/tests/Bookmarklet/background.png b/frontend/gamma/tests/tests/Bookmarklet/background.png
new file mode 100644
index 0000000..db5cdc3
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/background.png
Binary files differ
diff --git a/frontend/gamma/tests/tests/Bookmarklet/close.png b/frontend/gamma/tests/tests/Bookmarklet/close.png
new file mode 100644
index 0000000..c07f0cb
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/close.png
Binary files differ
diff --git a/frontend/gamma/tests/tests/Bookmarklet/close_selected.png b/frontend/gamma/tests/tests/Bookmarklet/close_selected.png
new file mode 100644
index 0000000..0265f0d
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/close_selected.png
Binary files differ
diff --git a/frontend/gamma/tests/tests/Bookmarklet/copy.png b/frontend/gamma/tests/tests/Bookmarklet/copy.png
new file mode 100644
index 0000000..299c613
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/copy.png
Binary files differ
diff --git a/frontend/gamma/tests/tests/Bookmarklet/copy_selected.png b/frontend/gamma/tests/tests/Bookmarklet/copy_selected.png
new file mode 100644
index 0000000..f7015b7
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/copy_selected.png
Binary files differ
diff --git a/frontend/gamma/tests/tests/Bookmarklet/error.png b/frontend/gamma/tests/tests/Bookmarklet/error.png
new file mode 100644
index 0000000..ad56403
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/error.png
Binary files differ
diff --git a/frontend/gamma/tests/tests/Bookmarklet/hint.png b/frontend/gamma/tests/tests/Bookmarklet/hint.png
new file mode 100644
index 0000000..9f83114
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/hint.png
Binary files differ
diff --git a/frontend/gamma/tests/tests/Bookmarklet/index.html b/frontend/gamma/tests/tests/Bookmarklet/index.html
new file mode 100644
index 0000000..729bf21
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/index.html
@@ -0,0 +1,42 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Complete TEST suite</title>
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
34</head>
35<body>
36<script>
37TestRunner.runTests(
38 'Twitter.html'
39);
40</script>
41</body>
42</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Bookmarklet/info.png b/frontend/gamma/tests/tests/Bookmarklet/info.png
new file mode 100644
index 0000000..256eb40
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Bookmarklet/info.png
Binary files differ
diff --git a/frontend/gamma/tests/tests/Clipperz/Async.html b/frontend/gamma/tests/tests/Clipperz/Async.html
new file mode 100644
index 0000000..02f4de2
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Async.html
@@ -0,0 +1,53 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Async - test</title>
32
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
45</head>
46<body>
47
48<pre id="test">
49<!--<script type="text/javascript" src="User.data.js"></script>//-->
50<script type="text/javascript" src="Async.test.js"></script>
51</pre>
52</body>
53</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Async.test.js b/frontend/gamma/tests/tests/Clipperz/Async.test.js
new file mode 100644
index 0000000..fa6daca
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Async.test.js
@@ -0,0 +1,687 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29testObject = function (aLabel) {
30 this._label = aLabel;
31 this._sibling = null;
32}
33
34testObject.prototype = {
35 'label': function () {
36 return MochiKit.Async.succeed(this._label);
37 },
38
39 'shouldHit': function () {
40 var filterRegExp;
41
42 filterRegExp = new RegExp("hit", "i");
43
44 return Clipperz.Async.callbacks("testObject.shouldHit", [
45 MochiKit.Base.method(this, 'label'),
46 MochiKit.Base.method(filterRegExp, 'test')
47 ]);
48 },
49
50 'sibling': function () {
51 return this._sibling;
52 },
53
54 'setSibling': function (aSibling) {
55 this._sibling = aSibling;
56 }
57
58}
59
60var tests = {
61
62 //-------------------------------------------------------------------------
63
64 'succeedingForkedDeferrer_test': function (someTestArgs) {
65 var deferredResult;
66
67 deferredResult = new Clipperz.Async.Deferred('Async.test succeedingForkedDeferred', someTestArgs);
68 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedDeferred",
69 [
70 MochiKit.Base.partial(MochiKit.Async.succeed, 3),
71 MochiKit.Base.partial(MochiKit.Async.succeed, 2)
72 ], someTestArgs
73 ));
74 deferredResult.addCallback(function (anAsyncResult) {
75 var sum;
76
77 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult);
78 SimpleTest.is(sum, 5, "the sum of all the returned results should be 5");
79 });
80 deferredResult.addErrback(function() {
81 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (1)")
82 })
83 deferredResult.callback();
84
85 return deferredResult;
86 },
87
88 //-------------------------------------------------------------------------
89
90 'succeedingForkedAndWaitDeferrer_test': function (someTestArgs) {
91 var deferredResult;
92
93 deferredResult = new Clipperz.Async.Deferred('succeedingForkedAndWaitDeferrer_test', someTestArgs);
94 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer",
95 [
96 MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3),
97 MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2),
98 MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7)
99 ], someTestArgs
100 ));
101 deferredResult.addCallback(function (anAsyncResult) {
102 var sum;
103
104 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult);
105 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12");
106 });
107 deferredResult.addErrback(function() {
108 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (2)")
109 })
110 deferredResult.callback();
111
112 return deferredResult;
113 },
114
115 //-------------------------------------------------------------------------
116
117 'failingForkedDeferrer_test': function (someTestArgs) {
118 var deferredResult;
119
120 deferredResult = new Clipperz.Async.Deferred('Async.test failingForkedDeferred', someTestArgs);
121 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test failingForkedDeferred",
122 [
123 MochiKit.Async.succeed,
124 MochiKit.Async.fail
125 ], someTestArgs
126 ));
127 deferredResult.addCallback(function () {
128 SimpleTest.ok(false, "forkAndJoin should fail, and execution path should NOT go through here");
129 });
130 deferredResult.addErrback(function() {
131 SimpleTest.ok(true, "forkAndJoin should fail and execution path should go through here")
132 })
133 deferredResult.callback();
134
135 return deferredResult;
136 },
137
138 //-------------------------------------------------------------------------
139
140 'succeedingCollectResultsDeferrer_test': function (someTestArgs) {
141 var deferredResult;
142
143 deferredResult = new Clipperz.Async.Deferred('Async.test succeedingCollectResultsDeferrer', someTestArgs);
144 deferredResult.addCallback(Clipperz.Async.collectResults('Async.test succeedingCollectResultsDeferrer', {
145 'first':MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3),
146 'second':MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2),
147 'third':MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7)
148 }, someTestArgs));
149 deferredResult.addCallback(function (anAsyncResult) {
150 var sum;
151
152 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult));
153 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12");
154 SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3");
155 SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2");
156 SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7");
157 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values");
158 });
159 deferredResult.addErrback(function() {
160 SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here");
161 });
162 deferredResult.callback();
163
164 return deferredResult;
165 },
166
167 //-------------------------------------------------------------------------
168
169 'collectResultsWithParameter_test': function (someTestArgs) {
170 var deferredResult;
171
172 deferredResult = new Clipperz.Async.Deferred('collectResultsWithParameter_test', someTestArgs);
173 deferredResult.collectResults({
174 'add_3':MochiKit.Base.partial(MochiKit.Base.operator.add, 3),
175 'sub_8':MochiKit.Base.partial(MochiKit.Base.operator.sub, 8),
176 'mul_4':MochiKit.Base.partial(MochiKit.Base.operator.mul, 4)
177 });
178 deferredResult.addCallback(function (anAsyncResult) {
179 SimpleTest.is(anAsyncResult['add_3'], 8, "adding 3 to the passed value (5) returns 8");
180 SimpleTest.is(anAsyncResult['sub_8'], 3, "subtracting the passed value (5) to 8 returns 3");
181 SimpleTest.is(anAsyncResult['mul_4'], 20, "multiplying the passed value (5) by 4 returns 20");
182 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values");
183 });
184 deferredResult.callback(5);
185
186 return deferredResult;
187 },
188
189 //-------------------------------------------------------------------------
190
191 'succeedingCollectResultsDeferrer_alternative_syntax_test': function (someTestArgs) {
192 var deferredResult;
193
194 deferredResult = new Clipperz.Async.Deferred('succeedingCollectResultsDeferrer_alternative_syntax_test', someTestArgs);
195 deferredResult.collectResults({
196 'first':MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3),
197 'second':MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2),
198 'third':MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7)
199 });
200 deferredResult.addCallback(function (anAsyncResult) {
201 var sum;
202
203 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult));
204 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12");
205 SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3");
206 SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2");
207 SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7");
208 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values");
209 });
210 deferredResult.addErrback(function() {
211 SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here");
212 });
213 deferredResult.callback();
214
215 return deferredResult;
216 },
217
218 //-------------------------------------------------------------------------
219
220 'failingCollectResultsDeferrer_test': function (someTestArgs) {
221 var deferredResult;
222
223 deferredResult = new Clipperz.Async.Deferred('Async.test failingCollectResultsDeferrer', someTestArgs);
224 deferredResult.addCallback(Clipperz.Async.collectResults('Async.test failingCollectResultsDeferrer', {
225 'succeed':MochiKit.Base.partial(MochiKit.Async.succeed, 3),
226 'fail': MochiKit.Base.partial(MochiKit.Async.fail, 2)
227 }, someTestArgs));
228 deferredResult.addCallback(function() {
229 SimpleTest.ok(false, "collectResults should fail and execution path should NOT go through here");
230 });
231 deferredResult.addErrback(function (anAsyncResult) {
232 var result;
233
234 result = anAsyncResult['message'];
235 SimpleTest.is(MochiKit.Base.keys(result).length, 2, "the result has exactly 2 values");
236//console.log("anAsyncResult", anAsyncResult);
237 SimpleTest.ok(!(result['succeed'] instanceof Error), "the successful value is actually successful");
238 SimpleTest.ok(result['fail'] instanceof Error, "the failed value is actually failed");
239 });
240 deferredResult.callback();
241
242 return deferredResult;
243 },
244
245 //-------------------------------------------------------------------------
246
247 'collectResults_withSimpleArrayListOfCalls_test': function (someTestArgs) {
248 var deferredResult;
249
250 deferredResult = new Clipperz.Async.Deferred('collectResults_withSimpleArrayListOfCalls_test', someTestArgs);
251 deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withSimpleArrayListOfCalls_test - collectResults', {
252 'path1': [
253 MochiKit.Base.partial(MochiKit.Async.succeed, 3)
254 ],
255 'path2': MochiKit.Base.partial(MochiKit.Async.succeed, 2)
256 }, someTestArgs));
257 deferredResult.addCallback(function (anAsyncResult) {
258 SimpleTest.is(anAsyncResult['path1'], 3, "the result of the first path is 3");
259 SimpleTest.is(anAsyncResult['path2'], 2, "the result of the second path is 2");
260 });
261 deferredResult.callback();
262
263 return deferredResult;
264 },
265
266 //-------------------------------------------------------------------------
267
268 'collectResults_withArrayListOfCalls_test': function (someTestArgs) {
269 var deferredResult;
270
271 deferredResult = new Clipperz.Async.Deferred('collectResults_withArrayListOfCalls_test', someTestArgs);
272 deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withArrayListOfCalls_test - collectResults', {
273 'path1': [
274 MochiKit.Base.partial(MochiKit.Async.succeed, {key1:'value1', key2:'value2'}),
275 Clipperz.Base.serializeJSON
276 ],
277 'path2': [
278 MochiKit.Base.partial(MochiKit.Async.succeed, {key3:'value3', key4:'value4'}),
279 Clipperz.Base.serializeJSON
280 ]
281 }, someTestArgs));
282 deferredResult.addCallback(function (anAsyncResult) {
283 SimpleTest.is(anAsyncResult['path1'], "{\"key1\":\"value1\",\"key2\":\"value2\"}", "the result of the first path is correct");
284 SimpleTest.is(anAsyncResult['path2'], "{\"key3\":\"value3\",\"key4\":\"value4\"}", "the result of the second path is correct");
285 });
286 deferredResult.callback();
287
288 return deferredResult;
289 },
290
291 //-------------------------------------------------------------------------
292
293 'deferredSort_test': function (someTestArgs) {
294 var deferredResult;
295 vartestArray;
296
297 testArray = [
298 {key:'key2', label:function () { return MochiKit.Async.succeed('label2')} },
299 {key:'key3', label:function () { return MochiKit.Async.succeed('label3')} },
300 {key:'key7', label:function () { return MochiKit.Async.succeed('label7')} },
301 {key:'key1', label:function () { return MochiKit.Async.succeed('label1')} },
302 {key:'key5', label:function () { return MochiKit.Async.succeed('label5')} },
303 {key:'key4', label:function () { return MochiKit.Async.succeed('label4')} },
304 {key:'key9', label:function () { return MochiKit.Async.succeed('label9')} },
305 {key:'key8', label:function () { return MochiKit.Async.succeed('label8')} },
306 {key:'key6', label:function () { return MochiKit.Async.succeed('label6')} }
307 ]
308
309 deferredResult = new Clipperz.Async.Deferred('deferredSort_test', someTestArgs);
310 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aObject, bObject) {
311 var result;
312
313 result = Clipperz.Async.deferredCompare(MochiKit.Base.compare, aObject.label(), bObject.label());
314
315 return result;
316 });
317 deferredResult.addCallback(function (aSortedArray) {
318 SimpleTest.is(aSortedArray.length, testArray.length, "The sorted array should have the same number of objects as the original one");
319 SimpleTest.is(aSortedArray[0]['key'], 'key1', "[0] -> key1");
320 SimpleTest.is(aSortedArray[1]['key'], 'key2', "[1] -> key2");
321 SimpleTest.is(aSortedArray[2]['key'], 'key3', "[2] -> key3");
322 SimpleTest.is(aSortedArray[3]['key'], 'key4', "[3] -> key4");
323 SimpleTest.is(aSortedArray[4]['key'], 'key5', "[4] -> key5");
324 SimpleTest.is(aSortedArray[5]['key'], 'key6', "[5] -> key6");
325 SimpleTest.is(aSortedArray[6]['key'], 'key7', "[6] -> key7");
326 SimpleTest.is(aSortedArray[7]['key'], 'key8', "[7] -> key8");
327 SimpleTest.is(aSortedArray[8]['key'], 'key9', "[8] -> key9");
328 });
329 deferredResult.callback(testArray);
330
331 return deferredResult;
332 },
333
334 //-------------------------------------------------------------------------
335
336 'callbacks_test': function (someTestArgs) {
337 return Clipperz.Async.callbacks("callbacks_test", [
338 MochiKit.Base.partial(MochiKit.Base.operator.add, 5),
339 Clipperz.Async.Test.is(15, "Clipperz.Async.callbacks seems to work")
340 ], someTestArgs, 10);
341 },
342
343 //-------------------------------------------------------------------------
344
345 'deferredAcquireLockTest': function (someTestArgs) {
346 var deferredLock;
347 var deferredResult;
348 var anotherDeferred;
349 var deferredResults;
350
351 deferredLock = new MochiKit.Async.DeferredLock();
352 deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false});
353 deferredResult.acquireLock(deferredLock);
354 deferredResult.addCallback(function () {
355 SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock');
356 });
357
358 anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false});
359 anotherDeferred.acquireLock(deferredLock);
360 anotherDeferred.addCallback(function () {
361 SimpleTest.ok(false, 'Did not wait on a locked DeferredLock')
362 });
363 anotherDeferred.addErrback(function (anError) {
364 SimpleTest.ok(true, 'Did wait on a locked DeferredLock');
365 });
366
367 deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false);
368 MochiKit.Async.callLater(1, function () {
369 anotherDeferred.cancel();
370 });
371
372 deferredResult.callback();
373 anotherDeferred.callback();
374 return deferredResults;
375 },
376
377 //-------------------------------------------------------------------------
378
379 'deferredLockAcquireTest': function (someTestArgs) {
380 var deferredLock;
381 var defferedResult;
382 var anotherDeferred;
383 var deferredResults;
384
385 deferredLock = new MochiKit.Async.DeferredLock();
386 deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false});
387 deferredResult.addMethod(deferredLock, 'acquire');
388 deferredResult.addCallback(function () {
389 SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock');
390 });
391
392 anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false});
393 anotherDeferred.addMethod(deferredLock, 'acquire');
394 anotherDeferred.addCallback(function () {
395 SimpleTest.ok(false, 'Did not wait on a locked DeferredLock')
396 });
397 anotherDeferred.addErrback(function (anError) {
398 SimpleTest.ok(true, 'Did wait on a locked DeferredLock');
399 });
400
401
402 deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false);
403 MochiKit.Async.callLater(1, function () {
404 anotherDeferred.cancel();
405 });
406
407 deferredResult.callback();
408 anotherDeferred.callback()
409
410 return deferredResults;
411 },
412
413 //-------------------------------------------------------------------------
414
415 'deferredFilter_test': function (someTestArgs) {
416 var deferredResult;
417 vartestObjects;
418 var filterRegExp;
419 var deferredFilterFunction;
420
421 testObjects = [
422 {key: '1', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 1') },
423 {key: '2', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 2') },
424 {key: '3', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 3') },
425 {key: '4', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 4') },
426 {key: '5', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 5') },
427 {key: '6', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 6') },
428 {key: '7', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 7') },
429 {key: '8', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 8') },
430 {key: '9', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 9') },
431 {key:'10', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 10') }
432 ]
433
434 filterRegExp = new RegExp("hit", "i");
435
436 deferredFilterFunction = function (aRegExp, anObject) {
437 return Clipperz.Async.callbacks("deferredFilterFunction", [
438 MochiKit.Base.method(anObject, 'label'),
439 MochiKit.Base.method(aRegExp, 'test'),
440 function (doesItMatch) {
441 var result;
442
443 if (doesItMatch) {
444 result = MochiKit.Async.succeed('match');
445 } else {
446 result = MochiKit.Async.fail('miss');
447 }
448
449 return result;
450 }
451 ], someTestArgs);
452 };
453
454 deferredResult = new Clipperz.Async.Deferred("deferredFilter_test", someTestArgs);
455 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.partial(deferredFilterFunction, filterRegExp), testObjects);
456 deferredResult.addCallback(function (aResult) {
457 SimpleTest.is(aResult.length, 4, "There are 4 items matching the 'hit' regexp");
458 SimpleTest.is(aResult[0]['key'], '2', "The first item to match is the one with key:2");
459 SimpleTest.is(aResult[1]['key'], '4', "The first item to match is the one with key:4");
460 SimpleTest.is(aResult[2]['key'], '7', "The first item to match is the one with key:7");
461 SimpleTest.is(aResult[3]['key'], '10', "The first item to match is the one with key:10");
462 })
463 deferredResult.callback();
464
465 return deferredResult;
466 },
467
468 //-------------------------------------------------------------------------
469
470 'deferredFilter_methodcaller_test': function (someTestArgs) {
471 var deferredResult;
472 vartestObjects;
473 var filterRegExp;
474 var deferredFilterFunction;
475
476 testObjects = [
477 new testObject('skip 1'),
478 new testObject('hit 2'),
479 new testObject('skip 3'),
480 new testObject('hit 4'),
481 new testObject('skip 5'),
482 new testObject('skip 6'),
483 new testObject('hit 7'),
484 new testObject('skip 8'),
485 new testObject('skip 9'),
486 new testObject('hit 10')
487 ];
488
489 deferredResult = new Clipperz.Async.Deferred("deferredFilter_methodcaller_test", someTestArgs);
490 // deferredResult.addCallback(function () { return testObjects[0]; });
491 deferredResult.addCallback(MochiKit.Async.succeed, testObjects[0]);
492 deferredResult.addCallback(MochiKit.Base.methodcaller('shouldHit'));
493 deferredResult.addTest(false, "the first element shoud return 'false' to the 'shouldHit' method");
494
495 deferredResult.addCallback(MochiKit.Async.succeed, testObjects[1]);
496 deferredResult.addCallback(MochiKit.Base.methodcaller('shouldHit'));
497 deferredResult.addTest(true, "the second element shoud return 'true' to the 'shouldHit' method");
498
499 deferredResult.addCallback(MochiKit.Async.succeed, testObjects);
500 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('shouldHit'));
501 deferredResult.addCallback(function (aResult) {
502 SimpleTest.is(aResult.length, 4, "There are 4 items matching the 'hit' regexp");
503 SimpleTest.is(aResult[0]._label, 'hit 2', "The first item to match is the one with key:2");
504 SimpleTest.is(aResult[1]._label, 'hit 4', "The first item to match is the one with key:4");
505 SimpleTest.is(aResult[2]._label, 'hit 7', "The first item to match is the one with key:7");
506 SimpleTest.is(aResult[3]._label, 'hit 10', "The first item to match is the one with key:10");
507 })
508 deferredResult.callback();
509
510 return deferredResult;
511 },
512
513 //-------------------------------------------------------------------------
514
515 'setItem_test': function (someTestArgs) {
516 var deferredResult;
517 var result;
518
519 result = {};
520 deferredResult = new Clipperz.Async.Deferred("setItem_test", someTestArgs);
521 deferredResult.addCallback(MochiKit.Async.succeed, "Value 1");
522 deferredResult.addCallback(Clipperz.Async.setItem, result, 'key1');
523 deferredResult.addCallback(MochiKit.Async.succeed, "Value 2");
524 deferredResult.addCallback(Clipperz.Async.setItem, result, 'key2');
525
526 deferredResult.addCallback(MochiKit.Base.itemgetter('key1'));
527 deferredResult.addTest("Value 1", "the value for the 'key1' does match");
528
529 deferredResult.addCallback(MochiKit.Async.succeed, result);
530 deferredResult.addCallback(MochiKit.Base.itemgetter('key2'));
531 deferredResult.addTest("Value 2", "the value for the 'key2' does match");
532 deferredResult.callback();
533
534 return deferredResult;
535 },
536
537 //-------------------------------------------------------------------------
538
539 'setItemOnObject_test': function (someTestArgs) {
540 var deferredResult;
541 var result;
542
543 result = {};
544
545 deferredResult = new Clipperz.Async.Deferred("setItemOnObject_test", someTestArgs);
546 deferredResult.addCallback(MochiKit.Async.succeed, result);
547 deferredResult.addCallback(Clipperz.Async.setItemOnObject, 'key1', "Value 1");
548 deferredResult.addCallback(Clipperz.Async.setItemOnObject, 'key2', "Value 2");
549
550 deferredResult.addCallback(MochiKit.Base.itemgetter('key1'));
551 deferredResult.addTest("Value 1", "the value for the 'key1' does match");
552
553 deferredResult.addCallback(MochiKit.Async.succeed, result);
554 deferredResult.addCallback(MochiKit.Base.itemgetter('key2'));
555 deferredResult.addTest("Value 2", "the value for the 'key2' does match");
556 deferredResult.callback();
557
558 return deferredResult;
559 },
560
561 //-------------------------------------------------------------------------
562
563 'setDeferredItemOnObject_test': function (someTestArgs) {
564 var deferredResult;
565 var result;
566
567 result = {};
568
569 deferredResult = new Clipperz.Async.Deferred("setDeferredItemOnObject_test", someTestArgs);
570 deferredResult.addCallback(MochiKit.Async.succeed, result);
571 deferredResult.addCallback(Clipperz.Async.setDeferredItemOnObject, 'key1', MochiKit.Base.partial(MochiKit.Async.succeed, "Value 1"));
572 deferredResult.addCallback(Clipperz.Async.setDeferredItemOnObject, 'key2', MochiKit.Base.partial(MochiKit.Async.succeed, "Value 2"));
573
574 deferredResult.addCallback(MochiKit.Base.itemgetter('key1'));
575 deferredResult.addTest("Value 1", "the value for the 'key1' does match");
576
577 deferredResult.addCallback(MochiKit.Async.succeed, result);
578 deferredResult.addCallback(MochiKit.Base.itemgetter('key2'));
579 deferredResult.addTest("Value 2", "the value for the 'key2' does match");
580 deferredResult.callback();
581
582 return deferredResult;
583 },
584
585 //-------------------------------------------------------------------------
586
587 'addIf_test': function (someTestArgs) {
588 var deferredResult;
589
590 deferredResult = new Clipperz.Async.Deferred("addIf_test", someTestArgs);
591
592 deferredResult.addCallback(MochiKit.Async.succeed, true);
593 deferredResult.addIf([
594 MochiKit.Base.partial(SimpleTest.ok, true, "when a true value is passed, the 'then' branch is executed")
595 ], [
596 MochiKit.Base.partial(SimpleTest.ok, false, "when a true value is passed, the 'else' branch should NOT be executed")
597 ]);
598
599 deferredResult.addCallback(MochiKit.Async.succeed, false);
600 deferredResult.addIf([
601 MochiKit.Base.partial(SimpleTest.ok, false, "when a false value is passed, the 'then' branch should NOT be executed")
602 ], [
603 MochiKit.Base.partial(SimpleTest.ok, true, "when a false value is passed, the 'else' branch is executed")
604 ]);
605
606 deferredResult.callback();
607
608 return deferredResult;
609 },
610
611 //-------------------------------------------------------------------------
612
613 'addMethod_test': function (someTestArgs) {
614 var deferredResult;
615 var testObjectInstance;
616 var testObjectInstance_2;
617 var label;
618 vartestObjectInstanceGetter;
619
620 label = "Test - Label";
621 testObjectInstance = new testObject(label);
622 testObjectInstance_2 = new testObject(label + label);
623 testObjectInstance.setSibling(testObjectInstance_2);
624
625 testObjectInstanceGetter = function () {
626 return testObjectInstance;
627 }
628
629 deferredResult = new Clipperz.Async.Deferred("addMethod_test", someTestArgs);
630 deferredResult.addMethod(testObjectInstance, 'label');
631 deferredResult.addTest(label, "the addMethod seems to work");
632
633 deferredResult.addMethod(testObjectInstanceGetter(), 'label');
634 deferredResult.addTest(label, "the addMethod seems to work");
635
636 deferredResult.addMethod(testObjectInstance.sibling(), 'label');
637 deferredResult.addTest(label+label, "the addMethod seems to work");
638 deferredResult.callback();
639
640 return deferredResult;
641 },
642
643 //-------------------------------------------------------------------------
644
645 'callbacksWithErrors_test': function (someTestArgs) {
646 var deferredResult;
647
648 deferredResult = new Clipperz.Async.Deferred("callbacksWithErrors_test", someTestArgs);
649 deferredResult.addCallback(MochiKit.Base.partial(Clipperz.Async.callbacks, "callbacksWithErrors_test - callbacks", [
650 function () { return 10; },
651 function (aValue) { pippo = pluto + aValue; },
652 function (aValue) { SimpleTest.ok(false, "this code should never be executed"); return aValue; }
653 ], {trace:someTestArgs}));
654 deferredResult.addCallback(SimpleTest.ok, false, "the inner code should raise an exception and exit through the error chain");
655 deferredResult.addErrback(SimpleTest.ok, true, "the inner code should raise an exception and exit through the error chain");
656
657 deferredResult.callback();
658
659 return deferredResult;
660 },
661
662 //-------------------------------------------------------------------------
663
664 'deferredVars_test': function (someTestArgs) {
665 var deferredResult;
666
667 deferredResult = new Clipperz.Async.Deferred("deferredVars_test", someTestArgs);
668 deferredResult.addCallback(MochiKit.Async.succeed, "test string");
669 deferredResult.setValue('testKey');
670 deferredResult.addCallback(MochiKit.Async.succeed, "another string");
671 deferredResult.getValue('testKey');
672 deferredResult.addTest("test string", "The right string has been fetched");
673
674 deferredResult.callback();
675
676 return deferredResult;
677 },
678
679 //-------------------------------------------------------------------------
680 'syntaxFix': MochiKit.Base.noop
681};
682
683
684
685//#############################################################################
686
687SimpleTest.runDeferredTests("Clipperz.Async", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/Base.html b/frontend/gamma/tests/tests/Clipperz/Base.html
new file mode 100644
index 0000000..6b29417
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Base.html
@@ -0,0 +1,55 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Base - TEST</title>
32
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script>
45
46
47 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
48
49</head>
50<body>
51<pre id="test">
52<script type="text/javascript" src="Base.test.js"></script>
53</pre>
54</body>
55</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Base.test.js b/frontend/gamma/tests/tests/Clipperz/Base.test.js
new file mode 100644
index 0000000..e5c7caf
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Base.test.js
@@ -0,0 +1,367 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29
30//=============================================================================
31
32testEvalJSON = function(aString, shouldFail, aDescription) {
33 var result;
34
35 if (shouldFail == true) {
36 try {
37 result = Clipperz.Base.evalJSON(aString);
38 is(true, false, aDescription + ": vulnerability not caught");
39//console.log(result);
40 } catch(exception) {
41 is(true, true, aDescription + ": vulnerability correctly caught");
42 }
43 } else {
44 try {
45 result = Clipperz.Base.evalJSON(aString);
46 is(true, true, aDescription + ": configuration correctly checked");
47 } catch(exception) {
48 is(true, false, aDescription + ": configuration wrongly caught as malicious");
49 // console.log(exception);
50 }
51 }
52
53 return result;
54}
55
56//=============================================================================
57
58var tests = {
59
60 '001_test': function () {
61 var stringToSplit;
62 varsplittedString;
63
64 stringToSplit = "stringToSplit";
65 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 2);
66 is(splittedString.length, 7);
67 is(splittedString[0], 'st');
68 is(splittedString[1], 'ri');
69 is(splittedString[2], 'ng');
70 is(splittedString[3], 'To');
71 is(splittedString[4], 'Sp');
72 is(splittedString[5], 'li');
73 is(splittedString[6], 't', "test that should pass");
74
75 stringToSplit = "stringToSplit";
76 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20);
77 is(splittedString.length, 1);
78 is(splittedString[0], 'stringToSplit');
79
80 stringToSplit = null;
81 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20);
82 is(splittedString.length, 0);
83 },
84
85 //-------------------------------------------------------------------------
86
87 '002_test': function () {
88 var anObject;
89
90 anObject = "String";
91 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (1)");
92 anObject = new String("String");
93 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (2)");
94
95 anObject = 120;
96 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (1)");
97 anObject = new Number(120);
98 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (2)");
99
100 anObject = true;
101 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (1)");
102 anObject = new Boolean(true);
103 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (2)");
104
105 anObject = new Date;
106 is(Clipperz.Base.objectType(anObject), 'date', "test on dates");
107
108 anObject = new Error("test");
109 is(Clipperz.Base.objectType(anObject), 'error', "test on errors");
110
111 anObject = function() {};
112 is(Clipperz.Base.objectType(anObject), 'function', "test on functions");
113
114 anObject = new Object();
115 is(Clipperz.Base.objectType(anObject), 'object', "test on objects");
116
117
118 anObject = [1, 2, 3];
119 is(Clipperz.Base.objectType(anObject), 'array', "test on arrays");
120 },
121
122 //-------------------------------------------------------------------------
123
124 '003_test': function () {
125 var original, clone;
126
127 original = {
128 a: "a",
129 b: "b"
130 };
131
132 clone = Clipperz.Base.deepClone(original);
133 is(MochiKit.Base.compare(original, clone), 0, "simple cloning return two equal objects");
134
135 clone.c = "c";
136 is(MochiKit.Base.compare(original, clone), -1, "changing an object leave the original object unchanged");
137
138 original = {
139 a: "a",
140 b: "b",
141 nested: {
142 a1: "a1",
143 b1: "b1"
144 }
145 };
146
147 clone = Clipperz.Base.deepClone(original);
148 is(MochiKit.Base.compare(original, clone), 0, "cloning of an object with nested values return two equal objects");
149
150 clone.nested.c1 = "c1";
151 is(MochiKit.Base.compare(original, clone), -1, "changing a nested value leave the original object unchanged");
152 },
153
154 //-------------------------------------------------------------------------
155
156 '004_test': function () {
157 var jsonString;
158
159 jsonString = '{"page": {"title": "Example Attack"},"form": { "attributes": { "action": "javascript:opener.document.body.innerHTML = \'hacked!\';close();", "style": "-moz-binding:url(\'http://ha.ckers.org/xssmoz.xml#xss\')", "method": null }, "inputs": [{"type": "text", "name": "username", "value": ""}, {"type": "password", "name": "password", "value": ""}]},"version": "0.2.3" }';
160 testEvalJSON(jsonString, false, "");
161
162 //jsonString = '{"0":{"label":"<script>alert(\"Ciao Marco\")< /script>","key":"ebc9782019bf9aa757e9c4d716ab303e2050b60c4b9a06b18ab09a417e0ddf00"}, "1":{"label":"<iframe><script>alert(\\"Ciao ragazzi\\")< /script></iframe>", "key":"413cfb122a1601c50e0f9462978ba77a36fdcecb49dda7550ee129dc114ba328"}}';
163 jsonString = new Clipperz.ByteArray().appendBase64String("eyIwIjp7ImxhYmVsIjoiPHNjcmlwdD5hbGVydChcIkNpYW8gTWFyY29cIik8L3NjcmlwdD4iLCAia2V5IjoiZWJjOTc4MjAxOWJmOWFhNzU3ZTljNGQ3MTZhYjMwM2UyMDUwYjYwYzRiOWEwNmIxOGFiMDlhNDE3ZTBkZGYwMCJ9LCAiMSI6eyJsYWJlbCI6IjxpZnJhbWU+PHNjcmlwdD5hbGVydChcIkNpYW8gcmFnYXp6aVwiKTwvc2NyaXB0PjwvaWZyYW1lPiIsICJrZXkiOiI0MTNjZmIxMjJhMTYwMWM1MGUwZjk0NjI5NzhiYTc3YTM2ZmRjZWNiNDlkZGE3NTUwZWUxMjlkYzExNGJhMzI4In19").asString();
164 testEvalJSON(jsonString, false);
165
166 jsonString = 'alert("foobar");';
167 testEvalJSON(jsonString, true);
168
169 //jsonString = '<script>alert("foobar");< /script>';
170 jsonString = new Clipperz.ByteArray().appendBase64String("PHNjcmlwdD5hbGVydCgiZm9vYmFyIik7PC9zY3JpcHQ+").asString();
171 testEvalJSON(jsonString, true);
172
173 jsonString = '{"xss": alert("XSS!")}';
174 testEvalJSON(jsonString, true);
175
176 jsonString = '{"inner": {"xss": alert("XSS!")}}';
177 testEvalJSON(jsonString, true);
178 },
179
180 //-------------------------------------------------------------------------
181
182 'Clipperz.Base.itemgetter_test': function () {
183 varanObject;
184
185 anObject = {
186 key1: 'value1',
187 key2: {
188 key2_1: 'value2_1',
189 key2_2: 'value2_2'
190 },
191 key3: {
192 key3_1: {
193 key3_1_1: 'value3_1_1',
194 key3_1_2: 'value3_1_2'
195 },
196 key3_2: {
197 key3_2_1: 'value3_2_1',
198 key3_2_2: 'value3_2_2'
199 }
200 }
201 };
202
203 SimpleTest.is(Clipperz.Base.itemgetter('key1')(anObject), "value1", "Clipperz.Base.itemgetter works as MochiKit.Base.itemgetter");
204 SimpleTest.is(Clipperz.Base.itemgetter('key2.key2_1')(anObject), "value2_1", "Clipperz.Base.itemgetter works also with keypaths");
205 SimpleTest.is(Clipperz.Base.itemgetter('key3.key3_2.key3_2_2')(anObject), "value3_2_2", "Clipperz.Base.itemgetter works also with 'long' keypaths");
206 },
207
208 //-------------------------------------------------------------------------
209
210 'Clipperz.Base.caseInsensitiveCompare_test': function () {
211 varcomparator;
212 var objects;
213
214 comparator = Clipperz.Base.caseInsensitiveCompare;
215 objects = [ 'ccc', 'aaa', 'bbb', 'eee', 'ddd'];
216 SimpleTest.isDeeply(['aaa', 'bbb', 'ccc', 'ddd', 'eee'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values");
217
218 comparator = MochiKit.Base.compare;
219 objects = [ 'ccc', 'AAA', 'bbb', 'EEE', 'ddd'];
220 SimpleTest.isDeeply(['AAA', 'EEE', 'bbb', 'ccc', 'ddd'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values");
221
222 comparator = Clipperz.Base.caseInsensitiveCompare;
223 objects = [ 'ccc', 'AAA', 'bbb', 'EEE', 'ddd'];
224 SimpleTest.isDeeply(['AAA', 'bbb', 'ccc', 'ddd', 'EEE'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values");
225 },
226
227 //-------------------------------------------------------------------------
228
229 'Clipperz.Base.reverseComparator_test': function () {
230 varcomparator;
231 var objects;
232
233 comparator = MochiKit.Base.compare;
234 objects = [5, 3, 2, 4, 1];
235 SimpleTest.isDeeply([1, 2, 3, 4, 5], objects.sort(comparator), "a regular comparator works fine");
236
237 comparator = Clipperz.Base.reverseComparator(MochiKit.Base.compare);
238 objects = [5, 3, 2, 4, 1];
239 SimpleTest.isDeeply([5, 4, 3, 2 ,1], objects.sort(comparator), "a reversed comparator works fine");
240
241 comparator = MochiKit.Base.keyComparator('label');
242 objects = [ {label:"5"}, {label:"3"}, {label:"1"}, {label:"4"}, {label:"2"}];
243 SimpleTest.isDeeply([ {label:"1"}, {label:"2"}, {label:"3"}, {label:"4"}, {label:"5"}], objects.sort(comparator), "a regular keyComparator works fine");
244
245 comparator = Clipperz.Base.reverseComparator(MochiKit.Base.keyComparator('label'));
246 objects = [ {label:"5"}, {label:"3"}, {label:"1"}, {label:"4"}, {label:"2"}];
247 SimpleTest.isDeeply([ {label:"5"}, {label:"4"}, {label:"3"}, {label:"2"}, {label:"1"}], objects.sort(comparator), "a reversed keyComparator works fine");
248 },
249
250 //-------------------------------------------------------------------------
251
252 'Clipperz.Base.map_test': function () {
253 var objects;
254 varcomputedObjecs;
255
256 objects = [5, 3, 2, 4, 1];
257 computedObjecs = Clipperz.Base.map(function (aValue) { return aValue * 2;}, objects);
258 SimpleTest.isDeeply(computedObjecs, [10, 6, 4, 8, 2], "the mapped values of the array do match");
259
260 objects = {
261 'five': 5,
262 'three':3,
263 'two': 2,
264 'four': 4,
265 'one': 1
266 };
267 computedObjecs = Clipperz.Base.map(function (aValue) { return aValue * 2;}, objects);
268 SimpleTest.isDeeply(computedObjecs, {
269 'five': 10,
270 'three':6,
271 'two': 4,
272 'four': 8,
273 'one': 2
274 }, "the mapped values of the object do match");
275 },
276
277 //-------------------------------------------------------------------------
278
279 'Clipperz.Base.isUrl_test': function () {
280 varurlTestCases;
281
282 urlTestCases = [
283 {url:'http://foo.com/blah_blah', expectedResult:true},
284 {url:'http://foo.com/blah_blah', expectedResult:true},
285 {url:'http://foo.com/blah_blah/', expectedResult:true},
286 {url:'http://foo.com/blah_blah_(wikipedia)', expectedResult:true},
287 {url:'http://foo.com/blah_blah.', expectedResult:true},
288 {url:'http://foo.com/blah_blah/.', expectedResult:true},
289 {url:'http://foo.com/blah_blah,', expectedResult:true},
290 {url:'http://✪df.ws/123', expectedResult:true},
291 {url:'http://➡.ws/䨹', expectedResult:true},
292 {url:'www.➡.ws/䨹', expectedResult:true},
293 {url:'http://www.example.com/wpstyle/?p=364.', expectedResult:true},
294 {url:'www.clipperz.com', expectedResult:true},
295 {url:'http://www.clipperz.com', expectedResult:true},
296 {url:'http://clipperz.com', expectedResult:true},
297
298 {url:'clipperz.com', expectedResult:false},
299 // {url:'www.clipperz', expectedResult:false},
300 // {url:'www.abc', expectedResult:false},
301 {url:'joe@clipperz.com', expectedResult:false},
302 {url:'<http://foo.com/blah_blah>', expectedResult:false},
303 {url:'<http://foo.com/blah_blah/>', expectedResult:false},
304 {}
305 ];
306
307 MochiKit.Base.map(function (someValues) {
308 if (typeof(someValues['url']) != 'undefined') {
309 SimpleTest.is(Clipperz.Base.isUrl(someValues['url']), someValues['expectedResult'], "testing url '" + someValues['url'] + "' - expected result: " + someValues['expectedResult']);
310 }
311 }, urlTestCases);
312
313/*
314 //RegExp and test strings courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
315 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah'), true,"url test +1");
316 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah/'), true,"url test +2");
317 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah_(wikipedia)'), true,"url test +3");
318 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah.'), true,"url test +4");
319 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah/.'), true,"url test +5");
320 SimpleTest.is(Clipperz.Base.isUrl('<http://foo.com/blah_blah>'), true,"url test +6");
321 SimpleTest.is(Clipperz.Base.isUrl('<http://foo.com/blah_blah/>'), true,"url test +7");
322 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah,'), true,"url test +8");
323 SimpleTest.is(Clipperz.Base.isUrl('http://✪df.ws/123'), true,"url test +9");
324 SimpleTest.is(Clipperz.Base.isUrl('http://➡.ws/䨹'), true,"url test +10");
325 SimpleTest.is(Clipperz.Base.isUrl('www.➡.ws/䨹'), true,"url test +11");
326 SimpleTest.is(Clipperz.Base.isUrl('http://www.example.com/wpstyle/?p=364.'),true,"url test +12");
327 SimpleTest.is(Clipperz.Base.isUrl('www.clipperz.com'), true,"url test +13");
328 SimpleTest.is(Clipperz.Base.isUrl('http://www.clipperz.com'), true,"url test +14");
329
330 // SimpleTest.is(Clipperz.Base.isUrl('http://userid@example.com'), true, "url test +13");// FAIL
331 // SimpleTest.is(Clipperz.Base.isUrl('http://userid@example.com:8080'), true, "url test +14");// FAIL
332 // SimpleTest.is(Clipperz.Base.isUrl('http://userid:password@example.com'), true, "url test +15");// FAIL
333 // SimpleTest.is(Clipperz.Base.isUrl('http://userid:password@example.com:8080'), true, "url test +16");// FAIL
334
335
336 SimpleTest.is(Clipperz.Base.isUrl('joe@clipperz.com'), false,"url test -1");
337 SimpleTest.is(Clipperz.Base.isUrl('rdar://1234'), false,"url test -2");
338 SimpleTest.is(Clipperz.Base.isUrl('rdar:/1234'), false,"url test -3");
339 SimpleTest.is(Clipperz.Base.isUrl('http://example.com:8080 x-yojimbo-item://6303E4C1-xxxx-45A6-AB9D-3A908F59AE0E'), false,"url test -4");
340 SimpleTest.is(Clipperz.Base.isUrl('message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e'), false,"url test -5");
341*/
342 },
343
344 //-------------------------------------------------------------------------
345
346 'Clipperz.Base.isEmail_test': function () {
347 varemailTestCases;
348
349 emailTestCases = [
350 {email:'joe@clipperz.com', expectedResult:true},
351
352 {email:'http://foo.com/blah_blah', expectedResult:false}
353 ];
354
355 MochiKit.Base.map(function (someValues) {
356 SimpleTest.is(Clipperz.Base.isEmail(someValues['email']), someValues['expectedResult'], "testing email '" + someValues['email'] + "' - expected result: " + someValues['expectedResult']);
357 }, emailTestCases);
358 },
359
360 //-------------------------------------------------------------------------
361
362 'syntaxFix': MochiKit.Base.noop
363}
364
365//=============================================================================
366
367SimpleTest.runDeferredTests("Clipperz.Base", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.html b/frontend/gamma/tests/tests/Clipperz/ByteArray.html
new file mode 100644
index 0000000..c8b8ae7
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.html
@@ -0,0 +1,71 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.ByteArray - tests</title>
32
33 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
34
35 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
36 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
37 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
38
39 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
40
41 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
44 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
45 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
46 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
47 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <!-- script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script -->
53
54 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
55
56</head>
57<body>
58
59<pre id="test">
60<script>
61 Clipperz_IEisBroken = false;
62</script>
63 <script type="text/javascript">
64 var longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a.";
65 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù";
66 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之";
67 </script>
68 <script type="text/javascript" src="ByteArray.test.js"></script>
69</pre>
70</body>
71</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js
new file mode 100644
index 0000000..ef2660e
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js
@@ -0,0 +1,893 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 //-------------------------------------------------------------------------
34
35 'core_tests': function (someTestArgs) {
36 // vardeferredResult;
37
38 // deferredResult = new Clipperz.Async.Deferred("core_tests", someTestArgs);
39 // deferredResult.addCallback(function() {
40 var byteArray;
41
42 byteArray = new Clipperz.ByteArray();
43
44 try {
45 byteArray.checkByteValue(512);
46 is(false, true, "a value greater that a byte (0x200) should have raised an exception - NO Exception");
47 } catch(e) {
48 // is(e.name,
49 // "Clipperz.ByteArray.exception.InvalidValue",
50 // "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
51 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name),
52 "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
53 };
54
55 // });
56 // deferredResult.callback();
57
58 // return deferredResult;
59
60 },
61
62 //-------------------------------------------------------------------------
63
64 'basic_tests': function (someTestArgs) {
65 vardeferredResult;
66
67 deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs);
68 deferredResult.addCallback(function() {
69 var byteArray;
70 var byteArray2;
71 varbyteArrayIterator;
72 varnextBlock;
73
74 byteArray = new Clipperz.ByteArray();
75 is(byteArray.length(), 0, "before adding any element the length is 0");
76 byteArray.appendByte(10);
77 is(byteArray.length(), 1, "adding a single byte the length == 1");
78 is(byteArray.byteAtIndex(0), 10, "the first element is correct");
79
80 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true});
81 nextBlock = byteArrayIterator.nextBlock();
82 is(nextBlock.constructor, Array, "ByteArrayIterator.nextBlock returns an array of byte values");
83 is(nextBlock.length, 1, "as the block size is 8bit, the returned array has only one element");
84 is(nextBlock[0], 10, "the element of the returned block is correct");
85 nextBlock = byteArrayIterator.nextBlock();
86 is(nextBlock, null, "after the last element, the nextBlock returns null");
87
88 byteArray = new Clipperz.ByteArray();
89 byteArray.appendBytes(10, 20, 45, 38);
90 is(byteArray.length(), 4, "Appending more bytes, returns the right length");
91 is(byteArray.byteAtIndex(0), 10, "and all the elements are right [0]");
92 is(byteArray.byteAtIndex(1), 20, "and all the elements are right [1]");
93 is(byteArray.byteAtIndex(2), 45, "and all the elements are right [2]");
94 is(byteArray.byteAtIndex(3), 38, "and all the elements are right [3]");
95
96 byteArray2 = new Clipperz.ByteArray();
97 byteArray2.appendBytes([10, 20, 45, 38]);
98 is(byteArray.equals(byteArray2), true, "equals method tested with a byteArray created with the same values");
99
100 byteArray2 = new Clipperz.ByteArray();
101 byteArray2.appendBytes([20, 11, 3, 22]);
102 is(byteArray.equals(byteArray2), false, "equals method tested with a byteArray created with different values");
103
104 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true});
105 nextBlock = byteArrayIterator.nextBlock();
106 is(nextBlock.length, 1, "the size of the block returned by the byteArrayIterator match with the configured blockedSize");
107 is(nextBlock[0], 10, "the values returned by nextBlock are right [1]");
108 nextBlock = byteArrayIterator.nextBlock();
109 is(nextBlock[0], 20, "the values returned by nextBlock are right [2]");
110 nextBlock = byteArrayIterator.nextBlock();
111 is(nextBlock[0], 45, "the values returned by nextBlock are right [3]");
112 nextBlock = byteArrayIterator.nextBlock();
113 is(nextBlock[0], 38, "the values returned by nextBlock are right [4]");
114 nextBlock = byteArrayIterator.nextBlock();
115 is(nextBlock, null, "after the last block the nextBlock method returns null");
116
117 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true});
118 nextBlock = byteArrayIterator.nextBlock();
119 is(nextBlock.length, 2, "on the same data, using a different block size, returns the right length");
120 is(nextBlock[0], 10, "and also the data are fine [1][0]");
121 is(nextBlock[1], 20, "and also the data are fine [1][1]");
122 nextBlock = byteArrayIterator.nextBlock();
123 is(nextBlock.length, 2, "also the second block size is right");
124 is(nextBlock[0], 45, "and also the data are fine [2][0]");
125 is(nextBlock[1], 38, "and also the data are fine [2][1]");
126 nextBlock = byteArrayIterator.nextBlock();
127 is(nextBlock, null, "even with a bigger blockSize, at the end the returned value is null");
128
129 byteArray = new Clipperz.ByteArray(11,22,33,44,55,66,77,88,99);
130 is(byteArray.length(), 9, "");
131 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true});
132 nextBlock = byteArrayIterator.nextBlock();
133 nextBlock = byteArrayIterator.nextBlock();
134 nextBlock = byteArrayIterator.nextBlock();
135 nextBlock = byteArrayIterator.nextBlock();
136 nextBlock = byteArrayIterator.nextBlock();
137 is(nextBlock.length, 2, "the last block of an odd byte array has always the same size");
138 is(nextBlock[0], 99, "the last element is returned");
139 is(nextBlock[1], 0, "and a 0 is return for the extra values");
140 nextBlock = byteArrayIterator.nextBlock();
141 is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned");
142
143 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(32/8), finalPadding:true});
144 nextBlock = byteArrayIterator.nextBlock();
145 is(nextBlock[0], 11, "32 bit blockSize [1][0]");
146 is(nextBlock[1], 22, "32 bit blockSize [1][1]");
147 is(nextBlock[2], 33, "32 bit blockSize [1][2]");
148 is(nextBlock[3], 44, "32 bit blockSize [1][3]");
149 nextBlock = byteArrayIterator.nextBlock();
150 is(nextBlock[0], 55, "32 bit blockSize [2][0]");
151 is(nextBlock[1], 66, "32 bit blockSize [2][1]");
152 is(nextBlock[2], 77, "32 bit blockSize [2][2]");
153 is(nextBlock[3], 88, "32 bit blockSize [2][3]");
154 nextBlock = byteArrayIterator.nextBlock();
155 is(nextBlock.length, 4, "the last block of an odd byte array has always the same size");
156 is(nextBlock[0], 99, "the last element is returned (2)");
157 is(nextBlock[1], 0, "and a 0 is return for the extra values (2.1)");
158 is(nextBlock[2], 0, "and a 0 is return for the extra values (2.2)");
159 is(nextBlock[3], 0, "and a 0 is return for the extra values (2.3)");
160 nextBlock = byteArrayIterator.nextBlock();
161 is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned (2)");
162
163 byteArray = new Clipperz.ByteArray([11,22,33,44,55,66,77,88,99,100, 111, 122, 133, 144, 155, 166, 177]);
164 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:true});
165 nextBlock = byteArrayIterator.nextBlock();
166 is(nextBlock.length, 16, "using a blockSize of 128 bit, the nextBlock return a 16 elements array");
167
168 byteArray = new Clipperz.ByteArray();
169 try {
170 byteArray.appendByte(512);
171 is(false, true, "appending a value greater that a byte (0x200) should have raised an exception - NO Exception");
172 } catch(e) {
173 // is(e.name,
174 // "Clipperz.ByteArray.exception.InvalidValue",
175 // "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
176 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name),
177 "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
178 };
179
180 try {
181 byteArray.appendByte(256);
182 is(false, true, "appending a value greater that a byte (0x100) should have raised an exception - NO Exception");
183 } catch(e) {
184 // is(e.name,
185 // "Clipperz.ByteArray.exception.InvalidValue",
186 // "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER")
187 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name),
188 "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER")
189 };
190
191 byteArray.appendByte(255);
192 is(byteArray.length(), 1, "appending a value that feets a single byte does not raise any exception");
193
194 byteArray = new Clipperz.ByteArray(10, 20, 30, 40, 50);
195 byteArray2 = new Clipperz.ByteArray("0x0a141e2832");
196 is(byteArray.equals(byteArray2), true, "the hex constructor works fine");
197
198 byteArray2 = byteArray.clone();
199 is(byteArray.equals(byteArray2), true, "the clone method works fine");
200 });
201 deferredResult.callback();
202
203 return deferredResult;
204 },
205
206 //-------------------------------------------------------------------------
207
208 'compare_tests': function (someTestArgs) {
209 vardeferredResult;
210
211 deferredResult = new Clipperz.Async.Deferred("compare_tests", someTestArgs);
212 deferredResult.addCallback(function() {
213 var byteArray1;
214 var byteArray2;
215 var result;
216
217 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
218 byteArray2 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
219 result = byteArray1.compare(byteArray2);
220 is(result, 0, "equal compare");
221
222 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
223 byteArray2 = new Clipperz.ByteArray("0x05", 16);
224 result = byteArray1.compare(byteArray2);
225 is(result, 1, "'OxXXXXXXX'.compare('0x05')");
226 result = byteArray2.compare(byteArray1);
227 is(result, -1, "'0x05'.compare('OxXXXXXXX')");
228
229 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
230 byteArray2 = new Clipperz.ByteArray("0xff", 16);
231 result = byteArray1.compare(byteArray2);
232 is(result, 1, "'OxXXXXXXX'.compare('0xff')");
233 result = byteArray2.compare(byteArray1);
234 is(result, -1, "'0xff'.compare('OxXXXXXXX')");
235 });
236 deferredResult.callback();
237
238 return deferredResult;
239 },
240
241 //-------------------------------------------------------------------------
242
243 'shiftLeft_tests': function (someTestArgs) {
244 vardeferredResult;
245
246 deferredResult = new Clipperz.Async.Deferred("shiftLeft_tests", someTestArgs);
247 deferredResult.addCallback(function() {
248
249 });
250 deferredResult.callback();
251
252 return deferredResult;
253 },
254
255 //-------------------------------------------------------------------------
256
257 'nextBlockArray_tests': function (someTestArgs) {
258 vardeferredResult;
259
260 deferredResult = new Clipperz.Async.Deferred("nextBlockArray_tests", someTestArgs);
261 deferredResult.addCallback(function() {
262 var byteArray;
263 var byteArrayIterator;
264 var nextBlock;
265
266 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb");
267 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false});
268 nextBlock = byteArrayIterator.nextBlockArray();
269 is(nextBlock.toHexString(), "0x8cf53d90077df9a043bf8d10b470b144", "nextBlockArray first iteration");
270 nextBlock = byteArrayIterator.nextBlockArray();
271 is(nextBlock.toHexString(), "0x784411c93a4d504556834dae3ea4a5bb", "nextBlockArray second iteration");
272
273 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb");
274 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false});
275 nextBlock = byteArrayIterator.nextBlock();
276 is(nextBlock.length, 16, "nextBlock first iteration length");
277 nextBlock = byteArrayIterator.nextBlock();
278 is(nextBlock.length, 16, "nextBlock second iteration length");
279 });
280 deferredResult.callback();
281
282 return deferredResult;
283 },
284
285 //-------------------------------------------------------------------------
286
287 'xor_tests': function (someTestArgs) {
288 vardeferredResult;
289
290 deferredResult = new Clipperz.Async.Deferred("xor_tests", someTestArgs);
291 deferredResult.addCallback(function() {
292 var byteArray;
293 var byteArray2;
294
295 byteArray = new Clipperz.ByteArray("0x55555555555555555555555555555555");
296 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000");
297 is(byteArray.xorMergeWithBlock(byteArray2).toHexString(), "0x55aa555555aa555555aa555555aa5555", "the xorMergeWithBlock method works fine");
298
299 byteArray = new Clipperz.ByteArray("0x555555555555555555");
300 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000");
301 is(byteArray.xorMergeWithBlock(byteArray2, 'left', 'truncate').toHexString(), "0x55aa555555aa555555", "the xorMergeWithBlock (left, truncate) method works fine");
302
303 byteArray = new Clipperz.ByteArray("0x555555555555555555");
304 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000");
305 is(byteArray.xorMergeWithBlock(byteArray2, 'right', 'truncate').toHexString(), "0x5555aa555555aa5555", "the xorMergeWithBlock (right, truncate) method works fine");
306 });
307 deferredResult.callback();
308
309 return deferredResult;
310 },
311
312 //-------------------------------------------------------------------------
313
314 'increment_tests': function (someTestArgs) {
315 vardeferredResult;
316
317 deferredResult = new Clipperz.Async.Deferred("increment_tests", someTestArgs);
318 deferredResult.addCallback(function() {
319 var byteArray;
320 varnumber;
321 var i,c;
322
323 number = new Clipperz.Crypto.BigInt("55555555555555555555555555555555", 16);
324 byteArray = new Clipperz.ByteArray("0x" + number.asString(16));
325 c = 2048;
326 for (i=0; i<c; i++) {
327 byteArray.increment();
328 }
329 is(byteArray.toHexString(), "0x" + number.add(2048).asString(16), "Clipperz.ByteArray.increment works");
330 });
331 deferredResult.callback();
332
333 return deferredResult;
334 },
335
336 //-------------------------------------------------------------------------
337
338 'split_tests': function (someTestArgs) {
339 vardeferredResult;
340
341 deferredResult = new Clipperz.Async.Deferred("split_tests", someTestArgs);
342 deferredResult.addCallback(function() {
343 var byteArray;
344
345 byteArray = new Clipperz.ByteArray("0xa1b2c3d4");
346 is(byteArray.split(0, 2).toHexString(), "0xa1b2", "byteArray.split(0,2) works fine");
347 is(byteArray.split(2).toHexString(), "0xc3d4", "byteArray.split(2) works fine");
348 is(byteArray.split(1, 3).toHexString(), "0xb2c3", "byteArray.split(1,3) works fine");
349 });
350 deferredResult.callback();
351
352 return deferredResult;
353 },
354
355 //-------------------------------------------------------------------------
356
357 'appendBlock_tests': function (someTestArgs) {
358 vardeferredResult;
359
360 deferredResult = new Clipperz.Async.Deferred("appendBlock_tests", someTestArgs);
361 deferredResult.addCallback(function() {
362 var byteArray;
363 var byteArray2;
364
365 byteArray = new Clipperz.ByteArray("0xa1b2c3d4");
366 byteArray2 = new Clipperz.ByteArray("0x1a2b3c4d");
367 is(byteArray.appendBlock(byteArray2).toHexString(), "0xa1b2c3d41a2b3c4d", "the appendBlock method works fine");
368 });
369 deferredResult.callback();
370
371 return deferredResult;
372 },
373
374 //-------------------------------------------------------------------------
375
376 'appendWords_tests': function (someTestArgs) {
377 vardeferredResult;
378
379 deferredResult = new Clipperz.Async.Deferred("appendWords_tests", someTestArgs);
380 deferredResult.addCallback(function() {
381 var byteArray;
382
383 byteArray = new Clipperz.ByteArray();
384 byteArray.appendWords(0xa1b2c4d4, 0x1a2b3c4d);
385 is(byteArray.toHexString(), "0xa1b2c4d41a2b3c4d", "test appendWords");
386
387 byteArray = new Clipperz.ByteArray();
388 byteArray.appendBigEndianWords(0xa1b2c4d4, 0x1a2b3c4d);
389 is(byteArray.toHexString(), "0xd4c4b2a14d3c2b1a", "test appendBigEndianWords");
390 });
391 deferredResult.callback();
392
393 return deferredResult;
394 },
395
396 //-------------------------------------------------------------------------
397
398 'setByteAtIndex_tests': function (someTestArgs) {
399 vardeferredResult;
400
401 deferredResult = new Clipperz.Async.Deferred("setByteAtIndex_tests", someTestArgs);
402 deferredResult.addCallback(function() {
403 varbyteArray;
404
405 byteArray = new Clipperz.ByteArray("0xa1b2c3d4e5f6");
406 byteArray.setByteAtIndex(10, 0);
407 is(byteArray.toHexString(), "0x0ab2c3d4e5f6", "setByteAtIndex( , 0) works fine");
408
409 byteArray.setByteAtIndex(10, 5);
410 is(byteArray.toHexString(), "0x0ab2c3d4e50a", "setByteAtIndex( , 5) works fine");
411
412 byteArray.setByteAtIndex(10, 6);
413 is(byteArray.toHexString(), "0x0ab2c3d4e50a0a", "setByteAtIndex( , 6) works fine");
414
415 byteArray.setByteAtIndex(10, 10);
416 is(byteArray.toHexString(), "0x0ab2c3d4e50a0a0000000a", "setByteAtIndex( , 10) works fine");
417 });
418 deferredResult.callback();
419
420 return deferredResult;
421 },
422
423 //-------------------------------------------------------------------------
424
425 'string_encoding_tests': function (someTestArgs) {
426 vardeferredResult;
427
428 deferredResult = new Clipperz.Async.Deferred("string_encoding_tests", someTestArgs);
429 deferredResult.addCallback(function() {
430 is(Clipperz.ByteArray.unicodeToUtf8HexString(40), "28", "String encoding - One byte character - middle");
431 is(Clipperz.ByteArray.unicodeToUtf8HexString(127), "7f", "String encoding - One byte character - top");
432
433 is(Clipperz.ByteArray.unicodeToUtf8HexString(128), "c280", "String encoding - Two bytes character - bottom");
434 is(Clipperz.ByteArray.unicodeToUtf8HexString(300), "c4ac", "String encoding - Two bytes character - middle");
435 is(Clipperz.ByteArray.unicodeToUtf8HexString(2047), "dfbf", "String encoding - Two bytes character - top");
436
437 is(Clipperz.ByteArray.unicodeToUtf8HexString(2048), "e0a080", "String encoding - Three bytes character - bottom");
438 is(Clipperz.ByteArray.unicodeToUtf8HexString(8192), "e28080", "String encoding - Three bytes character - middle");
439 is(Clipperz.ByteArray.unicodeToUtf8HexString(65535), "efbfbf", "String encoding - Three bytes character - top");
440
441 is(Clipperz.ByteArray.unicodeToUtf8HexString(65536), "f0908080", "String encoding - Four bytes character - bottom");
442 is(Clipperz.ByteArray.unicodeToUtf8HexString(1000000), "f3b48980", "String encoding - Four bytes character - middle");
443 is(Clipperz.ByteArray.unicodeToUtf8HexString(2097151), "f7bfbfbf", "String encoding - Four bytes character - top");
444 });
445 deferredResult.callback();
446
447 return deferredResult;
448 },
449
450 //-------------------------------------------------------------------------
451
452 'string_decoding_tests': function (someTestArgs) {
453 vardeferredResult;
454
455 deferredResult = new Clipperz.Async.Deferred("string_decoding_tests", someTestArgs);
456 deferredResult.addCallback(function() {
457 var byteArray;
458 varbyteArray2;
459 var unicodeString;
460
461 is(new Clipperz.ByteArray("0x28").asString().charCodeAt(0), 40, "String decoding - One byte character - middle");
462 is(new Clipperz.ByteArray("0x7f").asString().charCodeAt(0), 127, "String decoding - One byte character - top");
463
464 is(new Clipperz.ByteArray("0xc280").asString().charCodeAt(0), 128, "String decoding - Two bytes character - bottom");
465 is(new Clipperz.ByteArray("0xc4ac").asString().charCodeAt(0), 300, "String decoding - Two bytes character - middle");
466 is(new Clipperz.ByteArray("0xceb1").asString().charCodeAt(0), 945, "String decoding - Two bytes char: greek lowercase alpha - α");
467 is(new Clipperz.ByteArray("0xd790").asString().charCodeAt(0), 1488, "String decoding - Two bytes char: hebrew Aleph - א");
468 is(new Clipperz.ByteArray("0xdfbf").asString().charCodeAt(0), 2047, "String decoding - Two bytes character - top");
469
470 is(new Clipperz.ByteArray("0xe0a080").asString().charCodeAt(0), 2048, "String decoding - Three bytes character - bottom");
471 is(new Clipperz.ByteArray("0xe0bc80").asString().charCodeAt(0), 3840, "String decoding - Three bytes char: tibetan syllable Om - ༀ");
472 is(new Clipperz.ByteArray("0xe28080").asString().charCodeAt(0), 8192, "String decoding - Three bytes character - middle");
473 is(new Clipperz.ByteArray("0xe4b899").asString().charCodeAt(0), 19993, "String decoding - Three bytes char: CJK ideograph - 丙");
474 is(new Clipperz.ByteArray("0xefbfbf").asString().charCodeAt(0), 65535, "String decoding - Three bytes character - top");
475
476/*
477 is(new Clipperz.ByteArray("0xf0908080").asString().charCodeAt(0), 65536, "String decoding - Four bytes character - bottom");
478 is(new Clipperz.ByteArray("0xf0a08294").asString().charCodeAt(0), 131220, "String decoding - Four bytes char: CJK extended ideograph - ”");
479 is(new Clipperz.ByteArray("0xf3b48980").asString().charCodeAt(0), 1000000, "String decoding - Four bytes character - middle");
480 is(new Clipperz.ByteArray("0xf7bfbfbf").asString().charCodeAt(0), 2097151, "String decoding - Four bytes character - top");
481
482 is(String.fromCharCode(65535).charCodeAt(0), 65535, "test fromCharCode - charCodeAt (65535)");
483 is(String.fromCharCode(65536).charCodeAt(0), 65536, "test fromCharCode - charCodeAt (65536)");
484 is(String.fromCharCode(1000000).charCodeAt(0), 1000000, "test fromCharCode - charCodeAt (1000000)");
485 */
486 //----------------------------------------------------------
487
488 byteArray = new Clipperz.ByteArray("ABCD");
489 byteArray2 = new Clipperz.ByteArray("0x41424344");
490 is(byteArray.toHexString(), byteArray2.toHexString(), "the string constructor works fine (1 byte codes)");
491
492 unicodeString = "una stringa un po' piu' semplice";
493 byteArray = new Clipperz.ByteArray(unicodeString);
494 is(byteArray.asString(), unicodeString, "");
495 });
496 deferredResult.callback();
497
498 return deferredResult;
499 },
500
501 //-------------------------------------------------------------------------
502
503 'base64_encoding_decoding_tests': function (someTestArgs) {
504 vardeferredResult;
505
506 deferredResult = new Clipperz.Async.Deferred("base64_encoding_decoding_tests", someTestArgs);
507 deferredResult.addCallback(function() {
508 var byteArray;
509
510 byteArray = new Clipperz.ByteArray("\n");
511 is(byteArray.toBase64String(), "Cg==", "base64 encoding test (1)");
512
513 byteArray = new Clipperz.ByteArray("what");
514 is(byteArray.toBase64String(), "d2hhdA==", "base64 encoding test (2)");
515
516 byteArray = new Clipperz.ByteArray("what will print out");
517 is(byteArray.toBase64String(), "d2hhdCB3aWxsIHByaW50IG91dA==", "base64 encoding test (3)");
518
519 byteArray = new Clipperz.ByteArray("what will print out ");
520 is(byteArray.toBase64String(), "d2hhdCAgd2lsbCAgIHByaW50ICAgICBvdXQgICAgICA=", "base64 encoding test (4)");
521
522 byteArray = new Clipperz.ByteArray("what will print out");
523 is(byteArray.toBase64String(), "d2hhdCAgd2lsbCAgIHByaW50ICAgICBvdXQ=", "base64 encoding test (5)");
524
525 byteArray = new Clipperz.ByteArray().appendBase64String("Cg==");
526 is(byteArray.asString(), "\n", "base64 encoding test (1)");
527
528 byteArray = new Clipperz.ByteArray().appendBase64String("d2hhdA==");
529 is(byteArray.asString(), "what", "base64 encoding test (2)");
530
531 byteArray = new Clipperz.ByteArray().appendBase64String("d2hhdCB3aWxsIHByaW50IG91dA==");
532 is(byteArray.asString(), "what will print out", "base64 encoding test (3)");
533
534 byteArray = new Clipperz.ByteArray().appendBase64String("d2hhdCAgd2lsbCAgIHByaW50ICAgICBvdXQgICAgICA=");
535 is(byteArray.asString(), "what will print out ", "base64 encoding test (4)");
536
537 byteArray = new Clipperz.ByteArray().appendBase64String("d2hhdCAgd2lsbCAgIHByaW50ICAgICBvdXQ=");
538 is(byteArray.asString(), "what will print out", "base64 deconding test (5)");
539 });
540 deferredResult.callback();
541
542 return deferredResult;
543 },
544
545 //-------------------------------------------------------------------------
546
547 'base64_encoding_decoding_longText_tests': function (someTestArgs) {
548 vardeferredResult;
549
550 deferredResult = new Clipperz.Async.Deferred("base64_encoding_decoding_longText_tests", someTestArgs);
551 deferredResult.addCallback(function() {
552 var longText;
553 var byteArray;
554 var base64encoding;
555
556 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur interdum vulputate ligula. Aliquam erat volutpat. Fusce malesuada felis et purus. Vivamus convallis, metus id lacinia venenatis, est eros sagittis neque, at porttitor erat lorem a risus. Phasellus ultricies nunc et turpis. Ut nec sem ut quam ornare feugiat. Donec nibh. Quisque ullamcorper, neque eu convallis dictum, orci nisl dictum quam, ac elementum arcu sem varius sem. Suspendisse vitae dolor non magna suscipit semper. Suspendisse ac magna. Praesent et purus. Aenean ut justo. Curabitur dictum, nisl a consectetuer viverra, libero est auctor metus, et rhoncus risus diam in orci. Nam magna felis, lobortis eu, eleifend quis, tristique quis, mi. Praesent aliquet. Aenean mollis turpis sed dolor. Donec ac nunc. Nulla eu lacus in ipsum molestie rutrum. Nunc dignissim purus non nibh. Maecenas congue risus at neque sollicitudin eleifend.\n\nNunc purus orci, sagittis ut, vehicula non, auctor eu, orci. Fusce non nisl vel risus rutrum venenatis. Donec dapibus sodales eros. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ultrices fringilla dui. Phasellus sit amet enim in tellus rutrum dapibus. Sed blandit malesuada turpis. Ut vel orci. Curabitur id eros. Sed sodales tempus urna. Praesent et neque. Sed ultricies. Praesent risus quam, elementum eget, tincidunt ac, condimentum sit amet, urna.\n\nLorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin vel diam imperdiet felis luctus luctus. Nunc tincidunt nisl ac arcu. Sed id urna id magna nonummy varius. Mauris ligula. Vivamus purus eros, dignissim non, bibendum eget, dapibus sit amet, urna. Donec scelerisque dapibus odio. Aenean gravida ante at eros. Aenean volutpat vehicula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed elementum nisi ac dui. Fusce consectetuer venenatis nisi. Etiam diam. Nunc urna tortor, feugiat sed, facilisis eu, lacinia ut, felis. Vivamus vel lacus in massa accumsan faucibus. Cras iaculis eros. Donec non risus eu mi aliquam facilisis. Quisque vitae erat. Vivamus sed felis at metus ullamcorper ornare. Aliquam orci.\n\nPellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras ultrices, tortor in tempus laoreet, orci magna auctor quam, ultricies consequat sem eros eu magna. Mauris tempus egestas libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Curabitur auctor molestie ante. Quisque laoreet urna a quam. Sed sagittis, nulla vitae bibendum tempus, metus ante bibendum urna, ut ullamcorper mi urna vitae neque. Praesent dolor. Maecenas sit amet tortor. Proin erat. Suspendisse ipsum. Nulla facilisi. Vestibulum nonummy nulla ac libero. Aliquam in mauris ut libero cursus ullamcorper. Nam ullamcorper auctor tortor.\n\nNulla et odio. Duis nec velit. Sed posuere neque vitae dolor. Phasellus diam massa, sollicitudin vel, pellentesque in, fringilla pretium, libero. In lacinia massa ut libero pharetra sodales. Aliquam erat volutpat. Suspendisse egestas, turpis at pretium placerat, sem dolor tristique felis, nec egestas lectus risus eu quam. Curabitur leo dolor, varius sed, tristique non, fermentum eget, elit. Vivamus a leo eu diam faucibus congue. Nam quam. Curabitur est velit, luctus quis, tempor et, mattis consectetuer, dolor. Ut accumsan dui nec mi. Donec enim. Mauris accumsan nisl. Praesent sit amet diam ut velit suscipit vehicula. Vestibulum augue diam, placerat sit amet, gravida volutpat, egestas nec, metus. Curabitur risus felis, tempus nec, blandit a, condimentum at, risus.";
557
558 byteArray = new Clipperz.ByteArray(longText);
559 base64encoding = byteArray.toBase64String();
560 byteArray = new Clipperz.ByteArray().appendBase64String(base64encoding);
561 is(byteArray.asString(), longText, "the base64 encoding/decoding works also with long texts");
562 });
563 deferredResult.callback();
564
565 return deferredResult;
566 },
567
568 //-------------------------------------------------------------------------
569
570 'base32_encoding_decoding_tests': function (someTestArgs) {
571 vardeferredResult;
572
573 deferredResult = new Clipperz.Async.Deferred("base32_encoding_decoding_tests", someTestArgs);
574 deferredResult.addCallback(function() {
575 var byteArray;
576
577 byteArray = new Clipperz.ByteArray("\n");
578 is(byteArray.toBase32String(), "18======", "base32 encoding test (1)");
579
580 byteArray = new Clipperz.ByteArray().appendBase32String("18======");
581 is(byteArray.toBase32String(), "18======", "base32 encoding test (2)");
582
583 byteArray = new Clipperz.ByteArray().appendBase32String("lLiIo0O1");
584 is(byteArray.toBase32String(), "11110001", "base32 encoding test (3)");
585
586 byteArray = new Clipperz.ByteArray().appendBase32String("lLiI o0O1");
587 is(byteArray.toBase32String(), "11110001", "base32 encoding test (3.1)");
588
589 byteArray = new Clipperz.ByteArray("0xffffffffff");
590 is(byteArray.toBase32String(), "zzzzzzzz", "base32 encoding test (4)");
591
592 byteArray = new Clipperz.ByteArray().appendBase32String("cccccccc");
593 is(byteArray.toBase32String(), "cccccccc", "base32 encoding test (5)");
594
595 byteArray = new Clipperz.ByteArray().appendBase32String("bbbbbbbb");
596 is(byteArray.toBase32String(), "bbbbbbbb", "base32 encoding test (6)");
597
598 byteArray = new Clipperz.ByteArray().appendBase32String("aAbBcCdD");
599 is(byteArray.toHexString(), "0x5296b631ad", "base32 encoding test (7 hex)");
600 is(byteArray.toBase32String(), "aabbccdd", "base32 encoding test (7)");
601
602 byteArray = new Clipperz.ByteArray().appendBase32String("lLiIo0O1-aAbBcCdD-abcdefge-ll11ooOO");
603 is(byteArray.toBase32String(), "11110001aabbccddabcdefge11110000", "base32 encoding test (8)");
604
605 byteArray = new Clipperz.ByteArray().appendBase32String("lLiI o0O1 - aAbB cCdD - abcd efge - ll11 ooOO");
606 is(byteArray.toBase32String(), "11110001aabbccddabcdefge11110000", "base32 encoding test (8.1)");
607 });
608 deferredResult.callback();
609
610 return deferredResult;
611 },
612
613 //-------------------------------------------------------------------------
614
615 'base32_encoding_decoding_longText_tests': function (someTestArgs) {
616 vardeferredResult;
617
618 deferredResult = new Clipperz.Async.Deferred("base32_encoding_decoding_longText_tests", someTestArgs);
619 deferredResult.addCallback(function() {
620 var longText;
621 var base32String;
622 var byteArray;
623
624 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur interdum vulputate ligula. Aliquam erat volutpat. Fusce malesuada felis et purus. Vivamus convallis, metus id lacinia venenatis, est eros sagittis neque, at porttitor erat lorem a risus. Phasellus ultricies nunc et turpis. Ut nec sem ut quam ornare feugiat. Donec nibh. Quisque ullamcorper, neque eu convallis dictum, orci nisl dictum quam, ac elementum arcu sem varius sem. Suspendisse vitae dolor non magna suscipit semper. Suspendisse ac magna. Praesent et purus. Aenean ut justo. Curabitur dictum, nisl a consectetuer viverra, libero est auctor metus, et rhoncus risus diam in orci. Nam magna felis, lobortis eu, eleifend quis, tristique quis, mi. Praesent aliquet. Aenean mollis turpis sed dolor. Donec ac nunc. Nulla eu lacus in ipsum molestie rutrum. Nunc dignissim purus non nibh. Maecenas congue risus at neque sollicitudin eleifend.\n\nNunc purus orci, sagittis ut, vehicula non, auctor eu, orci. Fusce non nisl vel risus rutrum venenatis. Donec dapibus sodales eros. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ultrices fringilla dui. Phasellus sit amet enim in tellus rutrum dapibus. Sed blandit malesuada turpis. Ut vel orci. Curabitur id eros. Sed sodales tempus urna. Praesent et neque. Sed ultricies. Praesent risus quam, elementum eget, tincidunt ac, condimentum sit amet, urna.\n\nLorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin vel diam imperdiet felis luctus luctus. Nunc tincidunt nisl ac arcu. Sed id urna id magna nonummy varius. Mauris ligula. Vivamus purus eros, dignissim non, bibendum eget, dapibus sit amet, urna. Donec scelerisque dapibus odio. Aenean gravida ante at eros. Aenean volutpat vehicula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed elementum nisi ac dui. Fusce consectetuer venenatis nisi. Etiam diam. Nunc urna tortor, feugiat sed, facilisis eu, lacinia ut, felis. Vivamus vel lacus in massa accumsan faucibus. Cras iaculis eros. Donec non risus eu mi aliquam facilisis. Quisque vitae erat. Vivamus sed felis at metus ullamcorper ornare. Aliquam orci.\n\nPellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras ultrices, tortor in tempus laoreet, orci magna auctor quam, ultricies consequat sem eros eu magna. Mauris tempus egestas libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Curabitur auctor molestie ante. Quisque laoreet urna a quam. Sed sagittis, nulla vitae bibendum tempus, metus ante bibendum urna, ut ullamcorper mi urna vitae neque. Praesent dolor. Maecenas sit amet tortor. Proin erat. Suspendisse ipsum. Nulla facilisi. Vestibulum nonummy nulla ac libero. Aliquam in mauris ut libero cursus ullamcorper. Nam ullamcorper auctor tortor.\n\nNulla et odio. Duis nec velit. Sed posuere neque vitae dolor. Phasellus diam massa, sollicitudin vel, pellentesque in, fringilla pretium, libero. In lacinia massa ut libero pharetra sodales. Aliquam erat volutpat. Suspendisse egestas, turpis at pretium placerat, sem dolor tristique felis, nec egestas lectus risus eu quam. Curabitur leo dolor, varius sed, tristique non, fermentum eget, elit. Vivamus a leo eu diam faucibus congue. Nam quam. Curabitur est velit, luctus quis, tempor et, mattis consectetuer, dolor. Ut accumsan dui nec mi. Donec enim. Mauris accumsan nisl. Praesent sit amet diam ut velit suscipit vehicula. Vestibulum augue diam, placerat sit amet, gravida volutpat, egestas nec, metus. Curabitur risus felis, tempus nec, blandit a, condimentum at, risus.";
625 byteArray = new Clipperz.ByteArray(longText);
626 base32String = byteArray.toBase32String();
627 byteArray = new Clipperz.ByteArray().appendBase32String(base32String);
628 is(byteArray.asString(), longText, "base32 encoding test (9)");
629 });
630 deferredResult.callback();
631
632 return deferredResult;
633 },
634
635 //-------------------------------------------------------------------------
636
637 'error_correction_tests': function (someTestArgs) {
638 vardeferredResult;
639
640 deferredResult = new Clipperz.Async.Deferred("error_correction_tests", someTestArgs);
641 deferredResult.addCallback(function() {
642 varoddInput;
643 var byteArray;
644
645 oddInput = "0x1aa22bb33cc";
646 byteArray = new Clipperz.ByteArray(oddInput);
647 is(byteArray.toHexString(), "0x01aa22bb33cc", "fix an input hex string with on odd string length");
648 });
649 deferredResult.callback();
650
651 return deferredResult;
652 },
653
654 //-------------------------------------------------------------------------
655
656 'zero_values_tests': function (someTestArgs) {
657 vardeferredResult;
658
659 deferredResult = new Clipperz.Async.Deferred("zero_values_tests", someTestArgs);
660 deferredResult.addCallback(function() {
661 var byteArray;
662
663 byteArray = new Clipperz.ByteArray(0, 0, 0, 0);
664 is(byteArray.length(), 4, "An array with 4 '0' values has length = 4");
665 is(byteArray.byteAtIndex(0), 0, "The first element of a '0' filled array is '0'");
666
667 byteArray = new Clipperz.ByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
668 is(byteArray.length(), 16, "An array with 16 '0' values has length = 16");
669 is(byteArray.byteAtIndex(0), 0, "The first element of a '0' filled array is '0'");
670 is(byteArray.byteAtIndex(15), 0, "The last element of a '0' filled array is '0'");
671 is(byteArray.toHexString(), "0x00000000000000000000000000000000", "HEX representation of an array full of '0'");
672 });
673 deferredResult.callback();
674
675 return deferredResult;
676 },
677
678 //-------------------------------------------------------------------------
679
680 'array_values_tests': function (someTestArgs) {
681 vardeferredResult;
682
683 deferredResult = new Clipperz.Async.Deferred("array_values_tests", someTestArgs);
684 deferredResult.addCallback(function() {
685 var byteArray;
686 var arrayValues;
687
688 byteArray = new Clipperz.ByteArray("0xa1b2c3d4e5f6");
689 arrayValues = byteArray.arrayValues();
690 is(arrayValues[0], parseInt("0xa1"), "the first value of arrayValues is 'a1'");
691 });
692 deferredResult.callback();
693
694 return deferredResult;
695 },
696
697 //-------------------------------------------------------------------------
698
699 'string_contructor_tests': function (someTestArgs) {
700 vardeferredResult;
701
702 deferredResult = new Clipperz.Async.Deferred("string_contructor_tests", someTestArgs);
703 deferredResult.addCallback(function() {
704 // varlongAsciiText;
705 // var longIsoLatin1Text;
706 // var longUtf8Text;
707 var stringConstructorTestFunction;
708
709 // longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a.";
710 is(longAsciiText.length, 6000, "tThe ascii string should be 6000 char long");
711
712 // longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù";
713 is(longIsoLatin1Text.length, 3000, "The Iso-Latin1 string should be 3000 char long");
714
715 // longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之";
716 is(longUtf8Text.length, 2000, "tThe UTF8 string should be 2000 char long");
717
718 stringConstructorTestFunction = function(aTestString, aLabel) {
719 var byteArray;
720 var base64String;
721 var stringConstructorStartTime, stringConstructorEndTime;
722 var maxExpectedTime;
723
724 stringConstructorStartTime = new Date();
725 byteArray = new Clipperz.ByteArray(aTestString);
726stringConstructorEndTime = new Date();
727 maxExpectedTime = 30;
728 is(byteArray.length(), 6000, "[" + aLabel + "] The reference text should be 6000 bytes long");
729 is((stringConstructorEndTime - stringConstructorStartTime) < maxExpectedTime, true, "[" + aLabel + "] The construction of the byte array took " + (stringConstructorEndTime - stringConstructorStartTime) + " (expected < " + maxExpectedTime + ")");
730//MochiKit.Logging.logDebug("[" + aLabel + "] The construction of the byte array took " + (stringConstructorEndTime - stringConstructorStartTime));
731
732 stringConstructorStartTime = new Date();
733 base64String = byteArray.toBase64String();
734stringConstructorEndTime = new Date();
735 maxExpectedTime = 30;
736 is(base64String.length, 8000, "[" + aLabel + "] the base64 representation of 6000 bytes is 8000 chars long");
737 is((stringConstructorEndTime - stringConstructorStartTime) < maxExpectedTime, true, "[" + aLabel + "] The generation of the base64 string took " + (stringConstructorEndTime - stringConstructorStartTime) + " (expected < " + maxExpectedTime + ")");
738//MochiKit.Logging.logDebug("[" + aLabel + "] The generation of the base64 string took " + (stringConstructorEndTime - stringConstructorStartTime));
739
740 stringConstructorStartTime = new Date();
741 byteArray = new Clipperz.ByteArray();
742 byteArray.appendBase64String(base64String);
743stringConstructorEndTime = new Date();
744 maxExpectedTime = 200;
745 is(byteArray.length(), 6000, "[" + aLabel + "] a byte array build from a 8000 chars base64 string should contain 6000 bytes");
746 is((stringConstructorEndTime - stringConstructorStartTime) < maxExpectedTime, true, "[" + aLabel + "] The construction of the byte array from a base64 string took " + (stringConstructorEndTime - stringConstructorStartTime) + " (expected < " + maxExpectedTime + ")");
747//MochiKit.Logging.logDebug("[" + aLabel + "] The construction of the byte array from a base64 string took " + (stringConstructorEndTime - stringConstructorStartTime));
748 }
749
750 stringConstructorTestFunction(longAsciiText, "ASCII");
751 stringConstructorTestFunction(longIsoLatin1Text, "ISO-Latin1");
752 stringConstructorTestFunction(longUtf8Text, "UTF-8");
753 });
754 deferredResult.callback();
755
756 return deferredResult;
757 },
758
759 //-------------------------------------------------------------------------
760
761 'bit_operations_tests': function (someTestArgs) {
762 vardeferredResult;
763
764 deferredResult = new Clipperz.Async.Deferred("bit_operations_tests", someTestArgs);
765 deferredResult.addCallback(function() {
766 var byteArray;
767
768 byteArray = new Clipperz.ByteArray(0, 255, 0, 255);
769 is(byteArray.bitAtIndex(0), 1, "bitAtIndex - test 1");
770 is(byteArray.bitAtIndex(7), 1, "bitAtIndex - test 2");
771 is(byteArray.bitAtIndex(8), 0, "bitAtIndex - test 3");
772
773 is(byteArray.bitBlockAtIndexWithSize(0, 4), 15, "bitBlockAtIndexWithSize - test 1");
774 is(byteArray.bitBlockAtIndexWithSize(4, 4), 15, "bitBlockAtIndexWithSize - test 2");
775 is(byteArray.bitBlockAtIndexWithSize(4, 6), 15, "bitBlockAtIndexWithSize - test 3");
776 is(byteArray.bitBlockAtIndexWithSize(8, 4), 0, "bitBlockAtIndexWithSize - test 4");
777 is(byteArray.bitBlockAtIndexWithSize(12, 4), 0, "bitBlockAtIndexWithSize - test 5");
778 is(byteArray.bitBlockAtIndexWithSize(12, 5), 16, "bitBlockAtIndexWithSize - test 6");
779 is(byteArray.bitBlockAtIndexWithSize(12, 6), 48, "bitBlockAtIndexWithSize - test 7");
780
781 });
782 deferredResult.callback();
783
784 return deferredResult;
785 },
786
787 //-------------------------------------------------------------------------
788
789 'prefixMatchingBits_tests': function (someTestArgs) {
790 vardeferredResult;
791
792 deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs);
793 deferredResult.addCallback(function() {
794 varvalue1;
795 var value2;
796 var toll;
797
798 // toll = new Clipperz.PM.Toll();
799
800 value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
801 value2 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
802 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 256);
803
804 value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
805 value2 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000008");
806 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 252);
807
808 value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
809 value2 = new Clipperz.ByteArray("0x0000000000000000000000000000000080000000000000000000000000000000");
810 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 128);
811
812 value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
813 value2 = new Clipperz.ByteArray("0x8000000000000000000000000000000080000000000000000000000000000000");
814 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 0);
815
816 value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
817 value2 = new Clipperz.ByteArray("0x0100000000000000000000000000000000000000000000000000000000000000");
818 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 7);
819
820 value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
821 value2 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000001");
822 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 255);
823
824 value1 = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
825 value2 = new Clipperz.ByteArray("0x4000000000000000000000000000000000000000000000000000000000000000");
826 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 1);
827
828 value1 = new Clipperz.ByteArray("0x0853120d776e04325d070c082e06390315505166740b07007f060f003e0c576f");
829 value2 = new Clipperz.ByteArray("0x0853120d776e04325d070c082e06390315505166740b07007f060f003e0c576f");
830 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 256);
831
832 value1 = new Clipperz.ByteArray("0x0a03580756011d000a620e3b60670508092f020a0a0c2500282d480307000046");
833 value2 = new Clipperz.ByteArray("0x0a03580756011d000a620e3b60670508092f020a0a0c2500282d480307004d46");
834 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 241);
835
836 value1 = new Clipperz.ByteArray("0x0a03580756011d000a620e3b60670508092f020a0a0c2500282d480307000046");
837 value2 = new Clipperz.ByteArray("0x0a83580756011d000a620e3b60670508092f020a0a0c2500282d480307004d46");
838 is(Clipperz.ByteArray.prefixMatchingBits(value1, value2), 8);
839 });
840
841 deferredResult.callback();
842
843 return deferredResult;
844 },
845
846 //-------------------------------------------------------------------------
847
848 'binaryString_test': function (someTestArgs) {
849 varhexString;
850 var binaryString;
851
852 var testBinaryString = function (anHexString, aBinaryString) {
853 varbyteArray;
854 var byteArrayFromBinaryString;
855
856 byteArray = new Clipperz.ByteArray(anHexString);
857 byteArrayFromBinaryString = (new Clipperz.ByteArray()).appendBinaryString(aBinaryString);
858 ok(byteArray.equals(byteArrayFromBinaryString), "the two byteArray have the same values");
859 is(byteArray.toBinaryString(), aBinaryString, "the binaryString matches");
860 };
861
862 hexString = "0x888990";
863 binaryString = "\x88\x89\x90";
864 testBinaryString(hexString, binaryString);
865
866 hexString = "0x000102030405060708090a0b0c0d0e0f";
867 binaryString = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f";
868 testBinaryString(hexString, binaryString);
869
870 hexString = "0x101112131415161718191a1b1c1d1e1f";
871 binaryString = "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f";
872 testBinaryString(hexString, binaryString);
873
874 hexString = "0xd0d1d2d3d4d5d6d7d8d9dadbdcdddedf";
875 binaryString = "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf";
876 testBinaryString(hexString, binaryString);
877
878 hexString = "0xe0e1e2e3e4e5e6e7e8e9eaebecedeeef";
879 binaryString = "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef";
880 testBinaryString(hexString, binaryString);
881
882 hexString = "0xf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
883 binaryString = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
884 testBinaryString(hexString, binaryString);
885 },
886
887 //-------------------------------------------------------------------------
888 'syntaxFix': MochiKit.Base.noop
889};
890
891//#############################################################################
892
893SimpleTest.runDeferredTests("Clipperz.ByteArray", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
new file mode 100644
index 0000000..93089b7
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
@@ -0,0 +1,292 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Crypto.AES_v3 - TEST</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37
38 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
39
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
44
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
47
48</head>
49<body>
50<pre id="test">
51<script type="text/javascript">
52
53try {
54 var block;
55 var keyValue;
56 varkey;
57 var encryptedBlock;
58 var startTime, endTime;
59
60 startTime = new Date();
61
62 keyValue = new Clipperz.ByteArray("0x00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526");
63 key = new Clipperz.Crypto.AES.Key({key:keyValue});
64 block = new Clipperz.ByteArray("0x834eadfccac7e1b30664b1aba44815ab");
65 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
66 is(encryptedBlock.toHexString(), "0x1946dabf6a03a2a2c3d0b05080aed6fc", "Test 1");
67
68 keyValue = new Clipperz.ByteArray("0x28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e");
69 key = new Clipperz.Crypto.AES.Key({key:keyValue});
70 block = new Clipperz.ByteArray("0xd9dc4dba3021b05d67c0518f72b62bf1");
71 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
72 is(encryptedBlock.toHexString(), "0x5ed301d747d3cc715445ebdec62f2fb4", "Test 2");
73
74 keyValue = new Clipperz.ByteArray("0x50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576");
75 key = new Clipperz.Crypto.AES.Key({key:keyValue});
76 block = new Clipperz.ByteArray("0xa291d86301a4a739f7392173aa3c604c");
77 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
78 is(encryptedBlock.toHexString(), "0x6585c8f43d13a6beab6419fc5935b9d0", "Test 3");
79
80 keyValue = new Clipperz.ByteArray("0x78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e");
81 key = new Clipperz.Crypto.AES.Key({key:keyValue});
82 block = new Clipperz.ByteArray("0x4264b2696498de4df79788a9f83e9390");
83 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
84 is(encryptedBlock.toHexString(), "0x2a5b56a596680fcc0e05f5e0f151ecae", "Test 4");
85
86 keyValue = new Clipperz.ByteArray("0xa0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6");
87 key = new Clipperz.Crypto.AES.Key({key:keyValue});
88 block = new Clipperz.ByteArray("0xee9932b3721804d5a83ef5949245b6f6");
89 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
90 is(encryptedBlock.toHexString(), "0xf5d6ff414fd2c6181494d20c37f2b8c4", "Test 5");
91
92 keyValue = new Clipperz.ByteArray("0xc8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee");
93 key = new Clipperz.Crypto.AES.Key({key:keyValue});
94 block = new Clipperz.ByteArray("0xe6248f55c5fdcbca9cbbb01c88a2ea77");
95 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
96 is(encryptedBlock.toHexString(), "0x85399c01f59fffb5204f19f8482f00b8", "Test 6");
97
98 keyValue = new Clipperz.ByteArray("0xf0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516");
99 key = new Clipperz.Crypto.AES.Key({key:keyValue});
100 block = new Clipperz.ByteArray("0xb8358e41b9dff65fd461d55a99266247");
101 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
102 is(encryptedBlock.toHexString(), "0x92097b4c88a041ddf98144bc8d22e8e7", "Test 7");
103
104 keyValue = new Clipperz.ByteArray("0x18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e");
105 key = new Clipperz.Crypto.AES.Key({key:keyValue});
106 block = new Clipperz.ByteArray("0xf0e2d72260af58e21e015ab3a4c0d906");
107 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
108 is(encryptedBlock.toHexString(), "0x89bd5b73b356ab412aef9f76cea2d65c", "Test 8");
109
110 keyValue = new Clipperz.ByteArray("0x40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566");
111 key = new Clipperz.Crypto.AES.Key({key:keyValue});
112 block = new Clipperz.ByteArray("0x475b8b823ce8893db3c44a9f2a379ff7");
113 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
114 is(encryptedBlock.toHexString(), "0x2536969093c55ff9454692f2fac2f530", "Test 9");
115
116 keyValue = new Clipperz.ByteArray("0x68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e");
117 key = new Clipperz.Crypto.AES.Key({key:keyValue});
118 block = new Clipperz.ByteArray("0x688f5281945812862f5f3076cf80412f");
119 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
120 is(encryptedBlock.toHexString(), "0x07fc76a872843f3f6e0081ee9396d637", "Test 10");
121
122 //-------------------------------------------------------------------------
123 //
124 // Key expansion
125 //
126 //-------------------------------------------------------------------------
127 //test vector: http://en.wikipedia.org/wiki/Rijndael_key_schedule#Test_vectors
128
129 keyValue = new Clipperz.ByteArray("0x0000000000000000000000000000000012345678");
130 try {
131 key = new Clipperz.Crypto.AES.Key({key:keyValue});
132 is(true, false, "Unsupported key size");
133 } catch (exception) {
134 is(true, true, "Unsupported key size");
135 }
136
137 keyValue = new Clipperz.ByteArray("0x00000000000000000000000000000000");
138 key = new Clipperz.Crypto.AES.Key({key:keyValue});
139 is(key.stretchedKey().toHexString(),
140 "0x" +"00000000000000000000000000000000" +
141 "62636363626363636263636362636363" +
142 "9b9898c9f9fbfbaa9b9898c9f9fbfbaa" +
143 "90973450696ccffaf2f457330b0fac99" +
144 "ee06da7b876a1581759e42b27e91ee2b" +
145 "7f2e2b88f8443e098dda7cbbf34b9290" +
146 "ec614b851425758c99ff09376ab49ba7" +
147 "217517873550620bacaf6b3cc61bf09b" +
148 "0ef903333ba9613897060a04511dfa9f" +
149 "b1d4d8e28a7db9da1d7bb3de4c664941" +
150 "b4ef5bcb3e92e21123e951cf6f8f188e",
151 "Stretched empty key");
152
153
154 keyValue = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
155 key = new Clipperz.Crypto.AES.Key({key:keyValue});
156 is(key.stretchedKey().toHexString(),
157 "0x" +"00000000000000000000000000000000" +
158 "00000000000000000000000000000000" +
159 "62636363626363636263636362636363" +
160 "aafbfbfbaafbfbfbaafbfbfbaafbfbfb" +
161 "6f6c6ccf0d0f0fac6f6c6ccf0d0f0fac" +
162 "7d8d8d6ad77676917d8d8d6ad7767691" +
163 "5354edc15e5be26d31378ea23c38810e" +
164 "968a81c141fcf7503c717a3aeb070cab" +
165 "9eaa8f28c0f16d45f1c6e3e7cdfe62e9" +
166 "2b312bdf6acddc8f56bca6b5bdbbaa1e" +
167 "6406fd52a4f79017553173f098cf1119" +
168 "6dbba90b0776758451cad331ec71792f" +
169 "e7b0e89c4347788b16760b7b8eb91a62" +
170 "74ed0ba1739b7e252251ad14ce20d43b" +
171 "10f80a1753bf729c45c979e7cb706385",
172 "Stretched empty key");
173
174 var roundIndex;
175
176 roundIndex = 0;
177 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x00000000000000000000000000000000", "empty key, subKeyAtRound(0)");
178 roundIndex = 1;
179 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x00000000000000000000000000000000", "empty key, subKeyAtRound(1)");
180 roundIndex = 2;
181 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x62636363626363636263636362636363", "empty key, subKeyAtRound(2)");
182 roundIndex = 3;
183 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0xaafbfbfbaafbfbfbaafbfbfbaafbfbfb", "empty key, subKeyAtRound(3)");
184 roundIndex = 4;
185 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6f6c6ccf0d0f0fac6f6c6ccf0d0f0fac", "empty key, subKeyAtRound(4)");
186 roundIndex = 5;
187 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x7d8d8d6ad77676917d8d8d6ad7767691", "empty key, subKeyAtRound(5)");
188 roundIndex = 6;
189 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x5354edc15e5be26d31378ea23c38810e", "empty key, subKeyAtRound(6)");
190 roundIndex = 7;
191 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x968a81c141fcf7503c717a3aeb070cab", "empty key, subKeyAtRound(7)");
192 roundIndex = 8;
193 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x9eaa8f28c0f16d45f1c6e3e7cdfe62e9", "empty key, subKeyAtRound(8)");
194 roundIndex = 9;
195 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x2b312bdf6acddc8f56bca6b5bdbbaa1e", "empty key, subKeyAtRound(9)");
196 roundIndex = 10;
197 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6406fd52a4f79017553173f098cf1119", "empty key, subKeyAtRound(10)");
198 roundIndex = 11;
199 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6dbba90b0776758451cad331ec71792f", "empty key, subKeyAtRound(11)");
200 roundIndex = 12;
201 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0xe7b0e89c4347788b16760b7b8eb91a62", "empty key, subKeyAtRound(12)");
202 roundIndex = 13;
203 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x74ed0ba1739b7e252251ad14ce20d43b", "empty key, subKeyAtRound(13)");
204 roundIndex = 14;
205 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x10f80a1753bf729c45c979e7cb706385", "empty key, subKeyAtRound(14)");
206
207
208 //-------------------------------------------------------------------------
209 //
210 // Encrypt / decrypt
211 //
212 //-------------------------------------------------------------------------
213 // Test vectors:http://www.zvon.org/tmRFC/RFC3686/Output/chapter6.html
214 // http://www.cs.utsa.edu/~wagner/laws/AEStestRuns.html
215 // http://www.ietf.org/rfc/rfc3686.txt
216
217 {
218 //
219 // http://www.cs.utsa.edu/~wagner/laws/AEStestRuns.html
220 //
221 var key;
222 var plainText;
223 var cipherText;
224 var result;
225
226 //
227 //256-bit key size
228 //
229
230 //Gladman's Test Data, 256-bit key - encrypt
231 key = new Clipperz.ByteArray("0x2b7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a784d9045190cfe", 16);
232 plainText = new Clipperz.ByteArray("0x3243f6a8885a308d313198a2e0370734", 16);
233 cipherText = new Clipperz.ByteArray("0x1a6e6c2c662e7da6501ffb62bc9e93f3", 16);
234
235 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues()));
236 is(result.toHexString(), cipherText.toHexString(), "Gladman's Test Data, 256-bit key - encrypt");
237
238 //AES Specification Test Data, 256-bit key - encrypt
239 key = new Clipperz.ByteArray("0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 16);
240 plainText = new Clipperz.ByteArray("0x00112233445566778899aabbccddeeff", 16);
241 cipherText = new Clipperz.ByteArray("0x8ea2b7ca516745bfeafc49904b496089", 16);
242
243 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues()));
244 is(result.toHexString(), cipherText.toHexString(), "AES Specification Test Data, 256-bit key - encrypt");
245
246 //
247 //128-bit key size
248 //
249
250 //Gladman's Test Data, 128-bit key - encrypt
251 key = new Clipperz.ByteArray("0x2b7e151628aed2a6abf7158809cf4f3c", 16);
252 plainText = new Clipperz.ByteArray("0x3243f6a8885a308d313198a2e0370734", 16);
253 cipherText = new Clipperz.ByteArray("0x3925841d02dc09fbdc118597196a0b32", 16);
254
255 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues()));
256 is(result.toHexString(), cipherText.toHexString(), "Gladman's Test Data, 128-bit key - encrypt");
257
258 //AES Specification Test Data, 128-bit key - encrypt
259 key = new Clipperz.ByteArray("0x000102030405060708090a0b0c0d0e0f", 16);
260 plainText = new Clipperz.ByteArray("0x00112233445566778899aabbccddeeff", 16);
261 cipherText = new Clipperz.ByteArray("0x69c4e0d86a7b0430d8cdb78070b4c55a", 16);
262
263 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues()));
264 is(result.toHexString(), cipherText.toHexString(), "AES Specification Test Data, 128-bit key - encrypt");
265
266 }
267
268
269 endTime = new Date();
270 MochiKit.Logging.logDebug("elapsed time: " + (endTime - startTime));
271
272//#############################################################################
273
274} catch (err) {
275
276 var s = "test suite failure!\n";
277 var o = {};
278 var k = null;
279 for (k in err) {
280 // ensure unique keys?!
281 if (!o[k]) {
282 s += k + ": " + err[k] + "\n";
283 o[k] = err[k];
284 }
285 }
286 ok ( false, s );
287}
288
289</script>
290</pre>
291</body>
292</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
new file mode 100644
index 0000000..0d1cf07
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
@@ -0,0 +1,344 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Crypto.AES_performance - TEST</title>
32
33 <script>
34 jslog_config_enabled = true;
35 </script>
36
37 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
38 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
39 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
40 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
41
42 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
49
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
58
59</head>
60<body>
61<pre id="test">
62<script type="text/javascript">
63Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
64
65try {
66
67 var password;
68 varplainText;
69 varencryptedText;
70 var decryptedText;
71 /*
72 password = "trustno1";
73 plainText = "The quick brown fox jumps over the lazy dog";
74//console.profile("encrypt");
75 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText);
76//console.profileEnd();
77//console.profile("decrypt");
78 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText);
79//console.profileEnd();
80 is(decryptedText, plainText, "simple string encrypted/decrypted");
81*/
82
83 password = "L7bd9fQMhborMbYcHtlr";
84 plainText = {"records":{"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6":{"label":"imap4all [no]", "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", "notes":""}, "c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99":{"label":"Il manifesto", "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", "notes":""}, "70d536c89a86b1aa9e077d6f9c717306a5d6c8d5549789e42dfb4f981484f116":{"label":"OmniGroup applications", "key":"7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", "notes":"url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"}, "111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f":{"label":"R@cine", "key":"57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", "notes":""}, "378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df":{"label":"NewsGator", "key":"6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", "notes":""}, "30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e":{"label":"GMail - giulio.cesare", "key":"0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", "notes":""}, "b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0":{"label":"GMail - clipperz.com", "key":"90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", "notes":""}, "6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284":{"label":"Aruba - hosting", "key":"5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47", "notes":""}, "741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700":{"label":"Aruba - sql hosting", "key":"f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc", "notes":""}, "1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48":{"label":"Amazon", "key":"1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1", "notes":""}, "d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4":{"label":"YouTube [no]", "key":"4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648", "notes":""}, "5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc":{"label":"DynDns - gcsolaroli", "key":"f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467", "notes":""}, "73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495":{"label":"DynDns - clipperz", "key":"d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d", "notes":""}, "48d4c0546c032be26ecce4da41e020129afa7fc34cfe164ea72e1c9953d2e6bb":{"label":"Bol.it", "key":"cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7", "notes":""}, "d62d420db34720ccc054df06b88725ea79020ffa9389ca15e70137fb4dfd0883":{"label":"Freenigma - clipperz.com", "key":"f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e", "notes":""}, "ccd44ae294e7694ea53009c7198506cc0fe3121ad5d9fe2635d247e2afdab2ae":{"label":"Freenigma", "key":"4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7", "notes":""}, "bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2":{"label":"clipperz.com - blog", "key":"9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003", "notes":""}, "c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f":{"label":"Apple", "key":"75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f", "notes":""}, "b5bd38d8eb5e23b1354884cc519e05580864fadf74d0a19d2c691cd0c7054d77":{"label":".mac", "key":"5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe", "notes":""}, "ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380":{"label":"3nity", "key":"33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f", "notes":""}, "7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552":{"label":"ACM", "key":"b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a", "notes":""}, "b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020":{"label":"Adobe", "key":"d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa", "notes":""}, "befc571e9cda1a7dfb1d15200240ca5170386280ee7be6a12716904cb6d0ea44":{"label":"Adobe Photoshop Elements 3", "key":"18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428", "notes":"Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837"}, "0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7":{"label":"Agatra", "key":"c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23", "notes":""}, "e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935":{"label":"AIM", "key":"8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff", "notes":""}, "de890eb76a4b0cabd4ffd490adad1ff1b73238c7b5ee6dde1a2aeab2d03ebe93":{"label":"Anna Vespignani", "key":"79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a", "notes":""}, "0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21":{"label":"Bloglines", "key":"fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec", "notes":""}, "85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b":{"label":"Bow.it", "key":"64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc", "notes":""}, "60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811":{"label":"GMail - feedback", "key":"fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef", "notes":""}, "257ac2da79ee1cd46dfa214d91f5ece213b6bbade28d1ee71495c81a3d7e033a":{"label":"Fineco", "key":"8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3", "notes":""}, "78261622810232b6da5efcd52b1c9b0bd87c62517bf4df25323ca6a0b49d84ec":{"label":"mon.itor.us", "key":"d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2", "notes":""}, "4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11":{"label":"Lamba Probe - forum", "key":"f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f", "notes":""}, "78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941":{"label":"MeasureMap", "key":"2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e", "notes":""}, "4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc":{"label":"NGI - Squillo", "key":"96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3", "notes":""}, "eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143":{"label":"NGI - F5", "key":"00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59", "notes":""}, "19654392222206d60547073209672dde1c743ea371ddc20a2bd8254e561a4ec0":{"label":"CVSdude", "key":"ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02", "notes":""}, "6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993":{"label":"Yahoo", "key":"6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e", "notes":"note"}}, "directLogins":{"eac496e0b1ec75ea403f821fedc7f51f98dac639713ebe577f969f607a8943f5":{"record":"111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f", "label":"R@cine - WebMail", "favicon":"http://www.racine.ra.it/favicon.ico"}, "ef564a022630d4395a9ecac854f3b127b3518cec362323ccc605079c0749c152":{"record":"1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48", "label":"Amazon sign in", "favicon":"http://www.amazon.com/favicon.ico"}, "4f14b88a4055ff23a00d625382650888ce9284fe869304775e43e3e33ee5bbb6":{"record":"6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284", "label":"Aruba - hosting", "favicon":"http://hosting.aruba.it/favicon.ico"}, "e94c0d12d1db0badc31a8bbbbc4b08d2065a39f458462bbff9756f7b5eb7fedf":{"record":"741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700", "label":"Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico"}, "7299249153ef93a44e2f248ca3a73badde56e71d70919bb5637093c2abbe2c9a":{"record":"bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico"}, "66876dbae68778d4c104bc12f01adcb21d47d9eace8db30ef95f74f461afcb59":{"record":"73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico"}, "a60c65030a1797abde3e2089c3e5de9648f66bf71cebf0b58c26e729ad8d6a45":{"record":"5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico"}, "08d6c5dff9fed4a2f237c32dd0a93ac46b2c45370d07f56fa76064be3b8fecbf":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico"}, "9e75e12f0f52f248cc7ae517869dd7b02303037d32d9fb4fa0ab0e013923c304":{"record":"c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico"}, "935bf9553fbcb85b8bd5b98c6901d7cccb2566b395f192cbea71e7822979aaf2":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico"}, "9504205ec29b89e6ccd0f3afc7a447d8891da0c71a0222f1860f98a8f8bc6677":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico"}, "3d8dd32d2290ca98789c914580ac2436ece97234217a07d752726d2ac48a4ebf":{"record":"d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico"}, "7c4b6b5a16984c43ed6d99b04ddfa7e00b624de729ec8aaa3d0f539fb67587e2":{"record":"c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico"}, "0b9a98262b50f0ebae5af077467bc627619738873690238fd61093ce9922c9f9":{"record":"ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico"}, "aadeb3388629cfc3b15954f26cf284f52e084191dcdf75752dc4c53d2006c5be":{"record":"7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico"}, "3d21c71f2e284ec76f1ae0bb990b683979918f758635bb7d008150f4d7b1447d":{"record":"b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico"}, "e61a331c998804d46044d4c2acaf96c2fce806f6549e1e16c7d2334872a70953":{"record":"0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico"}, "9bcd99564fda778061246439fa098dcc79de75b16c542f61e6de7d36dbaf97dc":{"record":"e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico"}, "c7093f4663c6e0eba941c557cb86da83fc68cbea36c922e168d0867e6cabe9fe":{"record":"0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico"}, "915f2e9460f6e54c6137f3876f9179fc8d2162c59f26e12899c2db6b0e70a68f":{"record":"85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico"}, "779701af1beb2a91735ba1a2e471b948f0d985bb0df256f5e089291ce3405bd2":{"record":"b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico"}, "1c300539a98c874d52134b6b5a591172acc00c0947692f3da284447f7d511eaf":{"record":"60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico"}, "f9dccdf7a98735fd7a6b5d04c09177005c0de14f8f92b04007f06a281ecdf31e":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico"}, "48497a89f3bfd567758977e1c32b4497d28c843880667ee52fa4cfcb53c5f9e4":{"record":"378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico"}, "134cd28f150df4f2a089f4807bb7a35fb7ece22ec41244f72e63f8b43637a4cd":{"record":"4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico"}, "2ab6106a81513b70f1ba0d7c5c3ef54fa6f4bcadf01d2eeaa2b31b9299551398":{"record":"78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico"}, "53ccdc41b43da9b018847f9faa8effb35e7a6c6e78a54e9ee7816fc02f0ea63b":{"record":"4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico"}, "ca520e7081fba1df3ef79c3d00266cffc8e4567def29d67ae812b7ed6283fb12":{"record":"eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico"}, "80e63e135d7abd2b2990f42af4f8d1f8e8b1146aed44dc36975061fbf360a983":{"record":"6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"}}, "preferences":{"preferredLanguage":"en-US"}};
85/* */
86 plainText = {
87 "records": {
88 "1": {
89 "label":"imap4all [no]",
90 "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd",
91 "notes":""
92 },
93 "2": {
94 "label":"Il manifesto",
95 "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c",
96 "notes":""
97 },
98 "3": {
99 "label": "OmniGroup applications",
100 "key": "7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c",
101 "notes": "url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"
102 },
103 "4": {
104 "label": "R@cine",
105 "key": "57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6",
106 "notes": ""
107 },
108 "5": {
109 "label": "NewsGator",
110 "key": "6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a",
111 "notes": ""
112 },
113 "6": {
114 "label": "GMail - giulio.cesare",
115 "key": "0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a",
116 "notes": ""
117 },
118 "7": {
119 "label": "GMail - clipperz.com",
120 "key": "90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f",
121 "notes": ""
122 },
123 "8": {
124 "label": "Aruba - hosting",
125 "key": "5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47",
126 "notes": ""
127 },
128 "9": {
129 "label": "Aruba - sql hosting",
130 "key": "f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc",
131 "notes": ""
132 },
133 "10": {
134 "label": "Amazon",
135 "key": "1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1",
136 "notes": ""
137 },
138 "11": {
139 "label": "YouTube [no]",
140 "key": "4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648",
141 "notes": ""
142 },
143 "12": {
144 "label": "DynDns - gcsolaroli",
145 "key": "f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467",
146 "notes": ""
147 },
148 "13": {
149 "label": "DynDns - clipperz",
150 "key": "d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d",
151 "notes": ""
152 },
153 "14": {
154 "label": "Bol.it",
155 "key": "cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7",
156 "notes": ""
157 },
158 "15": {
159 "label": "Freenigma - clipperz.com",
160 "key": "f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e",
161 "notes": ""
162 },
163 "16": {
164 "label": "Freenigma",
165 "key": "4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7",
166 "notes": ""
167 },
168 "17": {
169 "label": "clipperz.com - blog",
170 "key": "9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003",
171 "notes": ""
172 },
173 "18": {
174 "label": "Apple",
175 "key": "75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f",
176 "notes": ""
177 },
178 "19": {
179 "label": ".mac",
180 "key": "5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe",
181 "notes": ""
182 },
183 "20": {
184 "label": "3nity",
185 "key": "33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f",
186 "notes": ""
187 },
188 "21": {
189 "label": "ACM",
190 "key": "b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a",
191 "notes": ""
192 },
193 "22": {
194 "label": "Adobe",
195 "key": "d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa",
196 "notes": ""
197 },
198 "23": {
199 "label": "Adobe Photoshop Elements 3",
200 "key": "18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428",
201 "notes": "Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837"
202 },
203 "24": {
204 "label": "Agatra",
205 "key": "c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23",
206 "notes": ""
207 },
208 "25": {
209 "label": "AIM",
210 "key": "8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff",
211 "notes": ""
212 },
213 "26": {
214 "label": "Anna Vespignani",
215 "key": "79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a",
216 "notes": ""
217 },
218 "27": {
219 "label": "Bloglines",
220 "key": "fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec",
221 "notes": ""
222 },
223 "28": {
224 "label": "Bow.it",
225 "key": "64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc",
226 "notes": ""
227 },
228 "29": {
229 "label": "GMail - feedback",
230 "key": "fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef",
231 "notes": ""
232 },
233 "30": {
234 "label": "Fineco",
235 "key": "8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3",
236 "notes": ""
237 },
238 "31": {
239 "label": "mon.itor.us",
240 "key": "d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2",
241 "notes": ""
242 },
243 "32": {
244 "label": "Lamba Probe - forum",
245 "key": "f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f",
246 "notes": ""
247 },
248 "33": {
249 "label": "MeasureMap",
250 "key": "2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e",
251 "notes": ""
252 },
253 "34": {
254 "label": "NGI - Squillo",
255 "key": "96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3",
256 "notes": ""
257 },
258 "35": {
259 "label": "NGI - F5",
260 "key": "00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59",
261 "notes": ""
262 },
263 "36": {
264 "label": "CVSdude",
265 "key": "ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02",
266 "notes": ""
267 },
268 "37": {
269 "label": "Yahoo",
270 "key": "6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e",
271 "notes": "note"
272 }
273 },
274 "directLogins": {
275 "1": { "record": "1", "label": "R@cine - WebMail", "favicon": "http://www.racine.ra.it/favicon.ico" },
276 "2": { "record": "2", "label": "Amazon sign in", "favicon": "http://www.amazon.com/favicon.ico" },
277 "3": { "record": "3", "label": "Aruba - hosting", "favicon": "http://hosting.aruba.it/favicon.ico" },
278 "4": { "record": "4", "label": "Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico" },
279 "5": { "record": "5", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico" },
280 "6": { "record":"6", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico" },
281 "7": { "record":"7", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico" },
282 "8":{"record":"8", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico" },
283 "9":{"record":"9", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico" },
284 "10":{"record":"10", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico" },
285 "11":{"record":"12", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico" },
286 "13":{"record":"13", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico" },
287 "14":{"record":"14", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico" },
288 "15":{"record":"15", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico" },
289 "16":{"record":"16", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico" },
290 "17":{"record":"17", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico" },
291 "18":{"record":"18", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico" },
292 "19":{"record":"19", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico" },
293 "20":{"record":"20", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico" },
294 "21":{"record":"21", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico" },
295 "22":{"record":"22", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico" },
296 "23":{"record":"23", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico" },
297 "24":{"record":"24", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico" },
298 "25":{"record":"25", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico" },
299 "26":{"record":"26", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico" },
300 "27":{"record":"27", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico" },
301 "28":{"record":"28", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico" },
302 "29":{"record":"29", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico" },
303 "30":{"record":"30", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"}
304 },
305 "preferences":{"preferredLanguage":"en-US"}
306 }
307/* */
308
309//console.profile("encrypt 0.2");
310 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText);
311//console.profileEnd();
312//console.profile("decrypt");
313 //decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText);
314//console.profileEnd();
315 //is(MochiKit.Base.serializeJSON(decryptedText), MochiKit.Base.serializeJSON(plainText), "complex structure encrypted/decrypted");
316
317//console.profile("encrypt 0.3");
318 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(password, plainText);
319//console.profileEnd();
320 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(password, encryptedText);
321 is(MochiKit.Base.serializeJSON(decryptedText), MochiKit.Base.serializeJSON(plainText), "complex structure encrypted/decrypted");
322
323
324//#############################################################################
325
326} catch (err) {
327
328 var s = "test suite failure!\n";
329 var o = {};
330 var k = null;
331 for (k in err) {
332 // ensure unique keys?!
333 if (!o[k]) {
334 s += k + ": " + err[k] + "\n";
335 o[k] = err[k];
336 }
337 }
338 ok ( false, s );
339}
340
341</script>
342</pre>
343</body>
344</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
new file mode 100644
index 0000000..86fc49a
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
@@ -0,0 +1,428 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
39
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
44
45</head>
46<body>
47<pre id="test">
48<script type="text/javascript">
49try {
50 var secretKey;
51 varpublicKey;
52 varplainString;
53 varencryptedString;
54
55
56 secretKey = "s3cr37k39";
57 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog";
58 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
59
60 //-------------------------------------------------------------------------
61 //
62 //Secret key encryption / decryption
63 //
64 is (isUndefinedOrNull(encryptedString), false, "An encrypted string should not be empty");
65 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
66
67 try {
68 vardecryptedText;
69
70 decryptedText = Clipperz.Crypto.Base.decryptUsingSecretKey("anotherKey", encryptedString);
71 ok( false, "It should not be possible to decrypt a text with a different passphrase (decrypted text: " + decryptedText + ")" );
72 } catch (e) {
73 ok( e instanceof Error, "Trying to decrypt a message with the wrong passphrase raised an error" );
74 }
75
76 is (encryptedString == Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString), false, "Two consecutive encryption of the same text should return different values");
77
78 secretKey = "trustno1";
79 plainString = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1";
80 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
81 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
82
83 secretKey = "trustno1";
84 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.";
85 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
86 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
87
88 secretKey = "trustno1";
89 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas./n/n/nMorbi vel leo non justo condimentum convallis. Vestibulum posuere aliquam nunc. Donec magna magna, euismod nec, pharetra fringilla, tristique mattis, turpis. Duis condimentum lacus eu felis. Sed ultricies. Nullam lacinia ante id diam. Ut quis enim. Fusce at felis quis neque vehicula tempor. Sed feugiat sodales sem. Duis cursus massa in ligula. Vestibulum volutpat, risus in ornare porta, tortor orci vestibulum felis, et eleifend risus odio nec eros. Integer lorem turpis, imperdiet eu, tempor eu, ultricies nec, est. Ut congue. Morbi lacinia vehicula pede. Cras neque sapien, feugiat ac, eleifend eget, mattis et, nisl. Morbi at augue vitae massa laoreet gravida./n/n/nSuspendisse vehicula convallis sem. Sed vel urna. Proin dolor diam, malesuada in, aliquet a, sagittis et, magna. Cras at dui eu mi porta fermentum. Donec pharetra purus sed velit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque euismod ornare neque. In odio nisi, bibendum non, vulputate ut, tincidunt a, ante. Sed risus arcu, tempus laoreet, euismod id, laoreet mollis, arcu. Ut tempor orci in nibh. Suspendisse potenti. Maecenas accumsan augue at nisl. Donec elementum diam nec metus. Sed vitae lacus sed libero varius semper. Aenean hendrerit tristique arcu. Praesent adipiscing ornare purus. Vestibulum quis eros nec risus accumsan laoreet. Duis consequat ante ut turpis. Curabitur aliquam suscipit ligula. Vivamus adipiscing./n/n/nCurabitur facilisis neque sit amet erat. Aliquam odio augue, vulputate lobortis, rutrum ut, tristique id, leo. Vivamus eu magna. Maecenas et libero. Integer porta, lorem at mollis ullamcorper, purus metus vestibulum erat, ut fringilla dui ante id mi. Morbi vitae ligula. Praesent ornare sapien sed massa. Mauris rhoncus fermentum dolor. Mauris gravida, justo et mollis malesuada, dolor erat fermentum nulla, vel suscipit leo ligula vel augue. Praesent magna enim, dignissim sed, aliquet quis, fermentum viverra, nisi. Vivamus condimentum, nisi quis posuere viverra, enim nunc faucibus lectus, mollis aliquam ipsum enim vel lacus. Suspendisse eget ligula. Aliquam ut metus et justo consectetuer ornare. Donec dapibus tristique pede. Vestibulum interdum ultricies tortor./n/n/nNunc nonummy dictum tortor. Quisque at elit a arcu nonummy elementum. Quisque auctor, risus et sodales euismod, turpis tellus consectetuer ante, quis egestas justo enim quis mi. Nunc fermentum sodales felis. Vivamus odio mi, dignissim vitae, auctor nec, tempus eget, lacus. Ut sapien massa, hendrerit eget, sagittis at, eleifend condimentum, arcu. Curabitur purus orci, facilisis vel, dapibus id, varius rutrum, tortor. Fusce accumsan viverra sem. Quisque tincidunt venenatis risus. Sed tortor justo, volutpat malesuada, sodales ut, vehicula id, magna. Nunc placerat, nibh et imperdiet ultricies, urna nulla luctus sapien, et porta mi odio ac neque. Morbi dignissim. Sed risus pede, adipiscing gravida, pharetra sit amet, convallis non, orci. Morbi adipiscing mauris id massa. Nullam fermentum. Suspendisse eget est";
90 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
91 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
92
93 //secretKey = "trustno1";
94 //plainString = "{}";
95 // plainString = "{'tags': {'personal': ['ref_1', 'ref_3'], 'business': ['ref_2', 'ref_3']}, 'records': {'ref_1': {'label': 'record_1', 'key': 'key_1'}, 'ref_2': {'label': 'record_2', 'key': 'key_2'}, 'ref_3': {'label': 'record_3', 'key': 'key_3'}}}";
96 //plainString = "{'tags': {}, 'records': {'07a5a92fcb334f757998ba14f3251f126d038318b3ac5e584bd712804c548084': {'label': 'Un bel record', 'key': '2a3f261c20a6a98dcc82b13fba013130b759f20602b4b13c5760879e087482a4'}}}";
97 //encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
98 //is(encryptedString, "{}", "encrypted value");
99
100
101 //secretKey = "trustno1";
102 //encryptedString = "0d43a4544424ffa519f2e43b7a46f703884fd94ff9879479563f6f252a573b253d3e77bc4f5f30f17bd11d2907718921ab8c9e1faccbe4314793fa323eb85eaf1bfbce5f7deea601e15b781782181cbff3c649dafef39abb70e8573e4f9be220f2286b01c3bd51d5c4a79b9d44a27be3b0994667302e301ca3dc074fb1bc7abc03d12b9e58ba0249435a120858c96e8ae99570718541499ab958a8fb92b63390be070ff61fc6ef107061693ab14c1915118cc6671ab7cf99b9cca553d6b5a7c314bffcd933e0a59f056d842a47cfe8571110b4764c5225443210d99b43b80a23c20fe953de3e1329d72cfb20139fe1ca";
103 //plainString = Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString);
104 //is(plainString, "{}", "decrypted value");
105
106 //-------------------------------------------------------------------------
107 //
108 //Java secret key encryption / JavaScript decryption
109 //
110 secretKey = "s3cr37k39";
111 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog";
112 encryptedString = "9be538c3dde4dfab9384c0ef71dc624299fbbe71be8d1fe8991fd6cae88a883cf459d7cd56913a2b69815782cf74d7ce5c2c08034661f7f8aa59cf420e913086896840ebb45102d44d733d32de2a7dc8";
113 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
114
115 //-------------------------------------------------------------------------
116 //
117 //Public key encryption -> Private key decryption
118 //
119 {
120 varcleanKey;
121 vart1, t2;
122/*
123 //
124 // 128
125 //
126 cleanKey = "248d6a61d20638b8e5c026930c3e6039"; //a33ce45964ff2167f6ecedd419db06c1";
127 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
128 "10001",
129 "202700adbd85e2d7182720c3a0ee19c1",
130 "30db31542ace0f7d37a629ee5eba28cb"
131 );
132 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
133
134 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 128");
135 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 128");
136 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 128");
137*/
138/*
139 //
140 // 256
141 //
142 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
143 cleanKey = "a3c2863242653caf566b02d8be5d6eb6c816ac212378bcec7ff2bdce8e2ec709";
144 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
145 "10001",
146 "8064edb1f26944f6bec2b68789db7ffd08b074d0953b76feca71dc8265c60e9",
147 "2687f5ac6c70f9cab32fcbded7059502f4c7cc95fc3e09a560c68975ac4bf5e3"
148 );
149 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
150
151 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 256");
152 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 256");
153 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 256");
154*/
155/*
156 //
157 //512
158 //
159 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
160 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
161 "10001",
162 "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1",
163 "8de7066f67be16fcacd05d319b6729cd85fe698c07cec504776146eb7a041d9e3cacbf0fcd86441981c0083eed1f8f1b18393f0b186e47ce1b7b4981417b491"
164 );
165t1 = new Date().getTime();
166 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
167t2 = new Date().getTime();
168//is("Encrypting with public key (512)", (t2 - t1));
169
170 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 512");
171t1 = new Date().getTime();
172 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 512");
173t2 = new Date().getTime();
174//is("Decrypting with private key (512)", (t2 - t1));
175 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 512");
176*/
177/*
178 //
179 //1024
180 //
181 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
182 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
183 "10001",
184 "12e8da920d4599458e84ec5ef1656161807f427d05eb79182b7418259d6f6c14364d1f5caf9130c8d9d9d6ea71d1bdbc87781a46a16bcb9e672814fed3b9c96ddffe0a1b0955ae68055c8f92fef518a04fc32a2ea8390e617cc5556a251f9ae9eee70a32e579cb3e9f298848a9b3aaf634f5930ffbf74473f7cb6c0cefee1751",
185 "130ebebd67b16a9ab2c53a437badbf8f01a80c750095a7fcfe95742c3d5ed1abb318babc5cb5d9350fee4da65ee074f65e1758117e6945f0fcfc8137528053ce9d1da8618890dee24e5e0bf8c87795bb1d09eddd544640824ee0dd0ea9fd908d27b0f8a1ae5c37f3647fbf2f5795500ad76c195b3387d0458a8f51b701472301"
186 );
187t1 = new Date().getTime();
188 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
189t2 = new Date().getTime();
190is("Encrypting with public key (1024)", (t2 - t1));
191
192 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 1024");
193t1 = new Date().getTime();
194 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 1024");
195t2 = new Date().getTime();
196is("Decrypting with private key (1024)", (t2 - t1));
197 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 1024");
198*/
199/*
200 //
201 //2048
202 //
203 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
204 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
205 "10001",
206 "409c6fe2b6474762b5c07f4e55ef80d174814dc1fb0fb58e979691116fb3dc433f759ff8a88d1a0f0666862b0b3758c54b7355fa87ee827369381e1f97c5d74944e032c7186b51a956fb49d6deb3aee0b2c7e65fc53bfd46d217764850667ed0363de143f3f3d06d5a0018693ad3dacdf78a18d037ceeccb7508776f27b30852b8b505666a8dca5bfbb455d2f85918f8b5295061c97673c78802c5f5cf4581c7215dc32af8dfb6fc10e9ba51fb5a88abab94157ccecf615e104a91a45e9bee072fe7b388344c1bbad4a8f7d5daeccbadf778d59eff2a491a067bba5343c5a094c61b575fe367ecfcc01c3d208c2f8c05b9496a929b2b72e70160d07d07f248f1",
207 "9800012b1e533c2c28187424e1289fd4f7fe67487058f5ac7f27f18476c6c93db20b6d2c63d04ff310c1e7211cf8014adc006176529abc53fd1780274fc2629cf51d627c7465c3cbf4f110c3560e2128b97c4ea8a431f0b2a326fc31899790515ad45874ca75c68ee6695558736490ea895d598b8525bccab3156104d360b115ae25e99e9d899a2219136bad0336eeee0c6d725aa9c3b6b923c1ad95a9057b9deb7b563e05614acc800d9d8ec5de405d74feea722c5146feb80829508180ab5c80bf792b83f07c04c73ce0b3cf0d9f74aa92a4704819d103e58f5d4b8ca750148ba1cbab8eb55f92775b18da427c3a0b592809f3853274841a44b7129ec6a623"
208 );
209t1 = new Date().getTime();
210 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
211t2 = new Date().getTime();
212is("Encrypting with public key (2048)", (t2 - t1));
213
214 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 2048");
215t1 = new Date().getTime();
216 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 2048");
217t2 = new Date().getTime();
218is("Decrypting with private key (2048)", (t2 - t1));
219 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 2048");
220*/
221 }
222
223 //-------------------------------------------------------------------------
224 //
225 //Private key encryption -> Public key decryption
226 //
227 {
228 varcleanKey;
229 vart1, t2;
230/*
231 //
232 // 128
233 //
234 cleanKey = "248d6a61d20638b8e5c026930c3e6039"; //a33ce45964ff2167f6ecedd419db06c1";
235 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
236 "10001",
237 "202700adbd85e2d7182720c3a0ee19c1",
238 "30db31542ace0f7d37a629ee5eba28cb"
239 );
240 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
241
242 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 128");
243 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 128");
244 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again the private key - PRIVATE 128");
245*/
246/*
247 //
248 // 256
249 //
250 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
251 cleanKey = "a3c2863242653caf566b02d8be5d6eb6c816ac212378bcec7ff2bdce8e2ec709";
252 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
253 "10001",
254 "8064edb1f26944f6bec2b68789db7ffd08b074d0953b76feca71dc8265c60e9",
255 "2687f5ac6c70f9cab32fcbded7059502f4c7cc95fc3e09a560c68975ac4bf5e3"
256 );
257 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
258
259 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 256");
260 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 256");
261 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again the private key - PRIVATE 256");
262*/
263/*
264 //
265 //512
266 //
267 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
268 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
269 "10001",
270 "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1",
271 "8de7066f67be16fcacd05d319b6729cd85fe698c07cec504776146eb7a041d9e3cacbf0fcd86441981c0083eed1f8f1b18393f0b186e47ce1b7b4981417b491"
272 );
273t1 = new Date().getTime();
274 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
275t2 = new Date().getTime();
276//is("Encrypting with private key (512)", (t2 - t1));
277
278 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 512");
279t1 = new Date().getTime();
280 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 512");
281t2 = new Date().getTime();
282//is("Decrypting with public key (512)", (t2 - t1));
283 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 512");
284*/
285/*
286 //
287 //1024
288 //
289 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
290 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
291 "10001",
292 "12e8da920d4599458e84ec5ef1656161807f427d05eb79182b7418259d6f6c14364d1f5caf9130c8d9d9d6ea71d1bdbc87781a46a16bcb9e672814fed3b9c96ddffe0a1b0955ae68055c8f92fef518a04fc32a2ea8390e617cc5556a251f9ae9eee70a32e579cb3e9f298848a9b3aaf634f5930ffbf74473f7cb6c0cefee1751",
293 "130ebebd67b16a9ab2c53a437badbf8f01a80c750095a7fcfe95742c3d5ed1abb318babc5cb5d9350fee4da65ee074f65e1758117e6945f0fcfc8137528053ce9d1da8618890dee24e5e0bf8c87795bb1d09eddd544640824ee0dd0ea9fd908d27b0f8a1ae5c37f3647fbf2f5795500ad76c195b3387d0458a8f51b701472301"
294 );
295t1 = new Date().getTime();
296 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
297t2 = new Date().getTime();
298is("Encrypting with private key (1024)", (t2 - t1));
299
300 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 1024");
301t1 = new Date().getTime();
302 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 1024");
303t2 = new Date().getTime();
304is("Decrypting with public key (1024)", (t2 - t1));
305 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 1024");
306*/
307/*
308 //
309 //2048
310 //
311 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
312 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
313 "10001",
314 "409c6fe2b6474762b5c07f4e55ef80d174814dc1fb0fb58e979691116fb3dc433f759ff8a88d1a0f0666862b0b3758c54b7355fa87ee827369381e1f97c5d74944e032c7186b51a956fb49d6deb3aee0b2c7e65fc53bfd46d217764850667ed0363de143f3f3d06d5a0018693ad3dacdf78a18d037ceeccb7508776f27b30852b8b505666a8dca5bfbb455d2f85918f8b5295061c97673c78802c5f5cf4581c7215dc32af8dfb6fc10e9ba51fb5a88abab94157ccecf615e104a91a45e9bee072fe7b388344c1bbad4a8f7d5daeccbadf778d59eff2a491a067bba5343c5a094c61b575fe367ecfcc01c3d208c2f8c05b9496a929b2b72e70160d07d07f248f1",
315 "9800012b1e533c2c28187424e1289fd4f7fe67487058f5ac7f27f18476c6c93db20b6d2c63d04ff310c1e7211cf8014adc006176529abc53fd1780274fc2629cf51d627c7465c3cbf4f110c3560e2128b97c4ea8a431f0b2a326fc31899790515ad45874ca75c68ee6695558736490ea895d598b8525bccab3156104d360b115ae25e99e9d899a2219136bad0336eeee0c6d725aa9c3b6b923c1ad95a9057b9deb7b563e05614acc800d9d8ec5de405d74feea722c5146feb80829508180ab5c80bf792b83f07c04c73ce0b3cf0d9f74aa92a4704819d103e58f5d4b8ca750148ba1cbab8eb55f92775b18da427c3a0b592809f3853274841a44b7129ec6a623"
316 );
317t1 = new Date().getTime();
318 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
319t2 = new Date().getTime();
320is("Encrypting with private key (2048)", (t2 - t1));
321
322 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 2048");
323t1 = new Date().getTime();
324 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 2048");
325t2 = new Date().getTime();
326is("Decrypting with public key (2048)", (t2 - t1));
327 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 2048");
328*/
329 }
330
331 varoriginalMessage;
332 varprocessedMessage;
333 var expectedResult;
334
335 //-------------------------------------------------------------------------
336 //
337 // HashSHA-256
338 //
339
340 originalMessage = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
341 expectedResult = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
342 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
343 is(processedMessage, expectedResult, "");
344
345 originalMessage = "";
346 expectedResult = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
347 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
348 is(processedMessage, expectedResult, "");
349
350 originalMessage = "abc";
351 expectedResult = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad";
352 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
353 is(processedMessage, expectedResult, "");
354
355 originalMessage = "message digest";
356 expectedResult = "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650";
357 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
358 is(processedMessage, expectedResult, "");
359
360 originalMessage = "secure hash algorithm";
361 expectedResult = "f30ceb2bb2829e79e4ca9753d35a8ecc00262d164cc077080295381cbd643f0d";
362 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
363 is(processedMessage, expectedResult, "");
364
365 originalMessage = "SHA256 is considered to be safe";
366 expectedResult = "6819d915c73f4d1e77e4e1b52d1fa0f9cf9beaead3939f15874bd988e2a23630";
367 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
368 is(processedMessage, expectedResult, "");
369
370 originalMessage = "For this sample, this 63-byte string will be used as input data";
371 expectedResult = "f08a78cbbaee082b052ae0708f32fa1e50c5c421aa772ba5dbb406a2ea6be342";
372 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
373 is(processedMessage, expectedResult, "");
374
375 originalMessage = "This is exactly 64 bytes long, not counting the terminating byte";
376 expectedResult = "ab64eff7e88e2e46165e29f2bce41826bd4c7b3552f6b382a9e7d3af47c245f8";
377 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
378 is(processedMessage, expectedResult, "");
379
380 originalMessage = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut urna diam, vulputate quis, tempus vel, pretium in, mauris. Mauris aliquet sem a elit. Nunc molestie rutrum sem.";
381 expectedResult = "528059709af4087fb8cd4427e291d89f24d8c0429b2a3b6fd152c32ce5b4680f";
382 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
383 is(processedMessage, expectedResult, "");
384
385 //-------------------------------------------------------------------------
386 //
387 // HashMD5
388 //
389 originalMessage = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da9";
390 expectedResult = "fde790d7da7d0d54a8db4ac500f1bbdb";
391 processedMessage = Clipperz.Crypto.Base.computeMD5HashValue(originalMessage);
392 is(processedMessage, expectedResult, "");
393
394
395
396
397 //-------------------------------------------------------------------------
398 //
399 //Random seed
400 //
401 varrandomSeed;
402
403 randomSeed = Clipperz.Crypto.Base.generateRandomSeed();
404 is(randomSeed.length, 64, "");
405
406 ok(randomSeed != Clipperz.Crypto.Base.generateRandomSeed(), "");
407
408//#############################################################################
409
410} catch (err) {
411
412 var s = "test suite failure!\n";
413 var o = {};
414 var k = null;
415 for (k in err) {
416 // ensure unique keys?!
417 if (!o[k]) {
418 s += k + ": " + err[k] + "\n";
419 o[k] = err[k];
420 }
421 }
422 ok ( false, s );
423}
424
425</script>
426</pre>
427</body>
428</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
new file mode 100644
index 0000000..bdb0cbc
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
@@ -0,0 +1,478 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
44</head>
45<body>
46<pre id="test">
47<script type="text/javascript">
48try {
49 varbigInt_1;
50 varbigInt_2;
51 varresult;
52 varexpectedResult;
53
54 //
55 //Constructur and equality test
56 //
57 bigInt_1 = new Clipperz.Crypto.BigInt("110");
58 is (bigInt_1.equals(bigInt_1), true, "");
59
60 bigInt_1 = new Clipperz.Crypto.BigInt("110");
61 bigInt_2 = new Clipperz.Crypto.BigInt("110", 10);
62 is (bigInt_1.equals(bigInt_2), true, "");
63
64 bigInt_1 = new Clipperz.Crypto.BigInt("110");
65 bigInt_2 = new Clipperz.Crypto.BigInt(110);
66 is (bigInt_1.equals(bigInt_2), true, "");
67
68 bigInt_1 = new Clipperz.Crypto.BigInt(6);
69 bigInt_2 = new Clipperz.Crypto.BigInt("110", 2);
70 is (bigInt_1.equals(bigInt_2), true, "");
71
72 bigInt_1 = new Clipperz.Crypto.BigInt(6);
73 bigInt_2 = new Clipperz.Crypto.BigInt("110", 3);
74 is (bigInt_1.equals(bigInt_2), false, "");
75
76
77 //
78 //Addition test
79 //
80 bigInt_1 = new Clipperz.Crypto.BigInt(6);
81 bigInt_2 = new Clipperz.Crypto.BigInt(110);
82 result = bigInt_1.add(bigInt_2);
83 expectedResult = new Clipperz.Crypto.BigInt(116);
84 is (result.equals(expectedResult), true, "");
85 is (result.equals(Clipperz.Crypto.BigInt.add(bigInt_1, bigInt_2)), true, "instance method === static function");
86
87 bigInt_1 = new Clipperz.Crypto.BigInt(6);
88 result = bigInt_1.add(6);
89 expectedResult = new Clipperz.Crypto.BigInt(12);
90 is (result.equals(expectedResult), true, "");
91
92 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161");
93 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
94 result = bigInt_1.add(bigInt_2);
95 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585858585858585858585858585858585");
96 is (result.equals(expectedResult), true, "");
97
98 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161");
99 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
100 result = bigInt_1.add(bigInt_2);
101 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585851585858585858585858585858585");
102 is (result.equals(expectedResult), false, "");
103
104 bigInt_1 = new Clipperz.Crypto.BigInt("86161616161616161616161616161616161616161616161616161");
105 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
106 result = bigInt_1.add(bigInt_2);
107 expectedResult = new Clipperz.Crypto.BigInt("128585858585858585858585858585858585858585858585858585");
108 is (result.equals(expectedResult), true, "");
109
110 bigInt_1 = new Clipperz.Crypto.BigInt("6541652165410321654063516540621063540654" +
111 "0654065106540654165416521654103216540635" +
112 "1654062106354065406540651065406541");
113 bigInt_2 = new Clipperz.Crypto.BigInt("3046540351035403510354035103510351351351" +
114 "0351350435103213540634132135401351035403" +
115 "5403540354103540");
116 result = bigInt_1.add(bigInt_2);
117 expectedResult = new Clipperz.Crypto.BigInt("6541652165410321657110056891656467051008" +
118 "1005100210054167675767872089206430081269" +
119 "2975416119864419441944191419510081");
120 is (result.equals(expectedResult), true, "");
121
122
123 //
124 //Moltiplication test
125 //
126 bigInt_1 = new Clipperz.Crypto.BigInt(6);
127 bigInt_2 = new Clipperz.Crypto.BigInt(110);
128 result = bigInt_1.multiply(bigInt_2);
129 expectedResult = new Clipperz.Crypto.BigInt(660);
130 is (result.equals(expectedResult), true, "");
131
132 bigInt_1 = new Clipperz.Crypto.BigInt(6);
133 result = bigInt_1.multiply(5);
134 expectedResult = new Clipperz.Crypto.BigInt(30);
135 is (result.equals(expectedResult), true, "");
136
137 bigInt_1 = new Clipperz.Crypto.BigInt("5465465165465465132743540354354032135463" +
138 "5435135403513516843052413543054035");
139 bigInt_2 = new Clipperz.Crypto.BigInt("3543513543543213543032135435413054365430" +
140 "5130513540351354354305435403");
141 result = bigInt_1.multiply(bigInt_2);
142 expectedResult = new Clipperz.Crypto.BigInt("1936694983559052629352223965314822970014" +
143 "6364423657014976098029153153101751605574" +
144 "5077086464435601381095664357540911830059" +
145 "9503335163757031001105");
146 is (result.equals(expectedResult), true, "");
147
148 //
149 //Module test
150 //
151 bigInt_1 = new Clipperz.Crypto.BigInt(106);
152 bigInt_2 = new Clipperz.Crypto.BigInt(10);
153 result = bigInt_1.module(bigInt_2);
154 expectedResult = new Clipperz.Crypto.BigInt(6);
155 is (result.equals(expectedResult), true, "");
156
157 bigInt_1 = new Clipperz.Crypto.BigInt(106);
158 result = bigInt_1.module(10);
159 expectedResult = new Clipperz.Crypto.BigInt(6);
160 is (result.equals(expectedResult), true, "");
161
162 bigInt_1 = new Clipperz.Crypto.BigInt("5465465465468468465468463541358438543513" +
163 "8543135435135423545624354235123512531235" +
164 "1356463543840351351305135435121354305413" +
165 "543");
166
167
168 bigInt_2 = new Clipperz.Crypto.BigInt("3543543213543213540543545463542354385768" +
169 "512584354354215");
170 result = bigInt_1.module(bigInt_2);
171 expectedResult = new Clipperz.Crypto.BigInt("52689987206612998786765715819079250963638640081836513");
172 is (result.equals(expectedResult), true, "");
173
174 //
175 //Power (Module) test
176 //
177 bigInt_1 = new Clipperz.Crypto.BigInt(6);
178 bigInt_2 = new Clipperz.Crypto.BigInt(3);
179 result = bigInt_1.powerModule(bigInt_2, new Clipperz.Crypto.BigInt(1000));
180 expectedResult = new Clipperz.Crypto.BigInt(216);
181 is (result.equals(expectedResult), true, "");
182
183 bigInt_1 = new Clipperz.Crypto.BigInt(6);
184 result = bigInt_1.powerModule(3, 1000);
185 expectedResult = new Clipperz.Crypto.BigInt(216);
186 is (result.equals(expectedResult), true, "");
187
188 bigInt_1 = new Clipperz.Crypto.BigInt("354354354354687638546846846846846576876468746846846846");
189 bigInt_2 = new Clipperz.Crypto.BigInt("354");
190 result = bigInt_1.powerModule(bigInt_2, new Clipperz.Crypto.BigInt("3543541354354354354354351354354351354354354354354354"));
191 expectedResult = new Clipperz.Crypto.BigInt("1957028940698171231089373321334263118681605242465644");
192 is (result.equals(expectedResult), true, "");
193
194 bigInt_1 = new Clipperz.Crypto.BigInt("e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", 16);
195 //is(bigInt_1.toString(16), "e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", "IE bug");
196 is(bigInt_1.asString(16), "e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", "fix for IE bug");
197
198
199 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
200 is(bigInt_1.asString(16, 64), "000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "fix to ensure the string representation has a minimum fixed length");
201
202/*
203 //
204 //Comparison
205 //
206 bigInt_1 = new Clipperz.Crypto.BigInt("0", 10);
207 bigInt_2 = new Clipperz.Crypto.BigInt("0", 10);
208 is (bigInt_1.equals(bigInt_2), true, "bigInt(0) = bigInt(0)");
209 is (bigInt_1.equals(0), true, "bigInt(0) = 0");
210
211 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
212 is (bigInt_1.equals(bigInt_2), false, "bigInt(xxxxxx) != bigInt(0)");
213 is (bigInt_1.equals(0), false, "bigInt(xxxxx) != 0");
214
215 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
216 bigInt_2 = new Clipperz.Crypto.BigInt("0", 16);
217 is(bigInt_1.compare(bigInt_2), 1, "bigInt(xxxxxx) > bigInt(0)");
218 is(bigInt_2.compare(bigInt_1), -1, "bigInt(0) < bigInt(xxxx)");
219
220 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
221 bigInt_2 = new Clipperz.Crypto.BigInt("05", 16);
222 is(bigInt_1.compare(bigInt_2), 1, "bigInt(xxxxxx) > bigInt(05)");
223 is(bigInt_2.compare(bigInt_1), -1, "bigInt(05) < bigInt(xxxx)");
224
225 bigInt_1 = new Clipperz.Crypto.BigInt("-10", 10);
226 bigInt_2 = new Clipperz.Crypto.BigInt("10", 10);
227 is(bigInt_1.equals(bigInt_2), true, "bigInt(-10) - bigInt(10). No negative number are managed");
228
229 //
230 //XOR
231 //
232 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
233 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
234 result = bigInt_1.xor(bigInt_2);
235 expectedResult = new Clipperz.Crypto.BigInt(0);
236 is(result.asString(16), expectedResult.asString(16), "a xor a = 0");
237
238 //
239 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
240 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855", 16);
241 result = bigInt_1.xor(bigInt_2);
242 expectedResult = new Clipperz.Crypto.BigInt('295147905179352825856');
243 is(result.asString(16), expectedResult.asString(16), "single bit difference");
244
245 //
246 bigInt_1 = new Clipperz.Crypto.BigInt("01", 16);
247 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855", 16);
248 result = bigInt_1.xor(bigInt_2);
249 expectedResult = new Clipperz.Crypto.BigInt('102987336249554097029535212322581322789799900648198034993674544906295017912404');
250 is(result.asString(16), expectedResult.asString(16), "01 xor value");
251
252 //
253 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
254 bigInt_2 = new Clipperz.Crypto.BigInt("f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
255 result = bigInt_1.xor(bigInt_2);
256 expectedResult = new Clipperz.Crypto.BigInt('7237005577332262213973186563042994240829374041602535252466099000494570602496');
257 is(result.asString(16), expectedResult.asString(16), "first bit difference xor");
258
259
260 //
261 //isBitSet
262 //
263 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16);
264 result = bigInt_1.isBitSet(1);
265 expectedResult = true;
266 is(result, expectedResult, "'ff'.isBitSet(1)");
267
268 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16);
269 result = bigInt_1.isBitSet(1);
270 expectedResult = false;
271 is(result, expectedResult, "'f0'.isBitSet(1)");
272
273 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16);
274 result = bigInt_1.isBitSet(3);
275 expectedResult = false;
276 is(result, expectedResult, "'f0'.isBitSet(3)");
277
278 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16);
279 result = bigInt_1.isBitSet(4);
280 expectedResult = true;
281 is(result, expectedResult, "'f0'.isBitSet(4)");
282
283 bigInt_1 = new Clipperz.Crypto.BigInt("ff00", 16);
284 result = bigInt_1.isBitSet(7);
285 expectedResult = false;
286 is(result, expectedResult, "'ff00'.isBitSet(7)");
287
288 bigInt_1 = new Clipperz.Crypto.BigInt("ff00", 16);
289 result = bigInt_1.isBitSet(8);
290 expectedResult = true;
291 is(result, expectedResult, "'ff00'.isBitSet(8)");
292
293 //
294 bigInt_1 = new Clipperz.Crypto.BigInt("05000000000000", 16);
295 result = bigInt_1.isBitSet(47);
296 expectedResult = false;
297 is(result, expectedResult, "'05000000000000'.isBitSet(47)");
298
299 result = bigInt_1.isBitSet(48);
300 expectedResult = true;
301 is(result, expectedResult, "'05000000000000'.isBitSet(48)");
302
303 result = bigInt_1.isBitSet(49);
304 expectedResult = false;
305 is(result, expectedResult, "'05000000000000'.isBitSet(49)");
306
307 result = bigInt_1.isBitSet(50);
308 expectedResult = true;
309 is(result, expectedResult, "'05000000000000'.isBitSet(50)");
310
311 result = bigInt_1.isBitSet(51);
312 expectedResult = false;
313 is(result, expectedResult, "'05000000000000'.isBitSet(51)");
314
315 //
316 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
317
318 result = bigInt_1.isBitSet(52);
319 expectedResult = true;
320 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(52)");
321
322 result = bigInt_1.isBitSet(53);
323 expectedResult = false;
324 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(53)");
325
326 result = bigInt_1.isBitSet(54);
327 expectedResult = false;
328 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(54)");
329
330 result = bigInt_1.isBitSet(55);
331 expectedResult = true;
332 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(55)");
333
334 result = bigInt_1.isBitSet(56);
335 expectedResult = false;
336 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(56)");
337
338 result = bigInt_1.isBitSet(57);
339 expectedResult = false;
340 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(57)");
341
342 result = bigInt_1.isBitSet(58);
343 expectedResult = true;
344 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(58)");
345
346 result = bigInt_1.isBitSet(59);
347 expectedResult = false;
348 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(59)");
349
350 result = bigInt_1.isBitSet(60);
351 expectedResult = false;
352 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(60)");
353
354 //
355 //shiftLeft
356 //
357 bigInt_1 = new Clipperz.Crypto.BigInt("7f", 16);
358 result = bigInt_1.shiftLeft(1);
359 expectedResult = new Clipperz.Crypto.BigInt('fe', 16);
360 is(result.asString(16), expectedResult.asString(16), "'7f'.shiftLeft(1)");
361
362 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16);
363 result = bigInt_1.shiftLeft(1);
364 expectedResult = new Clipperz.Crypto.BigInt('01fe', 16);
365 is(result.asString(16), expectedResult.asString(16), "'ff'.shiftLeft(1)");
366
367 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
368 result = bigInt_1.shiftLeft(2);
369 expectedResult = new Clipperz.Crypto.BigInt('411949344998216388118140849290325291159199602592792139973517588004462660346196', 10);
370 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(10)");
371
372 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
373 result = bigInt_1.shiftLeft(8);
374 expectedResult = new Clipperz.Crypto.BigInt('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85500', 16);
375 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(8)");
376
377 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
378 result = bigInt_1.shiftLeft(10);
379 expectedResult = new Clipperz.Crypto.BigInt('105459032319543395358244057418323274536755098263754787833220502529142441048626176', 10);
380 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(10)");
381
382 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16);
383 result = bigInt_1.shiftLeft(4096);
384 expectedResult = new Clipperz.Crypto.BigInt('266319164760353889206396941232739217557890883507082863997979538237408246532747151496450837043424377376926977212182012023686831226737377369852125202402098145876219029018646049576792205484267848170179157853023266287725961304046416750146445344507869587461686016719979944538177432428730245324189334334817497396705169439104855885416460935698516539852892760625369984672271807592980051379072961966267124963131928067770749329011150668180796667192392027523071601150548205543997146350727148885425131890513407882508735446345822174200042918879518190588482963417582471561436215675823872015307629566605147920139961896995509627341070659007877630760561618021922340198636222738900413041589858099507891702174848695380017286939422770656819923801325579542295611580916900945707539132241939193098989585491346846486694653352501301851631933610655701026861715541355665900384634131852357081890301147104554877895768806174478161952060916705243614916310627428392386264214492834954273769685672081818149530274447979003153864646452529328518204716201193108795473912970645455457215455929896570875795325190705652768977680951535622436287312272907838194995042100153360373621439300266297151905265332115434133380301670205335338558744799343198526203012170200626802804318535680', 10);
385 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)");
386
387 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16);
388 result = bigInt_1.shiftLeft(5000);
389 expectedResult = new Clipperz.Crypto.BigInt('36017909319555363939297846508911757008556852467205798478749046189356513330989041570231272721076143922520578818149998351104871978707844731275672652360293180474918203352225676748028889909508585302690242044220987556901043359920075229167479636668489487021705618421769517884399224788393498408327257966673365451264730932480701037648195190724361287852846952667257156204462064385766889505990099642052739974651257588866645027017486311782036674195285521311468922365736517586569614071211079825802088151607502649165228246449902253708785396560087430392277977851200155957347440614508171640900912431375050142178348130480158080696562512167652410483775588091117019722112093545783277082149415339867358805673644654236371762589715111732737686904860620316822561292797144756685380676343141118415434643259498221414744450502163805872581378284735047416230112208369784803081434462030568662742790926051825877463257023387907801068796855629691810029349692983890802136654401365294584656484852908751516361546884362396124203127393434938355516740711953765305060269622960662047729516459906444429108776596594293559927265789943280929098971285454533928986078946124455350540187565506016643147748500262510780357259199808936108629893209819473029835119866186316144675107047007737043503194737001430981972314376700993832503282107582239603281145093446879837002884732470988727066207277180181469885503549870618810897831820650576980763622189213611885522245978572420535750015505830146119605502167931087454823309031494727688701857532561113118183883936890880', 10);
390 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)");
391
392
393 //
394 //BigInt compare vs ByteArray compare
395 //
396 var bigInt_byteArray_1;
397 var bigInt_byteArray_2;
398
399 //
400 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
401 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
402 bitInt_byteArray_1 = bigInt_1.asByteArray();
403 bitInt_byteArray_2 = bigInt_2.asByteArray();
404
405 result = bigInt_1.compare(bigInt_2);
406 expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2);
407 is(result, expectedResult, "equal compare");
408
409 //
410 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
411 bigInt_2 = new Clipperz.Crypto.BigInt("f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
412 bitInt_byteArray_1 = bigInt_1.asByteArray();
413 bitInt_byteArray_2 = bigInt_2.asByteArray();
414
415 result = bigInt_1.compare(bigInt_2);
416 expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2);
417 is(result, expectedResult, "second term with one more bit at the leftmost - compare");
418
419 //
420 bigInt_1 = new Clipperz.Crypto.BigInt("f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
421 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
422 bitInt_byteArray_1 = bigInt_1.asByteArray();
423 bitInt_byteArray_2 = bigInt_2.asByteArray();
424
425 result = bigInt_1.compare(bigInt_2);
426 expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2);
427 is(result, expectedResult, "first term with one more bit at the leftmost - compare");
428
429 //
430 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16);
431 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
432 bitInt_byteArray_1 = bigInt_1.asByteArray();
433 bitInt_byteArray_2 = bigInt_2.asByteArray();
434
435 result = bigInt_1.compare(bigInt_2);
436 expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2);
437 is(result, expectedResult, "first term with one more bit in the middle - compare");
438
439 //
440 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16);
441 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427aeffffffffffffffffffffffffffff", 16);
442 bitInt_byteArray_1 = bigInt_1.asByteArray();
443 bitInt_byteArray_2 = bigInt_2.asByteArray();
444
445 result = bigInt_1.compare(bigInt_2);
446 expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2);
447 is(result, expectedResult, "first term with one more bit in the middle - compare");
448
449 //
450 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
451 bigInt_2 = new Clipperz.Crypto.BigInt("05", 16);
452 bitInt_byteArray_1 = bigInt_1.asByteArray();
453 bitInt_byteArray_2 = bigInt_2.asByteArray();
454
455 result = bigInt_1.compare(bigInt_2);
456 expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2);
457 is(result, expectedResult, "equal compare");
458*/
459 //-------------------------------------------------------------------------
460} catch (err) {
461
462 var s = "test suite failure!\n";
463 var o = {};
464 var k = null;
465 for (k in err) {
466 // ensure unique keys?!
467 if (!o[k]) {
468 s += k + ": " + err[k] + "\n";
469 o[k] = err[k];
470 }
471 }
472 ok ( false, s );
473}
474
475</script>
476</pre>
477</body>
478</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html
new file mode 100644
index 0000000..ba98167
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html
@@ -0,0 +1,155 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31<!-- - ->
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33<!- - -->
34<!-- -->
35 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script>
36 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script>
37 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script>
38 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script>
39 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script>
40<!-- -->
41
42<!-- - ->
43 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script>
44 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script>
45 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script>
46 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script>
47 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script>
48<!- - -->
49
50
51 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
52 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
53
54<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>-->
55<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>-->
56<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>-->
57
58 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
62
63 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script>
64
65</head>
66<body>
67<pre id="test">
68<script type="text/javascript">
69try {
70
71 var deferredResult;
72
73
74 deferredResult = new MochiKit.Async.Deferred();
75//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;});
76
77 //
78 //ECC.Curve.multiplication
79 //
80 varcurve;
81 var f2m;
82 var f2m_improved;
83 var value;
84 var moduledValue;
85 var result;
86 var result_improved;
87 var expectedResul;
88
89 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)})
90 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField();
91
92 curve = Clipperz.Crypto.ECC.StandardCurves.B283();
93
94/** /
95 value = new Clipperz.Crypto.ECC.BinaryField.Value("7b", 16);
96 result = curve.multiply(value, curve.G());
97 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({
98 x: new Clipperz.Crypto.ECC.BinaryField.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16),
99 y: new Clipperz.Crypto.ECC.BinaryField.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16)
100 });
101 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
102 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
103/ **/
104
105 value = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
106
107//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;});
108 //deferredResult.addCallback(console.time, 'B283.deferred.multiply - moduled value');
109//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;});
110//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;});
111 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G());
112//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;});
113//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;});
114 //deferredResult.addBoth(function(res) {console.timeEnd('B283.deferred.multiply - moduled value'); return res;});
115//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;});
116//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;});
117 deferredResult.addCallback(function(res) {
118 var expectedResult;
119
120 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({
121 x: new Clipperz.Crypto.ECC.BinaryField.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16),
122 y: new Clipperz.Crypto.ECC.BinaryField.Value('97d1257d5c98cf71cf481bc0a495e0588150ea904526f503cd600f5e971c39700e95f1', 16)
123 });
124
125 is(res.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
126 is(res.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
127 })
128//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("5 - " + res); return res;});
129//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 10: " + res); return res;});
130 deferredResult.addBoth(function(res) {SimpleTest.finish(); return res;});
131 deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(res); return res;});
132 deferredResult.callback();
133
134 SimpleTest.waitForExplicitFinish();
135
136 //-------------------------------------------------------------------------
137} catch (err) {
138
139 var s = "test suite failure!\n";
140 var o = {};
141 var k = null;
142 for (k in err) {
143 // ensure unique keys?!
144 if (!o[k]) {
145 s += k + ": " + err[k] + "\n";
146 o[k] = err[k];
147 }
148 }
149 ok ( false, s );
150}
151
152</script>
153</pre>
154</body>
155</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html
new file mode 100644
index 0000000..3d7efaa
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html
@@ -0,0 +1,209 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
41<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
47</head>
48<body>
49<pre id="test">
50<script type="text/javascript">
51try {
52 //
53 //ECC.BinaryFiniteField
54 //
55 varf2m;
56 varf2m_improved;
57 var a, a1, b;
58 var result;
59 var result_improved;
60 var expectedResul;
61
62 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)})
63 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField();
64 a = new Clipperz.Crypto.ECC.BinaryField.Value("05c91e41 d9ca17ef 9d8a33c1 a44eba6d 368fde02 1c492077 1a46eb01 a481e5f7 f430749d", 16);
65 b = new Clipperz.Crypto.ECC.BinaryField.Value("07377071 2de7d57b a803f65f 45786c06 876b8066 db75ec47 81c053b0 a0f78e2c a6ab5187", 16);
66
67 //
68 //addition
69 //
70 result = f2m.add(a, b);
71 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
72 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add");
73
74
75 //
76 //negation
77 //
78 result = f2m.negate(a);
79 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
80 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate");
81
82
83 //
84 //multiplication
85 //
86 result = f2m.multiply(a, b);
87 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16);
88 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply");
89
90
91 //
92 //fast multiplication
93 //
94 result = f2m.fastMultiply(a, b);
95 expectedResult = f2m.multiply(a, b);
96 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
97
98 a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
99 b = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
100 result = f2m.fastMultiply(a, b);
101 expectedResult = f2m.multiply(a, b);
102 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.B283.fastMultiply");
103
104 //
105 //square
106 //
107 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16);
108 result = f2m.square(a);
109 expectedResult = f2m.multiply(a, a);
110 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
111
112 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16);
113 result = f2m.square(a);
114 expectedResult = f2m.multiply(a, a);
115 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
116
117 a = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
118 result = f2m.square(a);
119 expectedResult = f2m.multiply(a, a);
120 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
121
122
123 //
124 //inverse
125 //
126 a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
127 result = f2m.inverse(a);
128 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("3812fc574f3728c60384e141c0e2a808e21adec22dcd407b9e25dd13c6d1bf22defd84a", 16);
129 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.inverse");
130
131
132 //
133 //module
134 //
135
136 a = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
137 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
138 result = f2m.module(a);
139 result_improved = f2m_improved.module(a1);
140 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16);
141 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module");
142 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved)");
143 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods");
144
145
146 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
147 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
148 result = f2m.module(a);
149 result_improved = f2m_improved.module(a1);
150 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("15e2097d116e745ac47480807cb5eb99dad902728aaf5692241063bc70a5b372dbce798", 16);
151 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (2)");
152 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (2)");
153 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (2)");
154
155
156 a = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
157 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
158 result = f2m.module(a);
159 result_improved = f2m_improved.module(a1);
160 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("40f04cec8fe9caedf82adeff7e1aa06dcb9d08e097db8be2ad54b2ddc2e752152395623", 16);
161 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (3)");
162 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (3)");
163 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (3)");
164
165
166 a = new Clipperz.Crypto.ECC.BinaryField.Value("02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16);
167 is(a.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value as expected (4)")
168 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16);
169 result = f2m.module(a);
170 result_improved = f2m_improved.module(a1);
171 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
172 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (4)");
173 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (4)");
174 is(result_improved.asString(16), "ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", "ECC.BinaryFinetField.module (static check) (4)");
175 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (4)");
176
177 is(a.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value preserved by standard method (4)")
178 is(a1.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value preserved by improved method (4)")
179
180
181 a = new Clipperz.Crypto.ECC.BinaryField.Value("2f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16);
182 result_improved = f2m_improved.module(a);
183 result = f2m.module(a);
184 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
185 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (5)");
186 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (5)");
187 is(result_improved.asString(16), "ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", "ECC.BinaryFinetField.module (static check) (5)");
188 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (5)");
189
190 //-------------------------------------------------------------------------
191} catch (err) {
192
193 var s = "test suite failure!\n";
194 var o = {};
195 var k = null;
196 for (k in err) {
197 // ensure unique keys?!
198 if (!o[k]) {
199 s += k + ": " + err[k] + "\n";
200 o[k] = err[k];
201 }
202 }
203 ok ( false, s );
204}
205
206</script>
207</pre>
208</body>
209</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
new file mode 100644
index 0000000..6bddb26
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
@@ -0,0 +1,183 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
41<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
47</head>
48<body>
49<pre id="test">
50<script type="text/javascript">
51try {
52 //
53 //ECC.BinaryFiniteField
54 //
55 varf2m;
56 varf2m_improved;
57 var a, b;
58 var result;
59 var result_improved;
60 var expectedResul;
61
62 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16)})
63 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B571().finiteField();
64 a = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca8 7b8f1446 84a2c58a e9308c23 7789e4bf 1f36dd11 7c150b7d 6076dd1d a6197fe4 c5225a06 4db0e422 2589d5ca 50eb6bb6 b7147a03 f6152843 8a8767c6 a6c4a688 3fd6f067", 16);
65 b = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c9 7e74737b 38925faf e22cea3e 12b868d4 ddea5b33 41db8fc2 e788cab7 4f0a7a3c c27087a8 93659453 69938650 a99217d5 66e13f80 dc87f082 73f7411b 6b01ef1d 399c772a", 16);
66
67 //
68 //addition
69 //
70 result = f2m.add(a, b);
71 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16);
72 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add");
73
74
75 //
76 //negation
77 //
78 result = f2m.negate(a);
79 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
80 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate");
81
82
83 //
84 //multiplication
85 //
86 result = f2m.multiply(a, b);
87 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16);
88 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply");
89
90
91 //
92 //fast multiplication
93 //
94 result = f2m.fastMultiply(a, b);
95 expectedResult = f2m.multiply(a, b);
96 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
97
98 a = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16);
99 b = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
100 result = f2m.fastMultiply(a, b);
101 expectedResult = f2m.multiply(a, b);
102 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
103
104 //
105 //square
106 //
107 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16);
108 result = f2m.square(a);
109 expectedResult = f2m.multiply(a, a);
110 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
111
112 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16);
113 result = f2m.square(a);
114 expectedResult = f2m.multiply(a, a);
115 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
116
117 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
118 result = f2m.square(a);
119 expectedResult = f2m.multiply(a, a);
120 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
121
122
123 //
124 //inverse
125 //
126 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
127 result = f2m.inverse(a);
128 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1f898c60983c4e807e619b9cbe528585fc33aaae419d5e5cb2107269ccdcf21d5ad5b5d78d37fa435a0d0a8a75f2506240c325c6a2eee1a03008f9e1b9c6c0a511b730cdaf9b97e", 16);
129 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.inverse");
130
131
132 //
133 //module
134 //
135
136 a = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
137 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
138 result = f2m.module(a);
139 result_improved = f2m_improved.module(a1);
140 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16);
141 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module");
142 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved)");
143 //is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods");
144
145
146 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
147 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
148 result = f2m.module(a);
149 result_improved = f2m_improved.module(a1);
150 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1704018ce75dc462a5ccd1eb18b8002ecb8536c616ec625f440f6888f8c32387e53a5cb3b6050688e9b64a32215a385ee98c518d6a484d5ac0ceeafa825743c84b075bdfabc341b", 16);
151 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (2)");
152 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved) (2)");
153 is(a.asString(16), "1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", "ECC.BinaryFinetField.module (2)");
154 is(a1.asString(16), "1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", "ECC.BinaryFinetField.module (2)");
155
156
157 a = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
158 result = f2m.module(a);
159 result_improved = f2m_improved.module(a);
160 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("e160dd4a436e63877e1343d06576beaa66e06863ffe4335be38d6a37460a62d11133584a5bc6ac0590e18942e1fa88bb64a4d9fc6c1fd7b55d7e57b50b70a9e7cb2ed904ad77f4", 16);
161 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (2)");
162 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved) (2)");
163
164 //-------------------------------------------------------------------------
165} catch (err) {
166
167 var s = "test suite failure!\n";
168 var o = {};
169 var k = null;
170 for (k in err) {
171 // ensure unique keys?!
172 if (!o[k]) {
173 s += k + ": " + err[k] + "\n";
174 o[k] = err[k];
175 }
176 }
177 ok ( false, s );
178}
179
180</script>
181</pre>
182</body>
183</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
new file mode 100644
index 0000000..885bcc4
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
@@ -0,0 +1,496 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
41<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
47</head>
48<body>
49<pre id="test">
50<script type="text/javascript">
51try {
52 var value_1;
53 var value_2;
54
55 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("a", 16);
56 is(value_1.asString(16), "0a");
57
58 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff", 16);
59 is(value_1.asString(16), "ffff");
60
61 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7fff", 16);
62 is(value_1.asString(16), "7fff");
63
64 is(parseInt("ffff", 16), 65535);
65 is(parseInt("ffffff", 16), 16777215);
66 is(parseInt("ffffffff", 16), 4294967295);
67 is(parseInt("ffffffffff", 16), 1099511627775);
68 is(parseInt("ffffffffffff", 16), 281474976710655);
69 is(parseInt("ffffffffffffff", 16), 72057594037927940);
70 is(parseInt("ffffffffffffffff", 16), 18446744073709552000);
71 is(parseInt("10000000000000000", 16), 18446744073709552001);
72 is(parseInt("10000000000000001", 16), 18446744073709552002);
73 is(parseInt("10000000000000009", 16), 18446744073709552010);
74
75 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
76 is(value_1.wordSize(), 8, "check the number of words of a 64 char hex string using the 'wordSize' method");
77
78 // 000108cb bacda1f0 3ea93603 01045434 ec7d82ba 150936df 08a229cb b4832ce1
79 is(value_1.value()[0], parseInt("b4832ce1", 16), "word[0]");
80 is(value_1.value()[1], parseInt("08a229cb", 16), "word[1]");
81 is(value_1.value()[2], parseInt("150936df", 16), "word[2]");
82 is(value_1.value()[3], parseInt("ec7d82ba", 16), "word[3]");
83 is(value_1.value()[4], parseInt("01045434", 16), "word[4]");
84 is(value_1.value()[5], parseInt("3ea93603", 16), "word[5]");
85 is(value_1.value()[6], parseInt("bacda1f0", 16), "word[6]");
86 is(value_1.value()[7], parseInt("000108cb", 16), "word[7]");
87
88 is(value_1.asString(16), "0108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "asString(16)");
89
90 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16);
91 is(value_1.wordSize(), 3, "check the number of words of a value with only a bit set on the first slot of byte at position 17");
92 is(value_1.value()[0], parseInt("00000000", 16), "word[0]");
93 is(value_1.value()[1], parseInt("00000000", 16), "word[1]");
94 is(value_1.value()[2], parseInt("10", 16), "word[2]");
95 is(value_1.asString(16), "100000000000000000", "2^17 asString(16)");
96
97 //
98 //XOR
99 //
100 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
101 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
102 result = value_1.xor(value_2);
103 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
104 is(result.asString(16), expectedResult.asString(16), "a xor a = 0");
105
106 //
107 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855', 16);
108 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b935c a495991b 7852b855', 16);
109 result = value_1.xor(value_2);
110 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16);
111 is(result.asString(16), expectedResult.asString(16), "single bit difference");
112
113 //
114 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01", 16);
115 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855', 16);
116 result = value_1.xor(value_2);
117 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b854', 16);
118 is(result.asString(16), expectedResult.asString(16), "01 xor value");
119
120 //
121 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
122 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
123 result = value_1.xor(value_2);
124 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('1000000000000000000000000000000000000000000000000000000000000000', 16);
125 is(result.asString(16), expectedResult.asString(16), "first bit difference xor");
126
127 //
128 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('84a2c58a', 16);
129 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('38925faf', 16);
130 result = value_1.xor(value_2);
131 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('bc309a25', 16);
132 is(result.asString(16), expectedResult.asString(16), "84a2c58a XOR 38925faf = bc309a25");
133
134 //
135 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
136 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
137 result = value_1.xor(value_2);
138 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0052e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d', 16);
139 is(result.asString(16), expectedResult.asString(16), "xor");
140
141
142 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", 16);
143 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("01ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f816429a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
144 result = value_2.xor(value_1.shiftLeft(value_2.bitSize() - value_1.bitSize()));
145 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f892e29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
146 is(result.asString(16), expectedResult.asString(16), "xor");
147 is(result.bitSize(), 1120, "xor.bitSize");
148 is(result.wordSize(), 35, "result wordSize");
149 is(expectedResult.bitSize(), 1120, "xor.bitSize");
150 is(expectedResult.wordSize(), 35, "expectedResult wordSize");
151 is(result.compare(expectedResult), 0, "compare");
152
153
154 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", 16);
155 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f892e29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
156 result = value_2.xor(value_1.shiftLeft(value_2.bitSize() - value_1.bitSize()));
157 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("6bcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f8d0b29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
158 is(result.asString(16), expectedResult.asString(16), "xor");
159 is(result.bitSize(), 1119, "xor.bitSize");
160 is(expectedResult.bitSize(), 1119, "xor.bitSize");
161 is(result.compare(expectedResult), 0, "compare");
162 //value_1 =
163 //value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 16);
164
165
166 value_1 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010 01010101 00000000", 16)).value();
167 value_2 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010", 16)).value();
168 result = new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(value_1, value_2, 2));
169 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("01010101 00000000", 16);
170 is(result.asString(16), expectedResult.asString(16), "xor with offset 2");
171
172 value_1 = (new Clipperz.Crypto.ECC.BinaryField.Value(" 10101010 01010101 00000000", 16)).value();
173 value_2 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010 10101010", 16)).value();
174 result = new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(value_1, value_2, 2));
175 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("10101010 00000000 01010101 00000000", 16);
176 is(result.asString(16), expectedResult.asString(16), "xor with offset 2 (2)");
177
178 //
179 //isZero
180 //
181 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
182 is(value_1.isZero(), true, "0.isZero() == true");
183
184 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16);
185 is(value_1.isZero(), false, "1.isZero() == false");
186
187 //
188 //Comparison
189 //
190 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16);
191 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16);
192 is (value_1.compare(value_2), 0, "BinaryField.value(0) = BinaryField.value(0)");
193 //is (value_1.compare(0), 0, "BinaryField.value(0) = 0");
194
195 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
196 is (value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) != BinaryField.value(0)");
197
198 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
199 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16);
200 is(value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) > BinaryField.value(0)");
201 is(value_2.compare(value_1), -1, "BinaryField.value(0) < BinaryField.value(xxxx)");
202
203 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
204 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("05", 16);
205 is(value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) > BinaryField.value(05)");
206 is(value_2.compare(value_1), -1, "BinaryField.value(05) < BinaryField.value(xxxx)");
207
208 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("-10", 16);
209 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("10", 16);
210 is(value_1.compare(value_2), -1, "BinaryField.value(-10) - BinaryField.value(10). No negative number are managed");
211
212 //
213 //more comparison
214 //
215
216 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
217 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
218 result = value_1.compare(value_2);
219 is(result, 0, "equal compare");
220
221 //
222 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442", 16);
223 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442", 16);
224 result = value_1.compare(value_2);
225 is(result, -1, "second term with one more bit at the leftmost - compare (1)");
226
227 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14", 16);
228 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14", 16);
229 result = value_1.compare(value_2);
230 is(result, -1, "second term with one more bit at the leftmost - compare (2)");
231
232 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8", 16);
233 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8", 16);
234 result = value_1.compare(value_2);
235 is(result, -1, "second term with one more bit at the leftmost - compare (3)");
236
237 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
238 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
239 result = value_1.compare(value_2);
240 is(result, -1, "second term with one more bit at the leftmost - compare (n)");
241
242 //
243 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442", 16);
244 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442", 16);
245 result = value_1.compare(value_2);
246 is(result, 1, "first term with one more bit at the leftmost - compare (1)");
247
248 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14", 16);
249 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14", 16);
250 result = value_1.compare(value_2);
251 is(result, 1, "first term with one more bit at the leftmost - compare (2)");
252
253 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
254 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
255 result = value_1.compare(value_2);
256 is(result, 1, "first term with one more bit at the leftmost - compare (n)");
257
258 //
259 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16);
260 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
261 result = value_1.compare(value_2);
262 is(result, 1, "first term with one more bit in the middle - compare");
263
264 //
265 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16);
266 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427aeffffffffffffffffffffffffffff", 16);
267 result = value_1.compare(value_2);
268 is(result, 1, "first term with one more bit in the middle - compare");
269
270 //
271 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
272 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("05", 16);
273 result = value_1.compare(value_2);
274 is(result, 1, "equal compare");
275
276
277
278 //
279 //isBitSet
280 //
281 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16);
282 result = value_1.isBitSet(1);
283 expectedResult = true;
284 is(result, expectedResult, "'ff'.isBitSet(1)");
285
286 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16);
287 result =value_1.isBitSet(1);
288 expectedResult = false;
289 is(result, expectedResult, "'f0'.isBitSet(1)");
290
291 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16);
292 result = value_1.isBitSet(3);
293 expectedResult = false;
294 is(result, expectedResult, "'f0'.isBitSet(3)");
295
296 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16);
297 result = value_1.isBitSet(4);
298 expectedResult = true;
299 is(result, expectedResult, "'f0'.isBitSet(4)");
300
301 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff00", 16);
302 result = value_1.isBitSet(7);
303 expectedResult = false;
304 is(result, expectedResult, "'ff00'.isBitSet(7)");
305
306 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff00", 16);
307 result = value_1.isBitSet(8);
308 expectedResult = true;
309 is(result, expectedResult, "'ff00'.isBitSet(8)");
310
311 //
312 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("05000000000000", 16);
313 result = value_1.isBitSet(47);
314 expectedResult = false;
315 is(result, expectedResult, "'05000000000000'.isBitSet(47)");
316
317 result = value_1.isBitSet(48);
318 expectedResult = true;
319 is(result, expectedResult, "'05000000000000'.isBitSet(48)");
320
321 result = value_1.isBitSet(49);
322 expectedResult = false;
323 is(result, expectedResult, "'05000000000000'.isBitSet(49)");
324
325 result = value_1.isBitSet(50);
326 expectedResult = true;
327 is(result, expectedResult, "'05000000000000'.isBitSet(50)");
328
329 result = value_1.isBitSet(51);
330 expectedResult = false;
331 is(result, expectedResult, "'05000000000000'.isBitSet(51)");
332
333 //
334 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
335
336 result = value_1.isBitSet(52);
337 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(52)");
338
339 result = value_1.isBitSet(53);
340 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(53)");
341
342 result = value_1.isBitSet(54);
343 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(54)");
344
345 result = value_1.isBitSet(55);
346 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(55)");
347
348 result = value_1.isBitSet(56);
349 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(56)");
350
351 result = value_1.isBitSet(57);
352 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(57)");
353
354 result = value_1.isBitSet(58);
355 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(58)");
356
357 result = value_1.isBitSet(59);
358 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(59)");
359
360 result = value_1.isBitSet(60);
361 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(60)");
362
363
364 //
365 //shiftLeft
366 //
367
368 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7f", 16);
369 result = value_1.shiftLeft(1);
370 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('fe', 16);
371 is(result.asString(16), expectedResult.asString(16), "'7f'.shiftLeft(1)");
372
373 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16);
374 result = value_1.shiftLeft(1);
375 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('01fe', 16);
376 is(result.asString(16), expectedResult.asString(16), "'ff'.shiftLeft(1)");
377
378 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ffff', 16);
379 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ffff00', 16);
380 result = value_1.shiftLeft(8);
381 is(result.asString(16), expectedResult.asString(16), "ffff.shiftLeft(8)");
382
383 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( '80000000', 16);
384 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('1 00000000', 16);
385 result = value_1.shiftLeft(1);
386 is(result.compare(expectedResult) == 0, true, '8000000.shiftLeft(1).compare');
387 is(result.asString(16), expectedResult.asString(16), "80000000.shiftLeft(1)");
388
389 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('20000000', 16);
390 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('40000000', 16);
391 result = value_1.shiftLeft(1);
392 is(result.compare(expectedResult) == 0, true, '2000000.shiftLeft(1).compare');
393 is(result.asString(16), expectedResult.asString(16), "20000000.shiftLeft(1)");
394
395 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('40000000', 16);
396 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('80000000', 16);
397 result = value_1.shiftLeft(1);
398 is(result.compare(expectedResult) == 0, true, '4000000.shiftLeft(1).compare');
399 is(result.asString(16), expectedResult.asString(16), "40000000.shiftLeft(1)");
400
401 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ff7fffff', 16);
402 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ff 7fffff00', 16);
403 result = value_1.shiftLeft(8);
404 is(result.asString(16), expectedResult.asString(16), "ff7fffff.shiftLeft(8)");
405
406 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ffffffff', 16);
407 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ff ffffff00', 16);
408 result = value_1.shiftLeft(8);
409 is(result.asString(16), expectedResult.asString(16), "ffffffff.shiftLeft(8)");
410
411 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( "e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
412 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('3 8ec3110a 63f07052 6befd322 65bee490 9eb90791 926e4d32 9256646d e14ae154', 16);
413 result = value_1.shiftLeft(2);
414 is(result.asString(16), expectedResult.asString(16), "Value.shiftLeft(10)");
415
416 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
417 result = value_1.shiftLeft(8);
418 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85500', 16);
419 is(result.asString(16), expectedResult.asString(16), "Value.shiftLeft(8)");
420
421 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
422 result = value_1.shiftLeft(10);
423 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('38e c3110a63 f070526b efd32265 bee4909e b9079192 6e4d3292 56646de1 4ae15400', 16);
424 is(result.asString(16), expectedResult.asString(16), "Value.shiftLeft(10)");
425
426 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16);
427 result = value_1.shiftLeft(32);
428 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ff00000000', 16);
429 is(result.asString(16), expectedResult.asString(16), "ff.shiftLeft(32)");
430
431 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16);
432 result = value_1.shiftLeft(4096);
433 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 16);
434 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)");
435
436 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16);
437 result = value_1.shiftLeft(5000);
438 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', 16);
439 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)");
440
441 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16);
442 is(value_1.bitSize(), 0, "0.bitSize()");
443
444 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("10", 16);
445 is(value_1.bitSize(), 5, "10.bitSize()");
446
447 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("80", 16);
448 is(value_1.bitSize(), 8, "80.bitSize()");
449
450 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16);
451 is(value_1.bitSize(), 8, "ff.bitSize()");
452
453 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("100", 16);
454 is(value_1.bitSize(), 9, "100.bitSize()");
455
456 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("80000000", 16);
457 is(value_1.bitSize(), 32, "80000000.bitSize()");
458
459 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffffffff", 16);
460 is(value_1.bitSize(), 32, "ffffffff.bitSize()");
461
462 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("1 00000000", 16);
463 is(value_1.bitSize(), 33, "100000000.bitSize()");
464
465 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("8000 00000000", 16);
466 is(value_1.bitSize(), 48, "8000 00000000.bitSize()");
467
468 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff ffffffff", 16);
469 is(value_1.bitSize(), 48, "ffff ffffffff.bitSize()");
470
471 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("10000 00000000", 16);
472 is(value_1.bitSize(), 49, "10000 00000000.bitSize()");
473
474 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("6bcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f8d0b29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
475 is(value_1.bitSize(), 1119, "6bcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f8d0b29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16.bitSize()");
476
477 //-------------------------------------------------------------------------
478} catch (err) {
479
480 var s = "test suite failure!\n";
481 var o = {};
482 var k = null;
483 for (k in err) {
484 // ensure unique keys?!
485 if (!o[k]) {
486 s += k + ": " + err[k] + "\n";
487 o[k] = err[k];
488 }
489 }
490 ok ( false, s );
491}
492
493</script>
494</pre>
495</body>
496</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html
new file mode 100644
index 0000000..b53a9a1
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html
@@ -0,0 +1,160 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31<!-- - ->
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33<!- - -->
34<!-- -->
35 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script>
36 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script>
37 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script>
38 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script>
39 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script>
40<!-- -->
41
42<!-- - ->
43 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script>
44 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script>
45 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script>
46 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script>
47 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script>
48<!- - -->
49
50
51 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
52 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
53
54<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>-->
55<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>-->
56<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>-->
57
58<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>-->
59<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>-->
60<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>-->
61<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>-->
62
63 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Value.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Point.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/FiniteField.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Curve.js'></script>
67
68 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script>
69
70</head>
71<body>
72<pre id="test">
73<script type="text/javascript">
74try {
75
76 var deferredResult;
77
78
79 deferredResult = new MochiKit.Async.Deferred();
80//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;});
81
82 //
83 //ECC.Curve.multiplication
84 //
85 varcurve;
86 var f2m;
87 var f2m_improved;
88 var value;
89 var moduledValue;
90 var result;
91 var result_improved;
92 var expectedResul;
93
94 f2m = new Clipperz.Crypto.ECC.Koblitz.FiniteField({modulus:new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)})
95 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.K283().finiteField();
96
97 curve = Clipperz.Crypto.ECC.StandardCurves.K283();
98
99/** /
100 value = new Clipperz.Crypto.ECC.Koblitz.Value("7b", 16);
101 result = curve.multiply(value, curve.G());
102 expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({
103 x: new Clipperz.Crypto.ECC.Koblitz.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16),
104 y: new Clipperz.Crypto.ECC.Koblitz.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16)
105 });
106 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
107 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
108/ **/
109
110 value = new Clipperz.Crypto.ECC.Koblitz.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
111
112//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;});
113 //deferredResult.addCallback(console.time, 'K283.deferred.multiply - moduled value');
114//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;});
115//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;});
116 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G());
117//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;});
118//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;});
119 //deferredResult.addBoth(function(res) {console.timeEnd('K283.deferred.multiply - moduled value'); return res;});
120//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;});
121//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;});
122 deferredResult.addCallback(function(res) {
123 var expectedResult;
124
125 expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({
126 x: new Clipperz.Crypto.ECC.Koblitz.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16),
127 y: new Clipperz.Crypto.ECC.Koblitz.Value('97d1257d5c98cf71cf481bc0a495e0588150ea904526f503cd600f5e971c39700e95f1', 16)
128 });
129
130 is(res.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
131 is(res.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
132 })
133//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("5 - " + res); return res;});
134//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 10: " + res); return res;});
135 deferredResult.addBoth(function(res) {SimpleTest.finish(); return res;});
136//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 11: " + res); return res;});
137 deferredResult.callback();
138
139 SimpleTest.waitForExplicitFinish();
140
141 //-------------------------------------------------------------------------
142} catch (err) {
143
144 var s = "test suite failure!\n";
145 var o = {};
146 var k = null;
147 for (k in err) {
148 // ensure unique keys?!
149 if (!o[k]) {
150 s += k + ": " + err[k] + "\n";
151 o[k] = err[k];
152 }
153 }
154 ok ( false, s );
155}
156
157</script>
158</pre>
159</body>
160</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html
new file mode 100644
index 0000000..1342349
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html
@@ -0,0 +1,70 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Crypto.JSCrypto_vs_Clipperz - tests</title>
32
33 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
34
35 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
36 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
37 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
38
39 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
40
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
53
54 <script type='text/javascript' src='./jscrypto.js'></script>
55
56 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
57
58</head>
59<body>
60
61<pre id="test">
62 <script type="text/javascript">
63 var longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a.";
64 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù";
65 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之";
66 </script>
67 <script type="text/javascript" src="JSCrypto_vs_Clipperz.test.js"></script>
68</pre>
69</body>
70</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js
new file mode 100644
index 0000000..7dc688c
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js
@@ -0,0 +1,418 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//function logElapsedTime(aDescription, aStartTime, anEndTime) {
30 //MochiKit.Logging.logDebug(aDescription + " - took " + (anEndTime - aStartTime) + "ms");
31 //SimpleTest.ok(true, aDescription + " - took " + (anEndTime - aStartTime) + "ms");
32//}
33
34 var asciiTestString = longAsciiText;
35//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
36//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
37//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
38//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
39//asciiTestString = asciiTestString + asciiTestString;
40//asciiTestString = asciiTestString + asciiTestString;
41
42 var isoLatin1TestString= longIsoLatin1Text;
43//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
44//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
45//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
46//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString;
47//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString;
48
49 var utf8TestString = longUtf8Text;
50//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString;
51//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString;
52//utf8TestString = utf8TestString + utf8TestString;
53//utf8TestString = utf8TestString + utf8TestString;
54
55var times = {
56 'Clipperz': {},
57 'JSCrypto': {}
58};
59
60function appendResults (aDescription, aTimer) {
61 MochiKit.DOM.appendChildNodes(MochiKit.DOM.getElement('timerTBODY'),
62 MochiKit.DOM.TR(null,
63 MochiKit.DOM.TH({align:'left'}, aDescription),
64 MochiKit.DOM.TH(null, aTimer['ascii']['encrypt'] + ' - ' + aTimer['ascii']['decrypt'])//,
65 // MochiKit.DOM.TH(null, aTimer['isoLatin1']['encrypt']+ ' - ' + aTimer['isoLatin1']['decrypt']),
66 // MochiKit.DOM.TH(null, aTimer['utf8']['encrypt'] + ' - ' + aTimer['utf8']['decrypt'])
67 )
68 );
69
70}
71
72//=============================================================================
73
74function timeRegularFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey) {
75 var start;
76 var end;
77 var encryptTime;
78 var decryptTime;
79 var ciphertext;
80 var plaintext;
81
82
83 start = new Date();
84 ciphertext = anEncryptFunction('trustno1', aString);
85 end = new Date();
86 encryptTime = end - start;
87
88 start = new Date();
89 plaintext = aDecryptFunction('trustno1', ciphertext);
90 end = new Date();
91 decryptTime = end - start;
92 aTimer[aKey] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
93 SimpleTest.is(aString, plaintext, aDescription);
94}
95/*
96function timeRegularFunction (anEncryptFunction, aDecryptFunction, aTimer) {
97 var start;
98 var end;
99 var encryptTime;
100 var decryptTime;
101 var ciphertext;
102 var plaintext;
103
104
105 start = new Date();
106 ciphertext = anEncryptFunction('trustno1', asciiTestString);
107 end = new Date();
108 encryptTime = end - start;
109
110 start = new Date();
111 plaintext = aDecryptFunction('trustno1', ciphertext);
112 end = new Date();
113 decryptTime = end - start;
114 aTimer['ascii'] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
115 SimpleTest.is(asciiTestString, plaintext, "Encrypt/decrypt the ASCII text");
116
117
118 start = new Date();
119 ciphertext = anEncryptFunction('trustno1', isoLatin1TestString);
120 end = new Date();
121 encryptTime = end - start;
122
123 start = new Date();
124 plaintext = aDecryptFunction('trustno1', ciphertext);
125 end = new Date();
126 decryptTime = end - start;
127 aTimer['isoLatin1'] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
128 SimpleTest.is(isoLatin1TestString, plaintext, "Encrypt/decrypt the ISO-Latin 1 text");
129
130
131 start = new Date();
132 ciphertext = anEncryptFunction('trustno1', utf8TestString);
133 end = new Date();
134 encryptTime = end - start;
135
136 start = new Date();
137 plaintext = aDecryptFunction('trustno1', ciphertext);
138 end = new Date();
139 decryptTime = end - start;
140 aTimer['utf8'] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
141 SimpleTest.is(utf8TestString, plaintext, "Encrypt/decrypt the UTF-8 text");
142}
143*/
144function timeDeferredFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey, someTestArgs) {
145 var start;
146 var end;
147
148 var deferredResult;
149
150 aTimer[aKey] = {};
151
152 deferredResult = new Clipperz.Async.Deferred("timeDeferredFunction", someTestArgs);
153 deferredResult.addCallback(function (aValue) { start = new Date(); return aValue});
154 deferredResult.addCallback(anEncryptFunction, 'trustno1', aString);
155 deferredResult.addCallback(function (aValue) {
156 end = new Date();
157 aTimer[aKey]['encrypt'] = end-start;
158 return aValue;
159 });
160 deferredResult.addCallback(function (aValue) { start = new Date(); return aValue});
161 deferredResult.addCallback(aDecryptFunction, 'trustno1');
162 deferredResult.addCallback(function (aValue) {
163 end = new Date();
164 aTimer[aKey]['decrypt'] = end-start;
165 return aValue;
166 });
167 deferredResult.addCallback(function (aValue) {
168 SimpleTest.is(aString, aValue, aDescription);
169 });
170
171 deferredResult.callback();
172
173 return deferredResult;
174}
175
176//=============================================================================
177
178function encryptUsingJSCrypto (aKey, aValue) {
179 var salt;
180 var key;
181 var cipher;
182 var iv;
183 var plaintext;
184 var ciphertext;
185 var tag;
186 var adata;
187
188 salt = [1,2,3,4,5,6,7,8];
189 key = generateKey(aKey, salt);
190
191 cipher = new aes(key, CCM);
192 iv = Random.random_words(4);
193
194 plaintext = aValue;
195 ciphertext = [];
196 tag = [];
197 adata = "";
198
199 cipher.encrypt(iv, plaintext, ciphertext, adata, tag);
200
201 return ciphertext;
202}
203
204//-----------------------------------------------------------------------------
205
206function decryptUsingJSCrypto (aKey, aValue) {
207 var salt;
208 var key;
209 var cipher;
210 var ciphertext;
211 var plaintext;
212 var tag;
213 var adata;
214
215 salt = [1,2,3,4,5,6,7,8];
216 key = generateKey(aKey, salt);
217 tag = [];
218 adata = "";
219
220 cipher = new aes(key, CCM);
221 ciphertext = aValue;
222 plaintext = cipher.decrypt(ciphertext, adata, tag);
223
224 return plaintext;
225}
226
227//=============================================================================
228
229function encryptUsingClipperz (aKey, aValue) {
230 var key;
231 var value;
232 var data;
233 var encryptedData;
234
235 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
236 value = aValue;
237 data = new Clipperz.ByteArray(value);
238 encryptedData = Clipperz.Crypto.AES.encrypt(key, data);
239 return encryptedData.toBase64String();
240}
241
242//-----------------------------------------------------------------------------
243
244function decryptUsingClipperz (aKey, aValue) {
245 var key;
246 var value;
247 var decryptedData;
248
249 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
250 value = new Clipperz.ByteArray().appendBase64String(aValue);
251
252 decryptedData = Clipperz.Crypto.AES.decrypt(key, value).asString();
253
254 return decryptedData;
255}
256
257//=============================================================================
258
259function encryptUsingClipperzAndJSON (aKey, aValue) {
260 var key;
261 var value;
262 var data;
263 var encryptedData;
264
265 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
266 value = Clipperz.Base.serializeJSON(aValue);
267 data = new Clipperz.ByteArray(value);
268 encryptedData = Clipperz.Crypto.AES.encrypt(key, data);
269 return encryptedData.toBase64String();
270}
271
272//-----------------------------------------------------------------------------
273
274function decryptUsingClipperzAndJSON (aKey, aValue) {
275 var key;
276 var value;
277 var decryptedData;
278
279 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
280 value = new Clipperz.ByteArray().appendBase64String(aValue);
281
282 decryptedData = Clipperz.Crypto.AES.decrypt(key, value).asString();
283
284 return Clipperz.Base.evalJSON(decryptedData);
285}
286
287//=============================================================================
288
289function deferredEncryptUsingClipperz (aKey, aValue) {
290 var deferredResult;
291 varkey;
292 var data;
293
294 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
295 data = new Clipperz.ByteArray(aValue);
296
297 deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredEncrypt", {trace:false});
298 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data);
299 deferredResult.addCallback(function(aResult) {
300 return aResult.toBase64String();
301 })
302 deferredResult.callback();
303
304 return deferredResult;
305}
306
307//-----------------------------------------------------------------------------
308
309function deferredDecryptUsingClipperz (aKey, aValue) {
310 var key, value;
311
312 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
313 value = new Clipperz.ByteArray().appendBase64String(aValue);
314
315 deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredDecrypt", {trace:false});
316 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
317 deferredResult.addCallback(function(aResult) {
318 return aResult.asString();
319 });
320 deferredResult.callback();
321
322 return deferredResult;
323}
324
325//=============================================================================
326
327var tests = {
328
329 //-------------------------------------------------------------------------
330
331 'encryptMultipleStringsUsingClipperzFunctions': function (someTestArgs) {
332 // timeRegularFunction(encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['Regular']);
333 times['Clipperz']['NO JSON'] = {};
334
335 timeRegularFunction("Clipperz - NO JSON - Ascii", asciiTestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'ascii');
336 timeRegularFunction("Clipperz - NO JSON - ISO Latin 1", isoLatin1TestString,encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'isoLatin1');
337 timeRegularFunction("Clipperz - NO JSON - UTF-8", utf8TestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'utf8');
338
339 appendResults("Clipperz - NO JSON", times['Clipperz']['NO JSON']);
340 },
341
342 //-------------------------------------------------------------------------
343
344 'encryptMultipleStringsUsingClipperzAndJSONFunctions': function (someTestArgs) {
345 // timeRegularFunction(encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON']);
346 times['Clipperz']['JSON'] = {};
347
348 timeRegularFunction("Clipperz - JSON - Ascii", asciiTestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'ascii');
349 timeRegularFunction("Clipperz - JSON - ISO Latin 1", isoLatin1TestString,encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'isoLatin1');
350 timeRegularFunction("Clipperz - JSON - UTF-8", utf8TestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'utf8');
351
352 appendResults("Clipperz - JSON", times['Clipperz']['JSON']);
353 },
354
355 //-------------------------------------------------------------------------
356
357 'encryptMultipleStringsUsingClipperzDeferredFunctions': function (someTestArgs) {
358 times['Clipperz']['Deferred'] = {};
359 times['Clipperz']['Deferred [NO JSON]'] = {};
360
361 return Clipperz.Async.callbacks("encryptMultipleStringsUsingClipperzDeferredFunctions", [
362 MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'ascii', someTestArgs),
363 // MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'isoLatin1',someTestArgs),
364 // MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'utf8', someTestArgs),
365
366 MochiKit.Base.partial(appendResults, "Clipperz - deferred [NO JSON]", times['Clipperz']['Deferred [NO JSON]']),
367
368 MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'ascii', someTestArgs),
369 // MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'isoLatin1',someTestArgs),
370 // MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'utf8', someTestArgs),
371
372 MochiKit.Base.partial(appendResults, "Clipperz - PM", times['Clipperz']['Deferred'])
373 ], someTestArgs);
374 },
375
376 //-------------------------------------------------------------------------
377
378 'encryptMultipleStringsUsingJSCryptoFunctions': function (someTestArgs) {
379 timeRegularFunction("JSCrypto - Ascii", asciiTestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'ascii');
380 timeRegularFunction("JSCrypto - ISO Latin 1", isoLatin1TestString,encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'isoLatin1');
381 timeRegularFunction("JSCrypto - UTF-8", utf8TestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'utf8');
382
383 appendResults("JSCrypto", times['JSCrypto']);
384 },
385
386 //-------------------------------------------------------------------------
387 'syntaxFix': MochiKit.Base.noop
388};
389
390//#############################################################################
391
392SimpleTest.waitForExplicitFinish();
393Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
394Random.set_default_paranoia(0);
395
396//Random.addEventListener("seeded", MochiKit.Base.partial(SimpleTest.runDeferredTests, "Clipperz.Crypto.JSCrypto_vs_Clipperz", tests, {trace:false}));
397//Random.addEventListener("seeded", function () { console.log("SEEDED!")});
398
399
400MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body,
401 MochiKit.DOM.TABLE({border:'1', cellpadding:'4', cellspacing:'0'},
402 MochiKit.DOM.THEAD(),
403 MochiKit.DOM.TBODY({id:'timerTBODY'},
404 MochiKit.DOM.TR(null,
405 MochiKit.DOM.TH(null, "algorithm"),
406 MochiKit.DOM.TH(null, "ascii [" + asciiTestString.length + "]"),
407 MochiKit.DOM.TH(null, "ISO Latin 1 [" + isoLatin1TestString.length * 2 + "]"),
408 MochiKit.DOM.TH(null, "UTF 8 [" + utf8TestString.length * 3 + "]")
409 )
410 ),
411 MochiKit.DOM.TFOOT()
412 )//,
413 //MochiKit.DOM.H4(null, "AES chunkSize: " + Clipperz.Crypto.AES.DeferredExecution.chunkSize),
414 //MochiKit.DOM.H4(null, "AES pauseTime: " + Clipperz.Crypto.AES.DeferredExecution.pauseTime)
415);
416
417
418SimpleTest.runDeferredTests("Clipperz.Crypto.JSCrypto_vs_Clipperz", tests, {trace:false}); \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
new file mode 100644
index 0000000..7ffd691
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
@@ -0,0 +1,117 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script> jslog_config_enabled = true; </script>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
44
45<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Statistics.js'></script>-->
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
51</head>
52<body>
53<pre id="test">
54<script type="text/javascript">
55test_PRNG = function() {
56 varrand1, rand2;
57 var i,c;
58
59 c = 10;
60 for (i=0; i<c; i++) {
61 // jslog.debug(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString());
62 }
63
64 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1);
65 is(rand1.byteAtIndex(0) <= 255, true, "getRandomByte returns always a single byte");
66
67 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1);
68 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence");
69
70
71 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
72 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
73 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence");
74 is(rand1.split(0,1).equals(rand2.split(0,1)), false, "getRandomByte should almost always return two different values when called into sequence");
75 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 1", "Value for random test");
76 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 2", "Value for random test");
77 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 3", "Value for random test");
78 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 4", "Value for random test");
79 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 5", "Value for random test");
80 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 6", "Value for random test");
81 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 7", "Value for random test");
82 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 8", "Value for random test");
83 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 9", "Value for random test");
84 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 10", "Value for random test");
85 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 11", "Value for random test");
86 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 12", "Value for random test");
87 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 13", "Value for random test");
88 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 14", "Value for random test");
89//jslog.debug(rand1.toHexString());
90//jslog.debug(rand2.toHexString());
91
92 SimpleTest.finish();
93}
94
95try {
96 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', test_PRNG);
97 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
98 SimpleTest.waitForExplicitFinish();
99} catch (err) {
100
101 var s = "test suite failure!\n";
102 var o = {};
103 var k = null;
104 for (k in err) {
105 // ensure unique keys?!
106 if (!o[k]) {
107 s += k + ": " + err[k] + "\n";
108 o[k] = err[k];
109 }
110 }
111 ok ( false, s );
112}
113
114</script>
115</pre>
116</body>
117</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
new file mode 100644
index 0000000..468a987
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
@@ -0,0 +1,90 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
42
43</head>
44<body>
45<pre id="test">
46<script type="text/javascript">
47try {
48 varrsaPublicKey;
49 varrandomValue;
50 varpublicEncryptedValue;
51 var privateEncryptedValue;
52
53 varstartTime;
54 varendTime;
55
56
57startTime=new Date();
58 rsaPublicKey = Clipperz.Crypto.RSA.generatePublicKey(512);
59
60endTime=new Date();
61is(true, true, 'Time to generate the RSA public key (size 512 bit): '+(endTime.getTime()-startTime.getTime())/1000.0);
62
63 randomValue = Clipperz.Crypto.Base.generateRandomSeed();
64 publicEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPublicKey(rsaPublicKey, randomValue);
65 privateEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPrivateKey(rsaPublicKey, randomValue);
66
67 is(publicEncryptedValue == privateEncryptedValue, false);
68 is(Clipperz.Crypto.RSA.decryptUsingPrivateKey(rsaPublicKey, publicEncryptedValue), randomValue);
69 is(Clipperz.Crypto.RSA.decryptUsingPublicKey(rsaPublicKey, privateEncryptedValue), randomValue);
70
71 //-------------------------------------------------------------------------
72} catch (err) {
73
74 var s = "test suite failure!\n";
75 var o = {};
76 var k = null;
77 for (k in err) {
78 // ensure unique keys?!
79 if (!o[k]) {
80 s += k + ": " + err[k] + "\n";
81 o[k] = err[k];
82 }
83 }
84 ok ( false, s );
85}
86
87</script>
88</pre>
89</body>
90</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
new file mode 100644
index 0000000..1c88213
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
@@ -0,0 +1,175 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Crypto.SHA - TEST</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
45
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
47
48
49 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
50
51</head>
52<body>
53<pre id="test">
54<script type="text/javascript" src="SHA.test.js"></script>
55</pre>
56</body>
57</html>
58
59
60
61<!-- html>
62<head>
63 <script>
64 jslog_config_enabled = true;
65 clipperz_profiling_enabled = true;
66 </script>
67
68 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
69 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
70 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
71 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
72
73 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
77
78 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
79</head>
80<body>
81<pre id="test">
82<script type="text/javascript">
83
84try {
85 varbyteArray;
86 varhash;
87 var longText;
88 var startTime, endTime;
89
90 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
91
92 //-------------------------------------------------------------------------
93 //
94 //Test of SHA-256 algorithm
95 //
96 //-------------------------------------------------------------------------
97
98 byteArray = new Clipperz.ByteArray();
99 hash = Clipperz.Crypto.SHA.sha256(byteArray);
100 is(hash.toHexString(), "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "sha256('')");
101
102 byteArray = new Clipperz.ByteArray("0xbd");
103 hash = Clipperz.Crypto.SHA.sha256(byteArray);
104 is(hash.toHexString(), "0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b", "sha256('0xbd')");
105
106 byteArray = new Clipperz.ByteArray("0x5fd4");
107 hash = Clipperz.Crypto.SHA.sha256(byteArray);
108 is(hash.toHexString(), "0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788", "sha256('0x5fd4')");
109
110 byteArray = new Clipperz.ByteArray("0xc98c8e55");
111 hash = Clipperz.Crypto.SHA.sha256(byteArray);
112 is(hash.toHexString(), "0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504", "sha256('0xc98c8e55')");
113
114 byteArray = new Clipperz.ByteArray("0x0df1cd526b5a4edd");
115 hash = Clipperz.Crypto.SHA.sha256(byteArray);
116 is(hash.toHexString(), "0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c", "sha256('0x0df1cd526b5a4edd')");
117
118 byteArray = new Clipperz.ByteArray("0xfdf4700984ee11b70af1880d0e0fefd4");
119 hash = Clipperz.Crypto.SHA.sha256(byteArray);
120 is(hash.toHexString(),
121 "0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c",
122 "sha256('0xfdf4700984ee11b70af1880d0e0fefd4')");
123
124 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb");
125 hash = Clipperz.Crypto.SHA.sha256(byteArray);
126 is(hash.toHexString(),
127 "0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d",
128 "sha256('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb')");
129
130 byteArray = new Clipperz.ByteArray("0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a");
131 hash = Clipperz.Crypto.SHA.sha256(byteArray);
132 is(hash.toHexString(),
133 "0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3",
134 "sha256('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a')");
135
136 byteArray = new Clipperz.ByteArray("0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad");
137 hash = Clipperz.Crypto.SHA.sha256(byteArray);
138 is(hash.toHexString(),
139 "0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454",
140 "sha256('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad')");
141
142
143 byteArray = new Clipperz.ByteArray(longText);
144startTime = new Date();
145//console.profile("SHA256");
146 hash = Clipperz.Crypto.SHA.sha256(byteArray);
147//console.profileEnd("SHA256");
148endTime = new Date();
149 is(hash.toHexString(),
150 "0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949",
151 "sha256(longText)");
152 is((endTime - startTime) < 500, true, "Long text hash performance (" + (endTime - startTime) + ")");
153 MochiKit.Logging.logDebug("elapsed time: " + (endTime - startTime));
154
155//#############################################################################
156
157} catch (err) {
158
159 var s = "test suite failure!\n";
160 var o = {};
161 var k = null;
162 for (k in err) {
163 // ensure unique keys?!
164 if (!o[k]) {
165 s += k + ": " + err[k] + "\n";
166 o[k] = err[k];
167 }
168 }
169 ok ( false, s );
170}
171
172</script>
173</pre>
174</body>
175</html -->
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js
new file mode 100644
index 0000000..c9f1f3b
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js
@@ -0,0 +1,84 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29var testSHA = function (aValue, anExpectedResult) {
30 var byteArrayValue;
31
32 byteArrayValue = new Clipperz.ByteArray(aValue);
33 hash = Clipperz.Crypto.SHA.sha256(byteArrayValue);
34 is(hash.toHexString(), anExpectedResult, "sha256(' " + byteArrayValue.toHexString() + "')");
35
36}
37
38
39var tests = {
40
41 'basic_tests': function (someTestArgs) {
42 testSHA('', '0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
43 testSHA('0xbd', '0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b');
44 testSHA('0x5fd4', '0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788');
45 testSHA('0xc98c8e55', '0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504');
46 testSHA('0x0df1cd526b5a4edd', '0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c');
47 testSHA('0xfdf4700984ee11b70af1880d0e0fefd4', '0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c');
48 testSHA('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb', '0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d');
49 testSHA('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a', '0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3');
50 testSHA('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad', '0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454');
51
52 },
53
54 //-------------------------------------------------------------------------
55
56 'aldo_cortesi_tests': function (someTestArgs) {
57 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xa3f01b6939256127582ac8ae9fb47a382a244680806a3f613a118851c1ca1d47');
58 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xb35439a4ac6f0948b6d6f9e3c6af0f5f590ce20f1bde7090ef7970686ec6738a');
59 testSHA('0x79', '0xa1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa');
60 testSHA('0x80', '0x76be8b528d0075f7aae98d6fa57a6d3c83ae480a8469e668d7b0af968995ac71');
61 },
62
63 //-------------------------------------------------------------------------
64
65 'longTextPerformance_test': function (someTestArgs) {
66 var longText;
67 var startTime;
68 var endTime;
69
70 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
71 startTime = new Date();
72 testSHA(longText, '0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949');
73 endTime = new Date();
74
75 is((endTime - startTime) < 100, true, "Long text hash performance (" + (endTime - startTime) + ")");
76 },
77
78 //-------------------------------------------------------------------------
79 'syntaxFix': MochiKit.Base.noop
80}
81
82//=============================================================================
83
84SimpleTest.runDeferredTests("Clipperz.Crypto.SHA", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
new file mode 100644
index 0000000..63278c4
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
@@ -0,0 +1,161 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
47</head>
48<body>
49<pre id="test">
50<script type="text/javascript">
51hashString = function(aValue) {
52 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aValue)).toHexString().substring(2)
53}
54try {
55 varusername;
56 varpassphrase;
57
58 var C;
59 var P;
60 var encryptedText_1;
61 var encryptedText_2;
62 varsalt;
63 varx;
64 var v;
65 var v1;
66
67 username = "giulio.cesare";
68 passphrase = "trustno1";
69
70 C = hashString(username);
71 is (C, "bde3c7b5fdcd9d6ce72782ca1ae912fc4397d668fcb3a73a04e5d47852670c4a", "C");
72
73 P = hashString(passphrase + username);
74 is (P, "d79f5c5a04e91e1c85fb64cb6ee9481cb52c181047f69da02cd6c3ce6d058a76", "P");
75
76 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988";
77
78 x = hashString(salt + P);
79 is(x, "21fe88a158e420aade86e00b5eb12a4c19bf15482fa34c542c90b1afdbd5b5fd", "x");
80
81 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
82 is(v.asString(10), "33816467430011076413789931449607305355248467973000153409872503376381719918118", "v");
83 is(v.asString(16), "4ac37139dbf32ebabd2c43f91dd085066d3c457d059efd5902d32ed247fcb626", "v (base 16)");
84
85 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
86 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
87 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result");
88
89 //-------------------------------------------------------------------------
90
91 username = "giulio.cesare.debug";
92 passphrase = "trustno1";
93
94 C = hashString(username);
95 is (C, "fa1af609123b97a10d676158ed538d4657a89ac33a102b22bd9a66712039e208", "C");
96
97 P = hashString(passphrase + username);
98 is (P, "e1bfba03dd626b12f29458a6ad63fb2c01b4765548504e1e2f6b1503c82e4253", "P");
99
100 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988";
101
102 x = hashString(salt + P);
103 is(x, "93d4af3cdcd2447a745d309826dff3161feed4b15f32db8e909ff032a2bc8fb8", "x");
104
105 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
106 is(v.asString(10), "115049747015252903452664067168789229427785288458366249918596663144588656606556", "v");
107
108 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
109 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
110 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result");
111
112 //-------------------------------------------------------------------------
113
114 var srpConnection;
115 var C, P, salt;
116
117 C = "da8602c2f847306f4eb9acdaad925277d1fad1408f173f128a078aea15e60b1e";
118 P = "77643559beca49dd21c1c31db10bb0a9009662cb504413dc3fa3b7303c7e02ba";
119 salt ="000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1";
120
121 srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256});
122 srpConnection._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
123 srpConnection.set_s(new Clipperz.Crypto.BigInt(salt, 16));
124 is (srpConnection.s().asString(16, 64), salt, "salt read/write is coherent");
125 srpConnection.set_B(new Clipperz.Crypto.BigInt("123541032067854367017620977654446651448957899464139861291542193929199957895435", 10));
126
127 is(srpConnection.serverSideCredentialsWithSalt(salt).v,
128 "c73169c8236d37bf9ef11a2349e3064b7dc6e883a58d64443ea9235677520030",
129 "server side credentials - v"
130 )
131 is(srpConnection.S(), "84134227508133659832466942692590826994401065200828529664948840490489960952050", "Server side 'S'");
132//MochiKit.Logging.logDebug("=== serverSideCredentials: " + MochiKit.Base.serializeJSON(srpConnection.serverSideCredentialsWithSalt(salt)));
133
134 srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256});
135 try {
136 srpConnection.set_B(new Clipperz.Crypto.BigInt("0", 10));
137 ok(false, "Setting B to 0 should raise an exception");
138 } catch(e) {
139 ok(true, "Setting B to 0 should raise an exception");
140 }
141 //-------------------------------------------------------------------------
142
143} catch (err) {
144
145 var s = "test suite failure!\n";
146 var o = {};
147 var k = null;
148 for (k in err) {
149 // ensure unique keys?!
150 if (!o[k]) {
151 s += k + ": " + err[k] + "\n";
152 o[k] = err[k];
153 }
154 }
155 ok ( false, s );
156}
157
158</script>
159</pre>
160</body>
161</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
new file mode 100644
index 0000000..63f7610
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
@@ -0,0 +1,122 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Crypto.Usage - TEST</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37
38 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
39
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
45
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
49
50</head>
51<body>
52<pre id="test">
53<script type="text/javascript">
54Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
55
56MochiKit.Base.update(Clipperz, {
57 'PM': {
58 'Crypto': {
59 'passwordEntropy': function(aValue) {
60 var result;
61 varbitPerChar;
62
63 bitPerChar = 4;
64 if (/[a-z]/.test(aValue)) {
65 bitPerChar ++;
66 }
67 if (/[A-Z]/.test(aValue)) {
68 bitPerChar ++;
69 }
70 if (/[^a-zA-Z0-9]/.test(aValue)) {
71 bitPerChar ++;
72 }
73 //MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar);
74
75 result = aValue.length * bitPerChar;
76
77 return result;
78 }
79 }
80 }
81})
82
83try {
84 var keyValue;
85 var keyEntropy;
86 varkey;
87 var plainText;
88 var cypherText;
89 var randomBytes;
90 var hashedValue;
91
92 key = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("This is my long and complex passphrase"));
93 keyEntropy = Clipperz.PM.Crypto.passwordEntropy(key);
94
95 cypherText = Clipperz.Crypto.AES.encrypt(key, new Clipperz.ByteArray("some text to encrypt"));
96 plainText = Clipperz.Crypto.AES.decrypt(key, cypherText).asString();
97 is(plainText, "some text to encrypt");
98
99 randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(256/8);
100 hashedValue = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("text to hash"));
101
102//#############################################################################
103
104} catch (err) {
105
106 var s = "test suite failure!\n";
107 var o = {};
108 var k = null;
109 for (k in err) {
110 // ensure unique keys?!
111 if (!o[k]) {
112 s += k + ": " + err[k] + "\n";
113 o[k] = err[k];
114 }
115 }
116 ok ( false, s );
117}
118
119</script>
120</pre>
121</body>
122</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/index.html b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html
new file mode 100644
index 0000000..67487ac
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html
@@ -0,0 +1,58 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Crypto.* - tests</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script>
35</head>
36<body>
37<script>
38TestRunner.runTests(
39 'AES.html',
40 'AES.performance.html',
41 'Base.html',
42 'BigInt.html',
43
44 //'ECC.B283.deferred.html',
45 //'ECC.BinaryField.FiniteField.html',
46 //'ECC.BinaryField.FiniteField.B283.html',
47 //'ECC.BinaryField.Value.html',
48 //#'ECC.K283.deferred.html',
49
50 'PRNG.html',
51 //'RSA.html',
52 'SHA.html',
53 'SRP.html',
54 'Usage.html'
55);
56</script>
57</body>
58</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js
new file mode 100644
index 0000000..e9db091
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js
@@ -0,0 +1,1577 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29/* jsCrypto
30Core AES
31
32Emily Stark (estark@stanford.edu)
33Mike Hamburg (mhamburg@stanford.edu)
34Dan Boneh (dabo@cs.stanford.edu)
35
36Symmetric AES in Javascript using precomputed lookup tables for round transformations rather for speed improvements
37and code size reduction. Provides authenticated encryption in OCB and CCM modes.
38Parts of this code are based on the OpenSSL implementation of AES: http://www.openssl.org
39
40Public domain, 2009.
41
42*/
43
44
45// CCM mode is the default
46var CCM = 1, OCB = 2;
47
48/* aes object constructor. Takes as arguments:
49- 16-byte key, or an array of 4 32-bit words
50- Optionally specify a mode (aes.OCB or aes.CCM). Defaults to CCM
51- Optionally specify a MAC tag length for integrity. Defaults to 16 bytes
52*/
53function aes(key, mode, Tlen) {
54 // initialize objects for CCM and OCB modes
55 this._CCM = new cipherCCM(this);
56 this._OCB = new cipherOCB(this);
57
58 this._decryptScheduled = false;
59
60 if (mode) this._mode = mode;
61 else this._mode = OCB;
62
63 // AES round constants
64 this._RCON = [
65 [0x00, 0x00, 0x00, 0x00],
66 [0x01, 0x00, 0x00, 0x00],
67 [0x02, 0x00, 0x00, 0x00],
68 [0x04, 0x00, 0x00, 0x00],
69 [0x08, 0x00, 0x00, 0x00],
70 [0x10, 0x00, 0x00, 0x00],
71 [0x20, 0x00, 0x00, 0x00],
72 [0x40, 0x00, 0x00, 0x00],
73 [0x80, 0x00, 0x00, 0x00],
74 [0x1b, 0x00, 0x00, 0x00],
75 [0x36, 0x00, 0x00, 0x00]
76 ];
77
78 this._key_len = 16;
79 if (key.length == 4) {
80 this._key = [];
81 aes.wordsToBytes(key, this._key);
82 }
83 else
84 this._key = key;
85
86 if (Tlen) this._Tlen = Tlen;
87 else this._Tlen = 16; // tag length in bytes
88
89 this._nr = 10;
90
91 // initialize tables that will be precomputed
92 this._SBOX = [];
93 this._INV_SBOX = [];
94 this._T = new Array(4);
95 this._Tin = new Array(4);
96 for (var i=0; i < 4; i++) {
97 this._T[i] = [];
98 this._Tin[i] = [];
99 }
100
101 this._precompute();
102 this.scheduleEncrypt();
103
104 // initialize encryption and decryption buffers
105 this._ctBuffer = [];
106 this._ptBuffer = [];
107}
108
109
110//////////////////
111// KEY SCHEDULING
112//////////////////
113
114aes.prototype.scheduleEncrypt = function () {
115 this._decryptScheduled = false;
116
117 this._w = new Array(this._nr+1);
118 this._w[0] = new Array(4);
119 for (var i=0; i < 4; i++)
120 this._w[0][i] = this._key[i];
121 var temp = new Array(4);
122 for (var i=1; i < this._nr+1; i++) {
123 temp[0] = this._w[i-1][3];
124 this._w[i] = new Array(4);
125 temp[0] = (this._T[2][(temp[0]>>>16)&0xff] & 0xff000000) ^ (this._T[3][(temp[0]>>>8)&0xff]&0x00ff0000) ^ (this._T[0][(temp[0]&0xff)]&0x0000ff00) ^ (this._T[1][(temp[0]>>>24)]&0x000000ff) ^ (this._RCON[i][0]<<24);
126 this._w[i][0] = this._w[i-1][0] ^ temp[0];
127 for (var j=1; j < 4; j++) {
128 temp[j] = this._w[i][j-1];
129 this._w[i][j] = this._w[i-1][j] ^ temp[j];
130 }
131 }
132};
133
134aes.prototype.scheduleDecrypt = function() {
135
136 if (!this._w) this.scheduleEncrypt();
137 this._decryptScheduled = true;
138 var temp = [];
139 var j = this._w.length-1;
140 for (var i=0; i<j; i++) {
141 temp[0] = this._w[i][0];
142 temp[1] = this._w[i][1];
143 temp[2] = this._w[i][2];
144 temp[3] = this._w[i][3];
145 this._w[i][0] = this._w[j][0];
146 this._w[i][1] = this._w[j][1];
147 this._w[i][2] = this._w[j][2];
148 this._w[i][3] = this._w[j][3];
149 this._w[j][0] = temp[0];
150 this._w[j][1] = temp[1];
151 this._w[j][2] = temp[2];
152 this._w[j][3] = temp[3];
153 j--;
154 }
155
156 var td0 = this._Tin[0], td1 = this._Tin[1], td2 = this._Tin[2], td3 = this._Tin[3], te1 = this._T[1];
157 for (var i=1; i < this._w.length-1; i++) {
158 this._w[i][0] = td0[te1[(this._w[i][0] >>> 24) ] & 0xff] ^
159 td1[te1[(this._w[i][0] >>> 16) & 0xff] & 0xff] ^
160 td2[te1[(this._w[i][0] >>> 8) & 0xff] & 0xff] ^
161 td3[te1[(this._w[i][0] ) & 0xff] & 0xff];
162 this._w[i][1] = td0[te1[(this._w[i][1] >>> 24) ] & 0xff] ^
163 td1[te1[(this._w[i][1] >>> 16) & 0xff] & 0xff] ^
164 td2[te1[(this._w[i][1] >>> 8) & 0xff] & 0xff] ^
165 td3[te1[(this._w[i][1] ) & 0xff] & 0xff];
166 this._w[i][2] = td0[te1[(this._w[i][2] >>> 24) ] & 0xff] ^
167 td1[te1[(this._w[i][2] >>> 16) & 0xff] & 0xff] ^
168 td2[te1[(this._w[i][2] >>> 8) & 0xff] & 0xff] ^
169 td3[te1[(this._w[i][2] ) & 0xff] & 0xff];
170 this._w[i][3] = td0[te1[(this._w[i][3] >>> 24) ] & 0xff] ^
171 td1[te1[(this._w[i][3] >>> 16) & 0xff] & 0xff] ^
172 td2[te1[(this._w[i][3] >>> 8) & 0xff] & 0xff] ^
173 td3[te1[(this._w[i][3] ) & 0xff] & 0xff];
174 }
175};
176
177
178/////////////////////////
179// ENCRYPTION/DECRYPTION
180/////////////////////////
181
182
183/* Authenticated encryption on a multi-block message in OCB or CCM mode.
184iv should be an array of 32-bit words - either 4 words for OCB mode or 1, 2, or 3 words for CCM.
185Use a unique IV for every message encrypted.
186The plaintext argument will be encrypted and MACed; adata will be sent in plaintext but MACed.
187Plaintext and adata are strings.
188ciphertext is an array of bytes. tag is an array of 32-bit words.
189*/
190aes.prototype.encrypt = function(iv, plaintext, ciphertext, adata, tag) {
191 var plaintextBytes = [], adataBytes = [];
192 aes.asciiToBytes(plaintext, plaintextBytes);
193 aes.asciiToBytes(adata, adataBytes);
194
195 this._iv = iv;
196 if (this._mode == CCM)
197 this._CCM.encrypt(plaintextBytes, ciphertext, adataBytes, tag);
198 else if (this._mode == OCB) {
199 this._OCB.encrypt(plaintextBytes, ciphertext, adataBytes, tag);
200 }
201
202 // prepend to the ciphertext the length of the iv (in bytes) and the iv
203 var ivbytes=[];
204 aes.wordsToBytes(iv, ivbytes);
205 var ct = [iv.length*4].concat(ivbytes, ciphertext);
206 for (var i=0; i < ct.length; i++) ciphertext[i] = ct[i];
207
208 for (var i=0; i < ciphertext.length; i++)
209 this._ctBuffer[this._ctBuffer.length] = ciphertext[i];
210
211};
212
213/* Authenticated decryption on a multi-block ciphertext in OCB or CCM mode.
214ciphertext is an array of bytes. tag is an array of 32-bit words.
215plaintext and adata are strings.
216*/
217aes.prototype.decrypt = function(ciphertext, adata, tag) {
218 var ivlen = ciphertext[0];
219 var ivbytes = ciphertext.slice(1, ivlen+1);
220 var iv = [];
221 aes.bytesToWords(ivbytes, iv);
222 this._iv = iv;
223 var ct = ciphertext.slice(ivlen+1);
224
225 var valid = false;
226 var plaintextBytes = [], adataBytes = [];
227 aes.asciiToBytes(adata, adataBytes);
228 if (this._mode == CCM)
229 valid = this._CCM.decrypt(ct, plaintextBytes, adataBytes);
230 else if (this._mode == OCB)
231 valid = this._OCB.decrypt(ct, plaintextBytes, adataBytes, tag);
232 if (valid) {
233 var plaintext = aes.bytesToAscii(plaintextBytes);
234 for (var i=0; i < plaintext.length; i++)
235 this._ptBuffer[this._ptBuffer.length] = plaintext.charAt(i);
236 return plaintext;
237 }
238 return "";
239};
240
241// MACs (but doesn't encrypt) data using CMAC (in CCM mode) or PMAC (in OCB mode)
242aes.prototype.sign = function(data, tag) {
243 if (this._mode == CCM)
244 this._CCM.CMAC(data, "", tag, this._Tlen, false);
245 else if (this._mode == OCB) {
246 this._OCB.PMAC(data, tag);
247 }
248};
249
250// Verifies a CMAC or PMAC tag
251aes.prototype.verify = function(data, tag) {
252 var validTag = [];
253 if (this._mode == CCM)
254 this._CCM.CMAC(data, "", validTag, this._Tlen, false);
255 else if (this._mode == OCB) {
256 this._OCB.PMAC(data, validTag);
257 }
258 if (validTag.length != tag.length) return false;
259 for (var i=0; i < tag.length; i++) {
260 if (tag[i] != validTag[i]) return false;
261 }
262 return true;
263};
264
265/* Encrypts a single block message in AES. Takes the plaintext, an array in which to dump
266the ciphertext, and a boolean decrypt argument. If set to true, this function acts as
267a decryption function.
268block and ciphertext are both arrays of 4 32-bit words.
269*/
270aes.prototype.encryptBlock = function(block, ciphertext, decrypt) {
271 if (!decrypt && this._decryptScheduled) this.scheduleEncrypt();
272
273 // get key schedule
274 var w = this._w;
275 // load round transformation tables
276 var te0, te1, te2, te3;
277 if (decrypt) {
278 te0 = this._Tin[0];
279 te1 = this._Tin[1];
280 te2 = this._Tin[2];
281 te3 = this._Tin[3];
282 } else {
283 te0 = this._T[0];
284 te1 = this._T[1];
285 te2 = this._T[2];
286 te3 = this._T[3];
287 }
288
289 // perform rounds
290 var rk = w[0];
291 var s0 = block[0] ^ rk[0];
292 var s1 = block[1] ^ rk[1];
293 var s2 = block[2] ^ rk[2];
294 var s3 = block[3] ^ rk[3];
295 var t0,t1,t2,t3;
296 rk = w[1];
297 var order = [];
298 for (var round = 1; round < w.length-1; round++) {
299 order = [s1, s2, s3, s0];
300 if (decrypt) order = [s3, s0, s1, s2];
301 t0 = te0[(s0>>>24)] ^ te1[(order[0]>>>16) & 0xff]^ te2[(s2>>>8)&0xff] ^ te3[order[2]&0xff] ^ rk[0];
302 t1 = te0[(s1>>>24)] ^ te1[(order[1]>>>16) & 0xff]^ te2[(s3>>>8)&0xff] ^ te3[order[3]&0xff] ^ rk[1];
303 t2 = te0[(s2>>>24)] ^ te1[(order[2]>>>16) & 0xff]^ te2[(s0>>>8)&0xff] ^ te3[order[0]&0xff] ^ rk[2];
304 t3 = te0[(s3>>>24)] ^ te1[(order[3]>>>16) & 0xff]^ te2[(s1>>>8)&0xff] ^ te3[order[1]&0xff] ^ rk[3];
305 s0 = t0;
306 s1 = t1;
307 s2 = t2;
308 s3 = t3;
309 rk = w[round+1];
310 }
311 if (decrypt) {
312 s0 = ((this._INV_SBOX[(t0>>>24)])<<24) ^ ((this._INV_SBOX[(t3>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t2>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t1)&0xff]) ^ rk[0];
313 s1 = ((this._INV_SBOX[(t1>>>24)])<<24) ^ ((this._INV_SBOX[(t0>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t3>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t2)&0xff]) ^ rk[1]
314 s2 = ((this._INV_SBOX[(t2>>>24)])<<24) ^ ((this._INV_SBOX[(t1>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t0>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t3)&0xff]) ^ rk[2];
315 s3 = (this._INV_SBOX[(t3>>>24)]<<24) ^ (this._INV_SBOX[(t2>>>16)&0xff]<<16) ^ (this._INV_SBOX[(t1>>>8)&0xff]<<8) ^ (this._INV_SBOX[(t0)&0xff]) ^ rk[3];
316 } else {
317 s0 = (te2[t0>>>24]&0xff000000) ^ (te3[(t1>>>16)&0xff]&0x00ff0000) ^ (te0[(t2>>>8)&0xff]&0x0000ff00) ^ (te1[(t3)&0xff]&0x000000ff) ^ rk[0];
318 s1 = (te2[t1>>>24]&0xff000000) ^ (te3[(t2>>>16)&0xff]&0x00ff0000) ^ (te0[(t3>>>8)&0xff]&0x0000ff00) ^ (te1[(t0)&0xff]&0x000000ff) ^ rk[1];
319 s2 = (te2[t2>>>24]&0xff000000) ^ (te3[(t3>>>16)&0xff]&0x00ff0000) ^ (te0[(t0>>>8)&0xff]&0x0000ff00) ^ (te1[(t1)&0xff]&0x000000ff) ^ rk[2];
320 s3 = (te2[t3>>>24]&0xff000000) ^ (te3[(t0>>>16)&0xff]&0x00ff0000) ^ (te0[(t1>>>8)&0xff]&0x0000ff00) ^ (te1[(t2)&0xff]&0x000000ff) ^ rk[3];
321 }
322 ciphertext[0] = s0;
323 ciphertext[1] = s1;
324 ciphertext[2] = s2;
325 ciphertext[3] = s3;
326};
327
328// As above, block and plaintext are arrays of 4 32-bit words.
329aes.prototype.decryptBlock = function(block, plaintext) {
330 if (!this._decryptScheduled) this.scheduleDecrypt();
331
332 this.encryptBlock(block, plaintext, true);
333};
334
335
336////////////////////
337// HELPER FUNCTIONS
338////////////////////
339
340aes._hex = function(n) {
341 var out = "",i,digits="0123456789ABCDEF";
342 for (i=0; i<8; i++) {
343 var digit = n&0xF;
344 out = digits.substring(digit,digit+1) + out;
345 n = n >>> 4;
346 }
347 return out;
348}
349
350aes._hexall = function(nn) {
351 var out = "",i;
352 for (i=0;i<nn.length;i++) {
353 if (i%4 == 0) out+= "<br/>\n";
354 else if (i) out += " ";
355 out += aes._hex(nn[i]);
356 }
357 return out;
358}
359
360aes.bytesToAscii = function(bytes) {
361 var ascii = "";
362 var len = bytes.length;
363 for (var i=0; i < len; i++) {
364 ascii = ascii + String.fromCharCode(bytes[i]);
365 }
366 return ascii;
367};
368
369aes.asciiToBytes = function(ascii, bytes) {
370 var len = ascii.length;
371 for (var i=0; i < len; i++)
372 bytes[i] = ascii.charCodeAt(i);
373};
374
375aes.wordsToBytes = function(words, bytes) {
376 var bitmask = 1;
377 for (var i=0; i < 7; i++) bitmask = (bitmask << 1) | 1;
378 for (var i=0; i < words.length; i++) {
379 var bstart = i*4;
380 for (var j=0; j < 4; j++) {
381 bytes[bstart+j] = (words[i] & (bitmask << (8*(3-j)))) >>> (8*(3-j));
382 }
383 }
384};
385
386aes.bytesToWords = function(bytes, words) {
387 var paddedBytes = bytes.slice();
388 while (paddedBytes.length % 4 != 0) paddedBytes.push(0);
389 var num_words = Math.floor(paddedBytes.length/4);
390 for (var j=0; j < num_words; j++)
391 words[j] = ((paddedBytes[(j<<2)+3]) | (paddedBytes[(j<<2)+2] << 8) | (paddedBytes[(j<<2)+1] << 16) | (paddedBytes[j<<2] << 24));
392};
393
394
395///////////////////////////////////////
396// KEY DERIVATION
397//////////////////////////////////////
398
399// password is a string, presumably a password entered by the user.
400// salt is eight random bytes associated with each user
401// This function returns an array of bytes of length 16
402function generateKey(password, salt) {
403 var pwBytes = [];
404 aes.asciiToBytes(password, pwBytes);
405 var pwWords = [], saltWords = [];
406 aes.bytesToWords(pwBytes, pwWords);
407 aes.bytesToWords(salt, saltWords);
408
409 var iterations = 1000;
410
411 var derivedKey = [];
412 var blockIndex = 1;
413
414 var xorHashes = function(h1, h2) {
415 var xor = [];
416 var i;
417 for (i=0; i < h1.length; i++) xor.push(h1[i] ^ h2[i]);
418 return xor;
419 };
420
421 while (derivedKey.length < 16) {
422 var hashBytes = pwWords.concat(saltWords);
423 hashBytes.push(blockIndex);
424 var T = SHA256.hash_words_big_endian(hashBytes);
425 var u = T;
426 for (var i=2; i < iterations; i++) {
427 var hash = SHA256.hash_words_big_endian(pwWords.concat(u));
428 u = xorHashes(T, hash);
429 }
430 var block = [];
431 aes.wordsToBytes(T, block);
432 for (var i=0; i < block.length; i++) derivedKey.push(block[i]);
433 }
434
435 if (derivedKey.length > 16) derivedKey.length = 16;
436 return derivedKey;
437}
438
439///////////////////////////////////////
440// ROUND TRANSFORMATION PRECOMPUTATION
441///////////////////////////////////////
442
443
444// Precomputation code by Mike Hamburg
445
446aes.prototype._precompute = function() {
447 var x,xi,sx,tx,tisx,i;
448 var d=[];
449
450 /* compute double table */
451 for (x=0;x<256;x++) {
452 d[x]= x&128 ? x<<1 ^ 0x11b : x<<1;
453 //d[x] = x<<1 ^ (x>>7)*0x11b; //but I think that's less clear.
454 }
455
456 /* Compute the round tables.
457 *
458 * We'll need access to x and x^-1, which we'll get by walking
459 * GF(2^8) as generated by (82,5).
460 */
461 for(x=xi=0;;) {
462 // compute sx := sbox(x)
463 sx = xi^ xi<<1 ^ xi<<2 ^ xi<<3 ^ xi<<4;
464 sx = sx>>8 ^ sx&0xFF ^ 0x63;
465
466 var dsx = d[sx], x2=d[x],x4=d[x2],x8=d[x4];
467
468 // te(x) = rotations of (2,1,1,3) * sx
469 tx = dsx<<24 ^ sx<<16 ^ sx<<8 ^ sx^dsx;
470
471 // similarly, td(sx) = (E,9,D,B) * x
472 tisx = (x8^x4^x2) <<24 ^
473 (x8^x ) <<16 ^
474 (x8^x4^x ) << 8 ^
475 (x8^x2^x );
476
477 // This can be done by multiplication instead but I think that's less clear
478 // tisx = x8*0x1010101 ^ x4*0x1000100 ^ x2*0x1000001 ^ x*0x10101;
479 // tx = dsx*0x1000001^sx*0x10101;
480
481 // rotate and load
482 for (i=0;i<4;i++) {
483 this._T[i][x] = tx;
484 this._Tin[i][sx] = tisx;
485 tx = tx<<24 | tx>>>8;
486 tisx = tisx<<24 | tisx>>>8;
487 }
488
489 // te[4] is the sbox; td[4] is its inverse
490 this._SBOX[ x] = sx;
491 this._INV_SBOX[sx] = x;
492
493
494 // wonky iteration goes through 0
495 if (x==5) {
496 break;
497 } else if (x) {
498 x = x2^d[d[d[x8^x2]]]; // x *= 82 = 0b1010010
499 xi ^= d[d[xi]]; // xi *= 5 = 0b101
500 } else {
501 x=xi=1;
502 }
503 }
504
505 // We computed the arrays out of order. On Firefox, this matters.
506 // Compact them.
507 for (i=0; i<4; i++) {
508 this._T[i] = this._T[i].slice(0);
509 this._Tin[i] = this._Tin[i].slice(0);
510 }
511 this._SBOX = this._SBOX.slice(0);
512 this._INV_SBOX = this._INV_SBOX.slice(0);
513
514
515};
516
517
518
519
520
521/* jsCrypto
522CCM mode
523
524Emily Stark (estark@stanford.edu)
525Mike Hamburg (mhamburg@stanford.edu)
526Dan Boneh (dabo@cs.stanford.edu)
527
528CCM mode for authenticated encryption of multiple 16-byte blocks. Uses AES as core cipher.
529
530Public domain, 2009.
531
532*/
533
534// Constructor takes an aes object as its core cipher
535function cipherCCM(cipher) {
536 this._cipher = cipher;
537}
538
539/* Formats plaintext and adata for MACing and encryption.
540adata and plaintext are arrays of bytes, B will be an array of arrays of 16 bytes
541Tlen specifies the number of bytes in the tag.
542Formatted according to the CCM specification.
543 */
544cipherCCM.prototype._formatInput = function(adata, plaintext, Tlen, B) {
545 // compute B[0]
546 var flags, nbytes=[];
547 aes.wordsToBytes(this._cipher._iv, nbytes);
548 if (adata) flags = 0x01<<6;
549 else flags = 0x00<<6;
550 flags = flags | (((Tlen-2)/2)<<3); // (t-2)/2
551 var q = 15-this._cipher._iv.length*4;
552 flags = flags | (q-1);
553 B[0] = new Array(16);
554 B[0][0] = flags;
555 for (var i=1; i <= 15-q; i++) B[0][i] = nbytes[i-1];
556 var Q = plaintext.length;
557
558 // make some bitmasks
559 var bitmask = 1;
560 for (var i=0; i < 7; i++) bitmask = (bitmask<<1) | 1;
561 for (var i=15; i > 15-q; i--) {
562 B[0][i] = Q & bitmask;
563 Q = Q>>>8;
564 }
565
566 // compute the blocks which identify adata
567 if (adata) {
568 var a = adata.length, Bind=1, BIind = 0, aind=0;
569 B[1] = new Array(16);
570 if (a < (2<<16 - 2<<8)) {
571 B[1][0] = a>>>8;
572 B[1][1] = a & bitmask;
573 BIind = 2;
574 } else if (a < (2<<32)) {
575 B[1][0] = 0xff;
576 B[1][1] = 0xfe;
577 for (var i=5; i >= 0; i--) {
578 B[1][2+i] = a & bitmask;
579 a = a>>>8;
580 }
581 BIind=8;
582 } else {
583 B[1][0] = 0xff;
584 B[1][0] = 0xff;
585 for (i=9; i >= 0; i--) {
586 B[1][2+i] = a & bitmask;
587 a = a >>> 8;
588 }
589 BIind = 12;
590 }
591 }
592
593 while (aind < adata.length) {
594 B[Bind][BIind] = adata[aind];
595 aind++;
596 if (BIind == 15) {
597 Bind++;
598 BIind = 0;
599 if (aind != adata.length) B[Bind] = new Array(16);
600 } else BIind++;
601 }
602 if (BIind != 0) {
603 while (BIind <= 15) {
604 B[Bind][BIind] = 0x00;
605 BIind++;
606 }
607 }
608
609 Bind++;
610 BIind=0;
611 B[Bind] = new Array(16);
612
613 // compute the payload blocks
614 var pind = 0;
615 while (pind < plaintext.length) {
616 B[Bind][BIind] = plaintext[pind];
617 pind++;
618 if (BIind == 15) {
619 Bind++;
620 BIind = 0;
621 if (pind != plaintext.length) B[Bind] = new Array(16);
622 } else BIind++;
623 }
624 if (BIind != 0) {
625 while (BIind <= 15) {
626 B[Bind][BIind] = 0x00;
627 BIind++;
628 }
629 }
630
631};
632
633/* Generate the blocks that will be used as counters.
634ctr will be an array of m+1 arrays of 16 bytes. */
635cipherCCM.prototype._generateCtrBlocks = function(m, ctr) {
636 var nbytes = [];
637 aes.wordsToBytes(this._cipher._iv, nbytes);
638 var flags = 15 - (this._cipher._iv.length*4) - 1;
639 var bitmask = 1;
640 for (var i=0; i < 7; i++) bitmask = (bitmask<<1) | 1;
641 for (var i=0; i <= m; i++) {
642 ctr[i] = new Array(16);
643 ctr[i][0] = flags;
644 for (var j=0; j < nbytes.length; j++) {
645 ctr[i][j+1] = nbytes[j];
646 }
647 for (var j=15; j > nbytes.length; j--) {
648 ctr[i][j] = (i>>>(8*(15-j))) & bitmask;
649 }
650 }
651
652};
653
654
655/* CBC-MAC adata and plaintext, and store the tag in tag.
656adata and plaintext are arrays of bytes
657tag will be an array of Tlen/4 32-bit words
658Tlen is an integer divisible by 4 that specifies the number of bytes in the tag.
659*/
660cipherCCM.prototype.CBCMAC = function(adata, plaintext, tag, Tlen, formatInput) {
661 var B = [];
662 if (formatInput)
663 this._formatInput(adata,plaintext,Tlen,B);
664 else {
665 var Sind = 0, SIind = 0, aind = 0, alen = adata.length;
666 B[0] = [];
667 while (aind < alen) {
668 B[Sind][SIind] = adata[aind];
669 SIind++;
670 if (SIind == 16) {
671 SIind = 0;
672 Sind++;
673 if (aind != alen-1) B[Sind] = [];
674 }
675 aind++;
676 }
677 }
678 var words = [];
679 var Yprev = [], Y = [];
680 aes.bytesToWords(B[0],words);
681 this._cipher.encryptBlock(words, Y);
682 var r = B.length, t = new Array(4);
683
684 for (var i=1; i < r; i++) {
685 for (var j=0; j < 4; j++) {
686 var bstart = j*4;
687 t[j] = Y[j] ^ ((B[i][bstart++]<<24) | (B[i][bstart++]<<16) | (B[i][bstart++]<<8) | (B[i][bstart++]));
688 Yprev[j] = Y[j];
689 }
690 this._cipher.encryptBlock(t, Y);
691 }
692 for (var i=0; i < Tlen/4; i++)
693 tag[i] = Y[i];
694};
695
696
697/* Provides authenticated encryption using CBCMAC and CTR-mode encryption on plaintext.
698adata is MACed but not encrypted.
699plaintext, adata, and tag are arrays of bytes
700Tlen is the number of bytes in the tag
701ciphertext will be an array of bytes. */
702cipherCCM.prototype.encrypt = function(plaintext, ciphertext, adata, tag) {
703 var Tlen = this._cipher._Tlen;
704 this.CBCMAC(adata, plaintext, tag, Tlen, true);
705 var ctr = [], m = Math.ceil(plaintext.length/16);
706 this._generateCtrBlocks(m, ctr);
707 var cblocks = [], S=[], t = new Array(4);
708 for (var i=0; i <= m; i++) {
709 S[i] = new Array(16);
710 aes.bytesToWords(ctr[i], cblocks);
711 this._cipher.encryptBlock(cblocks, t);
712 aes.wordsToBytes(t, S[i]);
713 }
714 var Sind = 1, SIind = 0;
715 for (var i=0; i < plaintext.length; i++) {
716 ciphertext[i] = plaintext[i] ^ S[Sind][SIind];
717 SIind++;
718 if (SIind == 16) {
719 Sind++;
720 SIind = 0;
721 }
722 }
723 var tbytes = [];
724 aes.wordsToBytes(tag, tbytes);
725 var cstart = plaintext.length;
726 for (var i=0; i < Tlen; i++)
727 ciphertext[cstart+i] = tbytes[i] ^ S[0][i];
728};
729
730
731/* Decrypt and verify the MAC on ciphertext and adata. The integrity of adata is verified, but isn't decrypted.
732ciphertext, adata are arrays of bytes
733plaintext will be an array of bytes
734Returns true if tag is valid, false otherwise.
735*/
736cipherCCM.prototype.decrypt = function(ciphertext, plaintext, adata) {
737 var Tlen = this._cipher._Tlen;
738 if (ciphertext.length <= Tlen) return false;
739 var ctr = [], tag = new Array(Tlen), m = Math.ceil(ciphertext.length/16);
740 this._generateCtrBlocks(m, ctr);
741 var S = [], t = new Array(4), cblocks=[];
742
743 for (var i=0; i <= m; i++) {
744 S[i] = new Array(16);
745 aes.bytesToWords(ctr[i], cblocks);
746 this._cipher.encryptBlock(cblocks, t);
747 aes.wordsToBytes(t, S[i]);
748 }
749
750 var Sind = 1, SIind = 0;
751 for (var i=0; i < (ciphertext.length-Tlen); i++) {
752 plaintext[i] = ciphertext[i] ^ S[Sind][SIind];
753 SIind++;
754 if (SIind == 16) {
755 SIind = 0;
756 Sind++;
757 }
758 }
759
760 for (var i=0; i < Tlen; i++)
761 tag[i] = ciphertext[ciphertext.length-Tlen+i] ^ S[0][i];
762
763 // verify integrity
764 var validTag = [], vtbytes = [];
765 this.CBCMAC(adata, plaintext, validTag, Tlen, true);
766 aes.wordsToBytes(validTag, vtbytes);
767 for (var i=0; i < Tlen; i++) {
768 if (vtbytes[i] != tag[i])
769 return false;
770 }
771 return true;
772
773};
774
775// Generate subkeys according to the CCM specification. */
776cipherCCM.prototype._generateSubkeys = function(k1,k2) {
777 var t = [0x00000000,0x00000000,0x00000000,0x00000000], t2 = new Array(4);
778 this._cipher.encryptBlock(t, t2);
779 for (var i=0; i < 3; i++)
780 k1[i] = t2[i]<<1 | t2[i+1]>>>31;
781 k1[3] = t2[3]<<1;
782 if (t2[0]>>>31 != 0)
783 k1[3] = k1[3] ^ 135;
784 for (var i=0; i < 3; i++)
785 k2[i] = k1[i]<<1 | k1[i+1]>>>31;
786 k2[3] = k1[3]<<1;
787 if (k1[0]>>>31 != 0)
788 k2[3] = k2[3] ^ 135;
789};
790
791
792/* CMAC used for integrity only (no encryption). */
793cipherCCM.prototype.CMAC = function(adata, plaintext, tag, Tlen, formatInput) {
794 var B = [], t = new Array(4); // will be an array of arrays of 16 bytes
795 if (formatInput)
796 this._formatInput(adata,plaintext,Tlen,B);
797 else {
798 var Sind = 0, SIind = 0, aind = 0, alen = adata.length;
799 B[0] = [];
800 while (aind < alen) {
801 B[Sind][SIind] = adata[aind];
802 SIind++;
803 if (SIind == 16) {
804 SIind = 0;
805 Sind++;
806 if (aind != alen-1) B[Sind] = [];
807 }
808 aind++;
809 }
810 }
811 var k1 = new Array(4), k2 = new Array(4);
812 this._generateSubkeys(k1,k2);
813 var last = B.length-1, kbytes = [];
814 if (alen % 16 == 0) {
815 aes.wordsToBytes(k1, kbytes);
816 } else {
817 aes.wordsToBytes(k2, kbytes);
818 B[last][B[last].length] = 1<<7;
819 while (B[last].length % 16 != 0)
820 B[last][B[last].length] = 0x00;
821 }
822 for (var i=0; i < 16; i++) B[last][i] = B[last][i] ^ kbytes[i];
823 var C = [0x00000000,0x00000000,0x00000000,0x00000000], Cprev = new Array(4), words = new Array(4);
824 for (var i=0; i < B.length; i++) {
825 aes.bytesToWords(B[i], words);
826 for (var j=0; j < 4; j++) {
827 Cprev[j] = C[j];
828 t[j] = C[j] ^ words[j];
829 }
830 this._cipher.encryptBlock(t, C);
831 }
832 var cbytes=[];
833 aes.wordsToBytes(C, cbytes);
834 for (var i=0; i < Tlen; i++)
835 tag[i] = cbytes[i];
836
837};
838
839
840
841/* jsCrypto
842OCB mode
843
844Emily Stark (estark@stanford.edu)
845Mike Hamburg (mhamburg@stanford.edu)
846Dan Boneh (dabo@cs.stanford.edu)
847
848OCB mode for authenticated encryption of multiple 16-byte blocks. Uses AES as core cipher.
849
850Public domain, 2009.
851*/
852
853/* Constructor takes an aes object as the core cipher. */
854function cipherOCB(cipher) {
855 this._cipher = cipher;
856}
857
858
859/* Provides integrity only, no encryption.
860header is an array of bytes, tag will be an array of 4 32-bit words */
861cipherOCB.prototype.PMAC = function(header, tag) {
862 var carry, t = new Array(4), t2 = new Array(4), Checksum = [0x00000000,0x00000000,0x00000000,0x00000000];
863 var Offset = new Array(4);
864 this._cipher.encryptBlock(Checksum, Offset);
865 this._times2(t, Offset);
866 for (var i=0; i < 4; i++) Offset[i] = t[i] ^ Offset[i];
867 this._times2(t, Offset);
868 for (var i=0; i < 4; i++) Offset[i] = t[i] ^ Offset[i];
869
870 // accumulate all but the last block
871 var num_blocks = Math.floor((header.length-1)/16);
872 for (var i=0; i < num_blocks; i++) {
873 this._times2(Offset,Offset);
874 var bstart = i*16; // start-of-block index
875 for (var j=0; j < 4; j++)
876 t[j] = Offset[j] ^ ((header[bstart+(j<<2)+3]) | (header[bstart+(j<<2)+2] << 8) | (header[bstart+(j<<2)+1] << 16) | (header[bstart+(j<<2)] << 24));
877 this._cipher.encryptBlock(t, t2);
878 for (var j=0; j < 4; j++) Checksum[j] = Checksum[j] ^ t2[j];
879 }
880
881 // accumulate the last block
882 this._times2(Offset,Offset);
883
884 if (header.length%16 == 0) {
885 var bstart = header.length-16;
886 for (var j=0; j < 4; j++)
887 Checksum[j] = Checksum[j] ^ ((header[bstart+(j<<2)+3]) | (header[bstart+(j<<2)+2] << 8) | (header[bstart+(j<<2)+1] << 16) | (header[bstart+(j<<2)] << 24));
888 this._times2(t, Offset);
889 for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i];
890 } else {
891 var block_bytes = [], block = new Array(4), len = header.length, ind=0;
892 for (var i=(header.length-(header.length%16)); i < len; i++) {
893 block_bytes[ind] = header[i];
894 ind++;
895 }
896 block_bytes[ind] = 0x80;
897 ind++;
898 while (block_bytes.length%16 != 0) {
899 block_bytes[ind] = 0x00;
900 ind++;
901 }
902 aes.bytesToWords(block_bytes,block);
903 for (var j=0; j < 4; j++) {
904 var bstart = 4*j;
905 Checksum[j] = Checksum[j] ^ ((block_bytes[bstart++]<<24) | (block_bytes[bstart++]<<16) | (block_bytes[bstart++]<<8) | (block_bytes[bstart++]));
906 }
907 this._times2(t, Offset);
908 for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i];
909 this._times2(t, Offset);
910 for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i];
911 }
912
913 // compute result
914 for (var i=0; i < 4; i++) t[i] = Offset[i] ^ Checksum[i];
915 this._cipher.encryptBlock(t, tag);
916};
917
918
919/* Encrypts and MACs plaintext, only MACS header.
920plaintext, ciphertext and header are arrays of bytes. tag will be an array of 4 32-bit words. */
921cipherOCB.prototype.encrypt = function(plaintext, ciphertext, header, tag) {
922 var Checksum = [0x00000000,0x00000000,0x00000000,0x00000000];
923 var t = [0x00000000,0x00000000,0x00000000,0x00000000], t2 = new Array(4);
924 var Offset = new Array(4);
925 this._cipher.encryptBlock(this._cipher._iv, Offset);
926 var cbytes = [];
927
928 // encrypt and accumulate all but last block
929 var num_blocks = Math.floor((plaintext.length-1)/16), bstart=0, block = new Array(4);
930 for (var i=0; i < num_blocks; i++) {
931 this._times2(Offset,Offset);
932 bstart = 16*i;
933 for (var j=0; j < 4; j++)
934 block[j] = ((plaintext[bstart+(j<<2)+3]) | (plaintext[bstart+(j<<2)+2] << 8) | (plaintext[bstart+(j<<2)+1] << 16) | (plaintext[bstart+(j<<2)] << 24));
935 for (var j=0; j < 4; j++)
936 t[j] = Offset[j] ^ block[j];
937 this._cipher.encryptBlock(t,t2);
938 for (var j=0; j < 4; j++) t[j] = Offset[j] ^ t2[j];
939 aes.wordsToBytes(t, cbytes);
940 for (var j=0; j < 16; j++) ciphertext[bstart+j] = cbytes[j];
941 for (var j=0; j < 4; j++) Checksum[j] = Checksum[j] ^ block[j];
942 }
943
944 // encrypt and accumulate last block
945 var num_bytes = plaintext.length%16;
946 if ((num_bytes == 0) && (plaintext.length > 0)) num_bytes=16;
947 this._times2(Offset,Offset);
948 t = [0x00000000,0x00000000,0x00000000,0x00000000];
949 t[3] = num_bytes*8;
950 for (var i=0; i < 4; i++) t[i] = Offset[i] ^ t[i];
951 var Pad = new Array(4);
952 this._cipher.encryptBlock(t, Pad);
953 var pad_bytes = new Array(16);
954 aes.wordsToBytes(Pad, pad_bytes);
955 var tempbytes = [];
956 bstart = plaintext.length-num_bytes;
957 for (var i=0; i < num_bytes; i++) {
958 ciphertext[bstart+i] = plaintext[bstart+i] ^ pad_bytes[i];
959 tempbytes[tempbytes.length] = plaintext[bstart+i];
960 }
961 for (var i=num_bytes; i < 16; i++)
962 tempbytes[tempbytes.length] = pad_bytes[i];
963 aes.bytesToWords(tempbytes, t);
964 for (var i=0; i < 4; i++) Checksum[i] = Checksum[i] ^ t[i];
965
966 // compute authentication tag
967 this._times2(t,Offset);
968 for (var i=0; i < 4; i++) {
969 Offset[i] = t[i] ^ Offset[i];
970 t[i] = Checksum[i] ^ Offset[i];
971 }
972 this._cipher.encryptBlock(t,t2);
973 if (header.length > 0) {
974 this.PMAC(header, t);
975 for (var i=0; i < 4; i++) tag[i] = t[i] ^ t2[i];
976 } else {
977 for (var i=0; i < 4; i++) tag[i] = t2[i];
978 }
979};
980
981
982/* Decrypts and verifies integrity of ciphertext, only verifies integrity of header.
983ciphertext, plaintext, and header are arrays of bytes. tag is an array of 4 32-bit words.
984Returns true if tag is valid, false otherwise. */
985cipherOCB.prototype.decrypt = function(ciphertext, plaintext, header, tag) {
986 var Offset = new Array(4), Checksum = [0x00000000,0x00000000,0x00000000,0x00000000];
987 this._cipher.encryptBlock(this._cipher._iv, Offset);
988
989 var t = new Array(4), t2 = new Array(4), block = new Array(4);
990
991 // decrypt and accumulate first m-1 blocks
992 var num_blocks = Math.floor((ciphertext.length-1)/16);
993 var bstart = 0, pbytes = new Array(16);
994 this._cipher.scheduleDecrypt();
995 for (var i=0; i < num_blocks; i++) {
996 this._times2(Offset,Offset);
997 bstart = i*16;
998 for (var j=0; j < 4; j++)
999 t[j] = Offset[j] ^ ((ciphertext[bstart+(j<<2)+3]) | (ciphertext[bstart+(j<<2)+2] << 8) | (ciphertext[bstart+(j<<2)+1] << 16) | (ciphertext[bstart+(j<<2)] << 24));
1000 this._cipher.decryptBlock(t,t2);
1001 for (var j=0; j < 4; j++) {
1002 block[j] = Offset[j] ^ t2[j];
1003 Checksum[j] = block[j] ^ Checksum[j];
1004 }
1005 aes.wordsToBytes(block,pbytes);
1006 for (var j=0; j < 16; j++)
1007 plaintext[bstart+j] = pbytes[j];
1008 }
1009
1010 // decrypt and accumulate final block
1011 var Pad = new Array(4), padbytes=[];
1012 this._cipher.scheduleEncrypt()
1013 this._times2(Offset,Offset);
1014 var num_bytes = ciphertext.length%16;
1015 if ((num_bytes == 0) && (ciphertext.length > 0)) num_bytes=16;
1016 t = [0x00000000,0x00000000,0x00000000,0x00000000];
1017 t[3] = num_bytes*8;
1018 for (var i=0; i < 4; i++) t[i] = t[i] ^ Offset[i]
1019 this._cipher.encryptBlock(t,Pad);
1020 aes.wordsToBytes(Pad, padbytes);
1021 bstart = ciphertext.length - num_bytes;
1022 for (var i=0; i < num_bytes; i++) {
1023 plaintext[bstart+i] = ciphertext[bstart+i] ^ padbytes[i];
1024 t[i] = plaintext[bstart+i];
1025 }
1026 for (var i = num_bytes; i < 16; i++)
1027 t[i] = padbytes[i];
1028 aes.bytesToWords(t,t2);
1029 for (var i=0; i < 4; i++) Checksum[i] = Checksum[i] ^ t2[i];
1030
1031 // compute valid authentication tag
1032 this._times2(t, Offset);
1033 for (var i=0; i < 4; i++) {
1034 Offset[i] = Offset[i] ^ t[i];
1035 t[i] = Offset[i] ^ Checksum[i];
1036 }
1037 var validTag = new Array(4);
1038 this._cipher.encryptBlock(t,validTag);
1039 t = new Array(4);
1040 if (header.length > 0) {
1041 this.PMAC(header, t);
1042 for (var i=0; i < 4; i++) validTag[i] = validTag[i] ^ t[i];
1043 }
1044 // compute results
1045 for (var i=0; i < 4; i++) {
1046 if (aes._hex(tag[i]) != aes._hex(validTag[i])) {
1047 return false;
1048 }
1049 }
1050 return true;
1051};
1052
1053
1054
1055cipherOCB.prototype._times2 = function(dst, src) {
1056 var carry = src[0]>>>31;
1057 for (var i=0; i < 3; i++)
1058 dst[i] = (src[i]<<1) | (src[i+1]>>>31);
1059 dst[3] = (src[3]<<1) ^ (carry * 0x87);
1060};
1061
1062
1063
1064
1065
1066
1067
1068
1069/*
1070jsCrypto
1071
1072sha256.js
1073Mike Hamburg, 2008. Public domain.
1074 */
1075
1076
1077function SHA256() {
1078 if (!this.k[0])
1079 this.precompute();
1080 this.initialize();
1081}
1082
1083SHA256.prototype = {
1084 /*
1085 init:[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],
1086
1087 k:[0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
1088 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
1089 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
1090 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
1091 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
1092 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
1093 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
1094 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2],
1095 */
1096
1097 init:[], k:[],
1098
1099 precompute: function() {
1100 var p=2,i=0,j;
1101
1102 function frac(x) { return (x-Math.floor(x)) * 4294967296 | 0 }
1103
1104 outer: for (;i<64;p++) {
1105 for (j=2;j*j<=p;j++)
1106 if (p % j == 0)
1107 continue outer;
1108
1109 if (i<8) this.init[i] = frac(Math.pow(p,1/2));
1110 this.k[i] = frac(Math.pow(p,1/3));
1111 i++;
1112 }
1113 },
1114
1115 initialize:function() {
1116 this.h = this.init.slice(0);
1117 this.word_buffer = [];
1118 this.bit_buffer = 0;
1119 this.bits_buffered = 0;
1120 this.length = 0;
1121 this.length_upper = 0;
1122 },
1123
1124 // one cycle of SHA256
1125 block:function(words) {
1126 var w=words.slice(0),i,h=this.h,tmp,k=this.k;
1127
1128 var h0=h[0],h1=h[1],h2=h[2],h3=h[3],h4=h[4],h5=h[5],h6=h[6],h7=h[7];
1129
1130 for (i=0;i<64;i++) {
1131 if (i<16) {
1132 tmp=w[i];
1133 } else {
1134 var a=w[(i+1)&15], b=w[(i+14)&15];
1135 tmp=w[i&15]=((a>>>7^a>>>18^a>>>3^a<<25^a<<14) + (b>>>17^b>>>19^b>>>10^b<<15^b<<13) + w[i&15] + w[(i+9)&15]) | 0;
1136 }
1137
1138 tmp += h7 + (h4>>>6^h4>>>11^h4>>>25^h4<<26^h4<<21^h4<<7) + (h6 ^ h4&(h5^h6)) + k[i];
1139
1140 h7=h6; h6=h5; h5=h4;
1141 h4 = h3 + tmp | 0;
1142
1143 h3=h2; h2=h1; h1=h0;
1144
1145 h0 = (tmp + ((h1&h2)^(h3&(h1^h2))) + (h1>>>2^h1>>>13^h1>>>22^h1<<30^h1<<19^h1<<10)) | 0;
1146 }
1147
1148 h[0]+=h0; h[1]+=h1; h[2]+=h2; h[3]+=h3;
1149 h[4]+=h4; h[5]+=h5; h[6]+=h6; h[7]+=h7;
1150 },
1151
1152 update_word_big_endian:function(word) {
1153 var bb;
1154 if ((bb = this.bits_buffered)) {
1155 this.word_buffer.push(word>>>(32-bb) ^ this.bit_buffer);
1156 this.bit_buffer = word << bb;
1157 } else {
1158 this.word_buffer.push(word);
1159 }
1160 this.length += 32;
1161 if (this.length == 0) this.length_upper ++; // mmhm..
1162 if (this.word_buffer.length == 16) {
1163 this.block(this.word_buffer);
1164 this.word_buffer = [];
1165 }
1166 },
1167
1168 update_word_little_endian:function(word) {
1169 word = word >>> 16 ^ word << 16;
1170 word = ((word>>>8) & 0xFF00FF) ^ ((word<<8) & 0xFF00FF00);
1171 this.update_word_big_endian(word);
1172 },
1173
1174 update_words_big_endian: function(words) {
1175 for (var i=0; i<words.length; i++) this.update_word_big_endian(words[i]);
1176 },
1177
1178 update_words_little_endian: function(words) {
1179 for (var i=0; i<words.length; i++) this.update_word_little_endian(words[i]);
1180 },
1181
1182 update_byte:function(byte) {
1183 this.bit_buffer ^= (byte & 0xff) << (24 - (this.bits_buffered));
1184 this.bits_buffered += 8;
1185 if (this.bits_buffered == 32) {
1186 this.bits_buffered = 0;
1187 this.update_word_big_endian(this.bit_buffer);
1188 this.bit_buffer = 0;
1189 }
1190 },
1191
1192 update_string:function(string) {
1193 throw "not yet implemented";
1194 },
1195
1196 finalize:function() {
1197 var i, wb = this.word_buffer;
1198
1199 wb.push(this.bit_buffer ^ (0x1 << (31 - this.bits_buffered)));
1200 for (i = (wb.length + 2) & 15; i<16; i++) {
1201 wb.push(0);
1202 }
1203
1204 wb.push(this.length_upper);
1205 wb.push(this.length + this.bits_buffered);
1206
1207 this.block(wb.slice(0,16));
1208 if (wb.length > 16) {
1209 this.block(wb.slice(0,16));
1210 }
1211
1212 var h = this.h;
1213 this.initialize();
1214 return h;
1215 }
1216}
1217
1218SHA256.hash_words_big_endian = function(words) {
1219 var s = new SHA256();
1220 for (var i=0; i<=words.length-16; i+=16) {
1221 s.block(words.slice(i,i+16));
1222 }
1223 s.length = i << 5; // so don't pass this function more than 128M words
1224 if (i<words.length)
1225 s.update_words_little_endian(words.slice(i));
1226 return s.finalize();
1227}
1228
1229SHA256.hash_words_little_endian = function(words) {
1230 var w = words.slice(0);
1231 for (var i=0; i<w.length; i++) {
1232 w[i] = w[i] >>> 16 ^ w[i] << 16;
1233 w[i] = ((w[i]>>>8) & 0xFF00FF) ^ ((w[i]<<8) & 0xFF00FF00);
1234 }
1235 return SHA256.hash_words_big_endian(w);
1236}
1237
1238
1239
1240
1241
1242
1243
1244/*
1245
1246 jsCrypto
1247
1248 * Random.js -- cryptographic random number generator
1249 * Mike Hamburg, 2008. Public domain.
1250 *
1251 * This generator uses a modified version of Fortuna. Fortuna has
1252 * excellent resilience to compromise, relies on a state file, and is
1253 * intended to run for a long time. As such, it does not need an
1254 * entropy estimator. Unfortunately, Fortuna's startup in low-entropy
1255 * conditions leaves much to be desired.
1256 *
1257 * This generator features the following modifications. First, the
1258 * generator does not create the n-th entropy pool until it exhausts
1259 * the n-1-st. This means that entropy doesn't get "stuck" in pools
1260 * 10-31, which will never be used on a typical webpage. It also
1261 * means that the entropy will all go into a single pool until the
1262 * generator is seeded.
1263 *
1264 * Second, there is a very crude entropy estimator. The primary goal
1265 * of this estimator is to prevent the generator from being used in
1266 * low-entropy situations. Corresponding to this entropy estimator,
1267 * there is a "paranoia control". This controls how many bits of
1268 * estimated entropy must be present before the generator is used.
1269 * The generator cannot have more than 256 bits of actual entropy in
1270 * the main pool; rather, the paranoia control is designed to deal
1271 * with the fact that the entropy estimator is probably horrible.
1272 *
1273 * Third, the "statefile" is optional and stored in a cookie. As
1274 * such, it is not protected from multiple simultaneous usage, and so
1275 * is treated conservatively.
1276 */
1277
1278Random = {
1279 /* public */
1280NOT_READY: 0,
1281READY: 1,
1282REQUIRES_RESEED: 2,
1283
1284 /* generate one random word */
1285random_word: function(paranoia) {
1286 return this.random_words(1, paranoia)[0];
1287},
1288
1289 /* generate nwords random words, and return them in an array */
1290random_words: function(nwords, paranoia) {
1291 var out = [], i, readiness = this.is_ready(paranoia);
1292
1293 if (readiness == this.NOT_READY)
1294 throw("Random: generator isn't seeded!");
1295
1296 else if (readiness && this.REQUIRES_RESEED)
1297 this._reseed_from_pools(!(readiness & this.READY));
1298
1299 for (i=0; i<nwords; i+= 4) {
1300 if ((i+1) % this._max_words_per_burst == 0)
1301 this._gate();
1302
1303 var g = this._gen_4_words();
1304 out.push(g[0],g[1],g[2],g[3]);
1305 }
1306 this._gate();
1307
1308 return out.slice(0,nwords);
1309},
1310
1311set_default_paranoia: function(paranoia) {
1312 this._default_paranoia = paranoia;
1313},
1314
1315 /* Add entropy to the pools. Pass data as an array, number or
1316 * string. Pass estimated_entropy in bits. Pass the source as a
1317 * number or string.
1318 */
1319add_entropy: function(data, estimated_entropy, source) {
1320 source = source || "user";
1321
1322 var id = this._collector_ids[source] ||
1323 (this._collector_ids[source] = this._collector_id_next ++);
1324
1325 var i, ty = 0;
1326
1327 var t = new Date().valueOf();
1328
1329 var robin = this._robins[source];
1330 if (robin == undefined) robin = this._robins[source] = 0;
1331 this._robins[source] = ( this._robins[source] + 1 ) % this._pools.length;
1332
1333 switch(typeof(data)) {
1334
1335 case "number":
1336 data=[data];
1337 ty=1;
1338 break;
1339
1340 case "object":
1341 if (!estimated_entropy) {
1342 /* horrible entropy estimator */
1343 estimated_entropy = 0;
1344 for (i=0; i<data.length; i++) {
1345 var x = data[i];
1346 while (x>0) {
1347 estimated_entropy++;
1348 x = x >>> 1;
1349 }
1350 }
1351 }
1352 this._pools[robin].update_words_big_endian([id,this._event_id++,ty||2,estimated_entropy,t,data.length].concat(data));
1353 break;
1354
1355 case "string":
1356 if (!estimated_entropy) {
1357 /* English text has just over 1 bit per character of entropy.
1358 * But this might be HTML or something, and have far less
1359 * entropy than English... Oh well, let's just say one bit.
1360 */
1361 estimated_entropy = data.length;
1362 }
1363 this._pools[robin].update_words_big_endian([id,this._event_id++,3,estimated_entropy,t,data.length])
1364 this._pools[robin].update_string(data);
1365 break;
1366
1367 default:
1368 throw "add_entropy: must give an array, number or string"
1369 }
1370
1371 var old_ready = this.is_ready();
1372
1373 /* record the new strength */
1374 this._pool_entropy[robin] += estimated_entropy;
1375 this._pool_strength += estimated_entropy;
1376
1377 /* fire off events */
1378 if (!old_ready && this.is_ready())
1379 this._fire_event("seeded", Math.max(this._strength, this._pool_strength));
1380
1381 if (!old_ready)
1382 this._fire_event("progress", this.get_progress());
1383},
1384
1385 /* is the generator ready? */
1386is_ready: function(paranoia) {
1387 var entropy_required = this._PARANOIA_LEVELS[ paranoia ? paranoia : this._default_paranoia ];
1388
1389 if (this._strength >= entropy_required) {
1390 return (this._pool_entropy[0] > this._BITS_PER_RESEED && new Date.valueOf() > this._next_reseed) ?
1391 this.REQUIRES_RESEED | this.READY :
1392 this.READY;
1393 } else {
1394 return (this._pool_strength > entropy_required) ?
1395 this.REQUIRES_RESEED | this.NOT_READY :
1396 this.NOT_READY;
1397 }
1398},
1399
1400 /* how close to ready is it? */
1401get_progress: function(paranoia) {
1402 var entropy_required = this._PARANOIA_LEVELS[ paranoia ? paranoia : this._default_paranoia ];
1403
1404 if (this._strength >= entropy_required) {
1405 return 1.0;
1406 } else {
1407 return (this._pool_strength > entropy_required) ?
1408 1.0 :
1409 this._pool_strength / entropy_required;
1410 }
1411},
1412
1413 /* start the built-in entropy collectors */
1414start_collectors: function() {
1415 if (this._collectors_started) return;
1416
1417 if (window.addEventListener) {
1418 window.addEventListener("load", this._load_time_collector, false);
1419 window.addEventListener("mousemove", this._mouse_collector, false);
1420 } else if (document.attachEvent) {
1421 document.attachEvent("onload", this._load_time_collector);
1422 document.attachEvent("onmousemove", this._mouse_collector);
1423 }
1424 else throw("can't attach event");
1425
1426 this._collectors_started = true;
1427},
1428
1429 /* stop the built-in entropy collectors */
1430stop_collectors: function() {
1431 if (!this._collectors_started) return;
1432
1433 if (window.removeEventListener) {
1434 window.removeEventListener("load", this._load_time_collector);
1435 window.removeEventListener("mousemove", this._mouse_collector);
1436 } else if (window.detachEvent) {
1437 window.detachEvent("onload", this._load_time_collector);
1438 window.detachEvent("onmousemove", this._mouse_collector)
1439 }
1440 this._collectors_started = false;
1441},
1442
1443use_cookie: function(all_cookies) {
1444 throw "TODO: implement use_cookie";
1445},
1446
1447 /* add an event listener for progress or seeded-ness */
1448addEventListener: function(name, callback) {
1449 this._callbacks[name][this._callback_i++] = callback;
1450},
1451
1452 /* remove an event listener for progress or seeded-ness */
1453removeEventListener: function(name, cb) {
1454 var i, j, cbs=this._callbacks[name], js_temp=[];
1455
1456 /* I'm not sure if this is necessary; in C++, iterating over a
1457 * collection and modifying it at the same time is a no-no.
1458 */
1459
1460 for (j in cbs)
1461 if (cbs.hasOwnProperty[j] && cbs[j] === cb)
1462 js_temp.push(j);
1463
1464 for (i=0; i<js_temp.length; i++) {
1465 j = js[i];
1466 delete cbs[j];
1467 }
1468},
1469
1470 /* private */
1471 _pools : [new SHA256()],
1472 _pool_entropy : [0],
1473 _reseed_count : 0,
1474 _robins : {},
1475 _event_id : 0,
1476
1477 _collector_ids : {},
1478 _collector_id_next : 0,
1479
1480 _strength : 0,
1481 _pool_strength : 0,
1482 _next_reseed : 0,
1483 _key : [0,0,0,0,0,0,0,0],
1484 _counter : [0,0,0,0],
1485 _cipher : undefined,
1486 _default_paranoia : 6,
1487
1488 /* event listener stuff */
1489 _collectors_started : false,
1490 _callbacks : {progress: {}, seeded: {}},
1491 _callback_i : 0,
1492
1493 /* constants */
1494 _MAX_WORDS_PER_BURST : 65536,
1495 _PARANOIA_LEVELS : [0,48,64,96,128,192,256,384,512,768,1024],
1496 _MILLISECONDS_PER_RESEED : 100,
1497 _BITS_PER_RESEED : 80,
1498
1499 /* generate 4 random words, no reseed, no gate */
1500_gen_4_words: function() {
1501 var words = [];
1502 for (var i=0; i<3; i++) if (++this._counter[i]) break;
1503 this._cipher.encryptBlock(this._counter, words);
1504 return words;
1505},
1506
1507 /* rekey the AES instance with itself after a request, or every _MAX_WORDS_PER_BURST words */
1508_gate: function() {
1509 this._key = this._gen_4_words().concat(this._gen_4_words());
1510 this._cipher = new aes(this._key);
1511},
1512
1513 /* reseed the generator with the given words */
1514_reseed: function(seedWords) {
1515 this._key = SHA256.hash_words_big_endian(this._key.concat(seedWords));
1516 this._cipher = new aes(this._key);
1517 for (var i=0; i<3; i++) if (++this._counter[i]) break;
1518},
1519
1520 /* reseed the data from the entropy pools */
1521_reseed_from_pools: function(full) {
1522 var reseed_data = [], strength = 0;
1523
1524 this._next_reseed = new Date().valueOf() + this._MILLISECONDS_PER_RESEED;
1525
1526 for (i=0; i<this._pools.length; i++) {
1527 reseed_data = reseed_data.concat(this._pools[i].finalize());
1528 strength += this._pool_entropy[i];
1529 this._pool_entropy[i] = 0;
1530
1531 if (!full && (this._reseed_count & (1<<i))) break;
1532 }
1533
1534 /* if we used the last pool, push a new one onto the stack */
1535 if (this._reseed_count >= 1 << this._pools.length) {
1536 this._pools.push(new SHA256());
1537 this._pool_entropy.push(0);
1538 }
1539
1540 /* how strong was this reseed? */
1541 this._pool_strength -= strength;
1542 if (strength > this._strength) this._strength = strength;
1543
1544 this._reseed_count ++;
1545 this._reseed(reseed_data);
1546},
1547
1548_mouse_collector: function(ev) {
1549 var x = ev.x || ev.clientX || ev.offsetX;
1550 var y = ev.y || ev.clientY || ev.offsetY;
1551 Random.add_entropy([x,y], 2, "mouse");
1552},
1553
1554_load_time_collector: function(ev) {
1555 var d = new Date();
1556 Random.add_entropy(d, 2, "loadtime");
1557},
1558
1559_fire_event: function(name, arg) {
1560 var j, cbs=Random._callbacks[name], cbs_temp=[];
1561
1562 /* I'm not sure if this is necessary; in C++, iterating over a
1563 * collection and modifying it at the same time is a no-no.
1564 */
1565
1566 for (j in cbs) {
1567 if (cbs.hasOwnProperty(j)) {
1568 cbs_temp.push(cbs[j]);
1569 }
1570 }
1571
1572 for (j=0; j<cbs_temp.length; j++) {
1573 cbs_temp[j](arg);
1574 }
1575}
1576};
1577
diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.html b/frontend/gamma/tests/tests/Clipperz/DOM.html
new file mode 100644
index 0000000..2060215
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/DOM.html
@@ -0,0 +1,58 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
34
35 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
36
37 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/DOM.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
42
43 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script>
44</head>
45<body>
46
47<pre id="test">
48<script>
49 Clipperz_IEisBroken = false;
50</script>
51
52<!--[if IE]><script>
53Clipperz_IEisBroken = true;
54</script><![endif]-->
55<script type="text/javascript" src="DOM.test.js"></script>
56</pre>
57</body>
58</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.test.js b/frontend/gamma/tests/tests/Clipperz/DOM.test.js
new file mode 100644
index 0000000..a2aafc5
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/DOM.test.js
@@ -0,0 +1,82 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29try {
30 var template;
31 var templateArgs;
32 var element;
33 var rowElement;
34 var tdElement;
35
36 template = Clipperz.DOM.Helper.createTemplate(
37 [
38 {tag:'td', children:[{tag:'img', cls:'favicon', src:'{faviconUrl}'}]},
39 {tag:'td', children:[{tag:'a', href:'#', cls:'title', html:'{cardTitle}'}]},
40 {tag:'td', children:[{tag:'span', cls:'directLogins', id:'{directLoginsID}'}]},
41 {tag:'td', children:[{tag:'span', cls:'latestUpdate', html:'{latestUpdate}'}]},
42 {tag:'td'}
43 ]
44 );
45
46 templateArgs = {
47 cardTitle: "Amazon.com",
48 directLoginsID: "Clipperz_PM_Components_directLogins_58",
49 faviconUrl: "http://www.amazon.com/favicon.ico",
50 latestUpdate: "",
51 reference: "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551"
52 }
53
54 element = Clipperz.DOM.Helper.append(document.body, {tag:'table', children:[
55 {tag:'theader'},
56 {tag:'tbody', children:[
57 {tag:'tr', id:'testRow'}
58 ]},
59 {tag:'tfooter'}
60 ]});
61 ok(element != null, "created the TABLE");
62
63 rowElement = Clipperz.DOM.get('testRow');
64 ok(testRow != null, "created the ROW");
65
66 template.append(rowElement, templateArgs);
67 tdElement = Clipperz.DOM.get(templateArgs['directLoginsID']);
68 ok(tdElement != null, "created the TD");
69
70} catch (err) {
71 var s = "test suite failure!\n";
72 var o = {};
73 var k = null;
74 for (k in err) {
75 // ensure unique keys?!
76 if (!o[k]) {
77 s += k + ": " + err[k] + "\n";
78 o[k] = err[k];
79 }
80 }
81 ok ( false, s );
82}
diff --git a/frontend/gamma/tests/tests/Clipperz/Date.html b/frontend/gamma/tests/tests/Clipperz/Date.html
new file mode 100644
index 0000000..5712a52
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Date.html
@@ -0,0 +1,54 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Date - TEST</title>
32
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44
45
46 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
47
48</head>
49<body>
50<pre id="test">
51<script type="text/javascript" src="Date.test.js"></script>
52</pre>
53</body>
54</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Date.test.js b/frontend/gamma/tests/tests/Clipperz/Date.test.js
new file mode 100644
index 0000000..06f7dc8
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Date.test.js
@@ -0,0 +1,66 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29var tests = {
30
31 '001_test': function () {
32 vardate;
33 var locale;
34
35 // date = new Date(0);
36 // date.setMilliseconds(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC"));
37
38 date = new Date(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC"));
39
40 locale = {
41 'amDesignation':"am",
42 'pmDesignation':"pm",
43 // 'shortDateFormat':"d/m/y",
44 // 'longDateFormat':"",
45 'months': ["January", "February", "March","April",
46 "May", "June", "July", "August",
47 "September", "October", "November", "December"],
48 'shortMonths': ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
49 'days': ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
50 'shortDays': ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]
51 }
52
53 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "d/m/y", locale), '21/09/07', "formatDate - 1");
54 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D M Y", locale), 'Fri Sep 2007', "formatDate - 2");
55 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y", locale), 'Fri, 21 Sep 2007', "formatDate - 3");
56 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s", locale), 'Fri, 21 Sep 2007 12:04:24', "formatDate - 4");
57 // is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s (T)", locale), 'Fri, 21 Sep 2007 11:04:24 (CEST)', "formatDate - 5");
58 },
59
60 //-------------------------------------------------------------------------
61 'syntaxFix': MochiKit.Base.noop
62}
63
64//=============================================================================
65
66SimpleTest.runDeferredTests("Clipperz.Date", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js
new file mode 100644
index 0000000..5bfb8c7
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js
@@ -0,0 +1,910 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29var testData = {}
30
31testData['Barb_Newman_data'] = "";
32testData['Barb_Newman_data'] = testData['Barb_Newman_data'] +
33 "[Domain Administration Account]" + "\n" +
34 "Group: Windows" + "\n" +
35 "User Name: _ABC" + "\n" +
36 "URL: " + "\n" +
37 "Password: 123456" + "\n" +
38 "Notes: " + "\n" +
39 "" + "\n" +
40 "[Enquiro Domain]" + "\n" +
41 "Group: Windows" + "\n" +
42 "User Name: ABC" + "\n" +
43 "URL: " + "\n" +
44 "Password: 123456" + "\n" +
45 "Notes: This is an Exchange Mailbox checked by IT/Programming" + "\n" +
46 "" + "\n" +
47 "[Enquiro Domain Administrator Account]" + "\n" +
48 "Group: Windows" + "\n" +
49 "User Name: ENQUIRO\ABC" + "\n" +
50 "URL: " + "\n" +
51 "Password: 123456" + "\n" +
52 "Notes: Obsolete" + "\n" +
53 "" + "\n" +
54 "[Enquiro Domain Administrator Account]" + "\n" +
55 "Group: Windows" + "\n" +
56 "User Name: ENQUIRO\ABC" + "\n" +
57 "URL: " + "\n" +
58 "Password: 123456" + "\n" +
59 "Notes: Changed on 07 Sep 2007 by Randy Kissick" + "\n" +
60 "" + "\n" +
61 "[Enquiro Domain Previous Administrator Account]" + "\n" +
62 "Group: Windows" + "\n" +
63 "User Name: ENQUIRO\ABC" + "\n" +
64 "URL: " + "\n" +
65 "Password: 123456" + "\n" +
66 "Notes: ENSQL1" + "\n" +
67 "" + "\n" +
68 "[Local Administrator Account for most Machines]" + "\n" +
69 "Group: Windows" + "\n" +
70 "User Name: ABC" + "\n" +
71 "URL: " + "\n" +
72 "Password: 123456" + "\n" +
73 "Notes: " + "\n" +
74 "" + "\n" +
75 "[Local Administrator Account for some Machines]" + "\n" +
76 "Group: Windows" + "\n" +
77 "User Name: ABC" + "\n" +
78 "URL: " + "\n" +
79 "Password: 123456" + "\n" +
80 "Notes: " + "\n" +
81 "" + "\n" +
82 "[Bugzilla]" + "\n" +
83 "Group: Hardware" + "\n" +
84 "User Name: ABC" + "\n" +
85 "URL: " + "\n" +
86 "Password: 123456" + "\n" +
87 "Notes: BUGZILLA" + "\n" +
88 "" + "\n" +
89 "[Client Services Linux Box]" + "\n" +
90 "Group: Hardware" + "\n" +
91 "User Name: ABC" + "\n" +
92 "URL: " + "\n" +
93 "Password: 123456" + "\n" +
94 "Notes: 192.168.1.141" + "\n" +
95 "" + "\n" +
96 "[ENSQL2 BIOS]" + "\n" +
97 "Group: Hardware" + "\n" +
98 "User Name: " + "\n" +
99 "URL: " + "\n" +
100 "Password: 123456" + "\n" +
101 "Notes: " + "\n" +
102 "" + "\n" +
103 "[Eye Tracking PC]" + "\n" +
104 "Group: Hardware" + "\n" +
105 "User Name: ABC" + "\n" +
106 "URL: " + "\n" +
107 "Password: 123456" + "\n" +
108 "Notes: " + "\n" +
109 "" + "\n" +
110 "[IT Linux Box (Brainiac)]" + "\n" +
111 "Group: Hardware" + "\n" +
112 "User Name: ABC" + "\n" +
113 "URL: " + "\n" +
114 "Password: 123456" + "\n" +
115 "Notes: " + "\n" +
116 "" + "\n" +
117 "[Maizal - Contract Developer Machine]" + "\n" +
118 "Group: Hardware" + "\n" +
119 "User Name: ABC" + "\n" +
120 "URL: 199.185.139.69:3399" + "\n" +
121 "Password: 123456" + "\n" +
122 "Notes: Software Development Contractors use remote access to access this machine.\r\n\r\nTested August 08.\r\n\r\nBe sure to send the info via two different delivery methods." + "\n" +
123 "" + "\n" +
124 "[NETGEAR WGR614v3]" + "\n" +
125 "Group: Hardware" + "\n" +
126 "User Name: ABC" + "\n" +
127 "URL: " + "\n" +
128 "Password: 123456" + "\n" +
129 "Notes: (192.168.1.11)" + "\n" +
130 "" + "\n" +
131 "[SEP Firewall (192.168.1.1)]" + "\n" +
132 "Group: Hardware" + "\n" +
133 "User Name: ABC" + "\n" +
134 "URL: " + "\n" +
135 "Password: 123456" + "\n" +
136 "Notes: Changed to this on 2007/01/31" + "\n" +
137 "" + "\n" +
138 "[SEP Firewall (192.168.1.1)]" + "\n" +
139 "Group: Hardware" + "\n" +
140 "User Name: ABC" + "\n" +
141 "URL: " + "\n" +
142 "Password: 123456" + "\n" +
143 "Notes: 192.168.1.1" + "\n" +
144 "" + "\n" +
145 "[UPS]" + "\n" +
146 "Group: Hardware" + "\n" +
147 "User Name: ABC" + "\n" +
148 "URL: " + "\n" +
149 "Password: 123456" + "\n" +
150 "Notes: " + "\n" +
151 "" + "\n" +
152 "[Wireless WPA-PSK]" + "\n" +
153 "Group: Hardware" + "\n" +
154 "User Name: " + "\n" +
155 "URL: " + "\n" +
156 "Password: synergize" + "\n" +
157 "Notes: " + "\n" +
158 "" + "\n" +
159 "[Gord's Laptop Adminstrator 123456" + "\n" +
160 "Group: Hardware" + "\n" +
161 "User Name: ABC" + "\n" +
162 "URL: " + "\n" +
163 "Password: 123456" + "\n" +
164 "Notes: " + "\n" +
165 "" + "\n" +
166 "[Wireless Access Point]" + "\n" +
167 "Group: Hardware" + "\n" +
168 "User Name: SSID: ENWRLSS" + "\n" +
169 "URL: " + "\n" +
170 "Password: 123456" + "\n" +
171 "Notes: WPA (TKIP) key is in password 123456" + "\n" +
172 "" + "\n" +
173 "[Adobe Account]" + "\n" +
174 "Group: Websites" + "\n" +
175 "User Name: ABC" + "\n" +
176 "URL: " + "\n" +
177 "Password: 123456" + "\n" +
178 "Notes: " + "\n" +
179 "" + "\n" +
180 "[APC UPS Website]" + "\n" +
181 "Group: Websites" + "\n" +
182 "User Name: ABC" + "\n" +
183 "URL: " + "\n" +
184 "Password: 123456" + "\n" +
185 "Notes: Web site for UPS Drivers/Manuals" + "\n" +
186 "" + "\n" +
187 "[ask.enquiro.com admin]" + "\n" +
188 "Group: Websites" + "\n" +
189 "User Name: ABC" + "\n" +
190 "URL: ask.enquiro.com" + "\n" +
191 "Password: 123456" + "\n" +
192 "Notes: Jody is the admin\r\nChris is the editor" + "\n" +
193 "" + "\n" +
194 "[ask.enquiro.com ftp]" + "\n" +
195 "Group: Websites" + "\n" +
196 "User Name: ABC" + "\n" +
197 "URL: ask.enquiro.com" + "\n" +
198 "Password: 123456" + "\n" +
199 "Notes: ftp.ask.enquiro.com\r\nchanged 02 Jun 08" + "\n" +
200 "" + "\n" +
201 "[BulkRegister]" + "\n" +
202 "Group: Websites" + "\n" +
203 "User Name: ABC " + "\n" +
204 "URL: https://www.bulkregister.com/Login.asp?" + "\n" +
205 "Password: 123456" + "\n" +
206 "Notes: Used for domain registrations" + "\n" +
207 "" + "\n" +
208 "[controlpanel.provisiondata.com]" + "\n" +
209 "Group: Websites" + "\n" +
210 "User Name: ABC" + "\n" +
211 "URL: " + "\n" +
212 "Password: 123456" + "\n" +
213 "Notes: SEIReports.com Email address management" + "\n" +
214 "" + "\n" +
215 "[controlpanel.provisiondata.com]" + "\n" +
216 "Group: Websites" + "\n" +
217 "User Name: " + "\n" +
218 "URL: " + "\n" +
219 "Password: " + "\n" +
220 "Notes: Searchengineposition.com Email address management" + "\n" +
221 "" + "\n" +
222 "[Dell Canada]" + "\n" +
223 "Group: Websites" + "\n" +
224 "User Name: ABC" + "\n" +
225 "URL: " + "\n" +
226 "Password: 123456" + "\n" +
227 "Notes: Used to order equirpment from Dell\r\nCredit Card information is Tracy Kalancha AmEx" + "\n" +
228 "" + "\n" +
229 "[Feedback Server]" + "\n" +
230 "Group: Websites" + "\n" +
231 "User Name: ABC" + "\n" +
232 "URL: http://www.nsurvey.org/members/login.aspx" + "\n" +
233 "Password: 123456" + "\n" +
234 "Notes: " + "\n" +
235 "" + "\n" +
236 "[ftp.enquiro.com]" + "\n" +
237 "Group: Websites" + "\n" +
238 "User Name: ABC" + "\n" +
239 "URL: " + "\n" +
240 "Password: 123456" + "\n" +
241 "Notes: TYRANUS (199.60.252.157)\r\nchanged 25 Jun 08" + "\n" +
242 "" + "\n" +
243 "[ftp.enquirolabs.com]" + "\n" +
244 "Group: Websites" + "\n" +
245 "User Name: ABC" + "\n" +
246 "URL: enquirolabs.com" + "\n" +
247 "Password: 123456" + "\n" +
248 "Notes: Changed 04 Jun 08" + "\n" +
249 "" + "\n" +
250 "[ftp://ftp.b2bexpertseries.com]" + "\n" +
251 "Group: Websites" + "\n" +
252 "User Name: ABC" + "\n" +
253 "URL: b2bexpertseries.com" + "\n" +
254 "Password: 123456" + "\n" +
255 "Notes: Changed 02 Jun 08" + "\n" +
256 "" + "\n" +
257 "[HSBC Bank Account]" + "\n" +
258 "Group: Websites" + "\n" +
259 "User Name: ABC" + "\n" +
260 "URL: hsbc.ca" + "\n" +
261 "Password: " + "\n" +
262 "Notes: What is my Mother's Name: BARBARA\r\nSecurity Code is generated by the Security Device - you have 10 seconds to enter it." + "\n" +
263 "" + "\n" +
264 "[HSBC Fx Trading]" + "\n" +
265 "Group: Websites" + "\n" +
266 "User Name: ABC" + "\n" +
267 "URL: https://fxtrading.hsbc.ca/fx-canada/login.html" + "\n" +
268 "Password: 123456" + "\n" +
269 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" +
270 "" + "\n" +
271 "[Industry Canada - Canadian Company Capabilities (CCC)]" + "\n" +
272 "Group: Websites" + "\n" +
273 "User Name: ABC" + "\n" +
274 "URL: http://www.ic.gc.ca" + "\n" +
275 "Password: 123456" + "\n" +
276 "Notes: Our listing: http://www.ic.gc.ca/app/ccc/srch/nvgt.do;jsessionid=0000RKFbMEOs2xvyRNoCF4pH3Ym:1247nks53?lang=eng&prtl=1&profile=cmpltPrfl&V_TOKEN=1203707557897&V_SEARCH.command=navigate&V_SEARCH.docsStart=1&V_SEARCH.resultsJSP=/prfl.do&V_DOCUMENT.docRank=1&V_SEARCH.docsCount=3&estblmntNo=234567061957&profileId=\r\n\r\nAndrew is responsible to update" + "\n" +
277 "" + "\n" +
278 "[Internet Secure CAD 1086]" + "\n" +
279 "Group: Websites" + "\n" +
280 "User Name: ABC" + "\n" +
281 "URL: https://www.internetsecure.com/merchants/" + "\n" +
282 "Password: 123456" + "\n" +
283 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" +
284 "" + "\n" +
285 "[Internet Secure USD 1087]" + "\n" +
286 "Group: Websites" + "\n" +
287 "User Name: ABC" + "\n" +
288 "URL: https://www.internetsecure.com/merchants/" + "\n" +
289 "Password: 123456" + "\n" +
290 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" +
291 "" + "\n" +
292 "[louisville.net-radar.com]" + "\n" +
293 "Group: Websites" + "\n" +
294 "User Name: ABC" + "\n" +
295 "URL: " + "\n" +
296 "Password: 123456" + "\n" +
297 "Notes: FTP/FrontPage" + "\n" +
298 "" + "\n" +
299 "[Microsoft Licensing Program eOpen]" + "\n" +
300 "Group: Websites" + "\n" +
301 "User Name: ABC" + "\n" +
302 "URL: https://eOpen.microsoft.com" + "\n" +
303 "Password: 123456" + "\n" +
304 "Notes: Used to record all Microsoft licensing information" + "\n" +
305 "" + "\n" +
306 "[OSTEC Job Site]" + "\n" +
307 "Group: Websites" + "\n" +
308 "User Name: ABC" + "\n" +
309 "URL: " + "\n" +
310 "Password: 123456" + "\n" +
311 "Notes: " + "\n" +
312 "" + "\n" +
313 "[OutOfMyGord.com Blog Login]" + "\n" +
314 "Group: Websites" + "\n" +
315 "User Name: ABC" + "\n" +
316 "URL: " + "\n" +
317 "Password: 123456" + "\n" +
318 "Notes: VADER" + "\n" +
319 "" + "\n" +
320 "[OutOfMyGord.com Web Site]" + "\n" +
321 "Group: Websites" + "\n" +
322 "User Name: ABC" + "\n" +
323 "URL: " + "\n" +
324 "Password: 123456" + "\n" +
325 "Notes: VADER" + "\n" +
326 "" + "\n" +
327 "[Paypal@enquiro.com]" + "\n" +
328 "Group: Websites" + "\n" +
329 "User Name: ABC" + "\n" +
330 "URL: " + "\n" +
331 "Password: 123456" + "\n" +
332 "Notes: " + "\n" +
333 "" + "\n" +
334 "[PRWeb]" + "\n" +
335 "Group: Websites" + "\n" +
336 "User Name: shermantracy" + "\n" +
337 "URL: " + "\n" +
338 "Password: 123456" + "\n" +
339 "Notes: " + "\n" +
340 "" + "\n" +
341 "[ScanMail Logon]" + "\n" +
342 "Group: Websites" + "\n" +
343 "User Name: ABC" + "\n" +
344 "URL: " + "\n" +
345 "Password: 123456" + "\n" +
346 "Notes: Scanmail Logon (Anti-Spam)" + "\n" +
347 "" + "\n" +
348 "[secure.searchengineposition.com]" + "\n" +
349 "Group: Websites" + "\n" +
350 "User Name: " + "\n" +
351 "URL: " + "\n" +
352 "Password: 123456" + "\n" +
353 "Notes: TYRANUS (199.60.252.237)" + "\n" +
354 "" + "\n" +
355 "[seireports.com]" + "\n" +
356 "Group: Websites" + "\n" +
357 "User Name: ABC" + "\n" +
358 "URL: http://www.seireports.com/" + "\n" +
359 "Password: 123456" + "\n" +
360 "Notes: " + "\n" +
361 "" + "\n" +
362 "[sepreports.com]" + "\n" +
363 "Group: Websites" + "\n" +
364 "User Name: ABC" + "\n" +
365 "URL: http://www.sepreports.com" + "\n" +
366 "Password: 123456" + "\n" +
367 "Notes: Used for monthly client reporting" + "\n" +
368 "" + "\n" +
369 "[septraffic.com]" + "\n" +
370 "Group: Websites" + "\n" +
371 "User Name: ABC" + "\n" +
372 "URL: " + "\n" +
373 "Password: 123456" + "\n" +
374 "Notes: " + "\n" +
375 "" + "\n" +
376 "[Spiceworks]" + "\n" +
377 "Group: Websites" + "\n" +
378 "User Name: ABC" + "\n" +
379 "URL: http://endc3:9675/dashboard" + "\n" +
380 "Password: 123456" + "\n" +
381 "Notes: Is installed on endc3. \r\nIt's used to inventory the hardware attached to the network. \r\nIt's scheduled to run daily at 10:00am. \r\nMachine's must be on to be detected.\r\n\r\nNote: first character of password is a zero\r\n\r\n\r\nhttp://www.spiceworks.com" + "\n" +
382 "" + "\n" +
383 "[SurveyMonkey Enquiro]" + "\n" +
384 "Group: Websites" + "\n" +
385 "User Name: ABC" + "\n" +
386 "URL: http://www.surveymonkey.com" + "\n" +
387 "Password: 123456" + "\n" +
388 "Notes: Used for small Enquiro surveys that aren't research related" + "\n" +
389 "" + "\n" +
390 "[SwishZone]" + "\n" +
391 "Group: Websites" + "\n" +
392 "User Name: ABC" + "\n" +
393 "URL: " + "\n" +
394 "Password: 123456" + "\n" +
395 "Notes: " + "\n" +
396 "" + "\n" +
397 "[Tobii.com]" + "\n" +
398 "Group: Websites" + "\n" +
399 "User Name: " + "\n" +
400 "URL: " + "\n" +
401 "Password: " + "\n" +
402 "Notes: Tobii Website Logon" + "\n" +
403 "" + "\n" +
404 "[Trend Micro]" + "\n" +
405 "Group: Websites" + "\n" +
406 "User Name: ABC" + "\n" +
407 "URL: https://olr.trendmicro.com/registration/" + "\n" +
408 "Password: 123456" + "\n" +
409 "Notes: 23 Jan 08 - I logged a bug with Trend to merge the DougWilson account with this account. /bn\r\n\r\n31 Jan 07 - Done!" + "\n" +
410 "" + "\n" +
411 "[Watchguard VPN Administrator]" + "\n" +
412 "Group: Websites" + "\n" +
413 "User Name: ABC" + "\n" +
414 "URL: https://10.99.50.254" + "\n" +
415 "Password: 123456" + "\n" +
416 "Notes: Log on here to adminster the VPN, create wgx files and user passphrase\r\n\r\n\r\n\r\n" + "\n" +
417 "" + "\n" +
418 "[Watchguard VPN hardware support website]" + "\n" +
419 "Group: Websites" + "\n" +
420 "User Name: ABC" + "\n" +
421 "URL: https://www.watchguard.com/" + "\n" +
422 "Password: 123456" + "\n" +
423 "Notes: Enquiro's VPN hardware support website\r\n\r\n\r\n\r\n\r\n" + "\n" +
424 "" + "\n" +
425 "[Webtrain]" + "\n" +
426 "Group: Websites" + "\n" +
427 "User Name: ABC" + "\n" +
428 "URL: http://www.webtrain.com/" + "\n" +
429 "Password: 123456" + "\n" +
430 "Notes: Used to set up webinars. \r\nOwner username can give permisions to share with other users, and those users can create login's.\r\n\r\nHours are associated with the gord@searchengineposition.com account" + "\n" +
431 "" + "\n" +
432 "[Whitelist & Spam Trainer (Jeremy's)]" + "\n" +
433 "Group: Websites" + "\n" +
434 "User Name: ABC" + "\n" +
435 "URL: http://my.email-as.net" + "\n" +
436 "Password: 123456" + "\n" +
437 "Notes: Used to:\r\n- add email addresses for clients, prospects or other contacts to the email whitelist\r\n- train Jeremy's system as spam or not spam.\r\n\r\nJeremy uses SpamAssassin " + "\n" +
438 "" + "\n" +
439 "[www.amazon.com]" + "\n" +
440 "Group: Websites" + "\n" +
441 "User Name: ABC" + "\n" +
442 "URL: " + "\n" +
443 "Password: 123456" + "\n" +
444 "Notes: " + "\n" +
445 "" + "\n" +
446 "[www.digitalriver.com]" + "\n" +
447 "Group: Websites" + "\n" +
448 "User Name: " + "\n" +
449 "URL: " + "\n" +
450 "Password: 123456" + "\n" +
451 "Notes: " + "\n" +
452 "" + "\n" +
453 "[www.kelownarockets.com/store/ssl/admin/menu.asp]" + "\n" +
454 "Group: Websites" + "\n" +
455 "User Name: ABC" + "\n" +
456 "URL: " + "\n" +
457 "Password: 123456" + "\n" +
458 "Notes: GEONOSIS" + "\n" +
459 "" + "\n";
460
461testData['Barb_Newman_data'] = testData['Barb_Newman_data'] +
462 "[www.webnames.ca]" + "\n" +
463 "Group: Websites" + "\n" +
464 "User Name: ABC" + "\n" +
465 "URL: " + "\n" +
466 "Password: 123456" + "\n" +
467 "Notes: 27 Mar 08 - Logged on but site has no domains listed. We no longer use this service, as I have been managing all domains on bulkregister for over a year. /bn" + "\n" +
468 "" + "\n" +
469 "[Yahooligans]" + "\n" +
470 "Group: Websites" + "\n" +
471 "User Name: ABC" + "\n" +
472 "URL: " + "\n" +
473 "Password: 123456" + "\n" +
474 "Notes: Webtrends Server" + "\n" +
475 "" + "\n" +
476 "[Anti-Virus]" + "\n" +
477 "Group: Services" + "\n" +
478 "User Name: " + "\n" +
479 "URL: " + "\n" +
480 "Password: 123456" + "\n" +
481 "Notes: ENSQL1" + "\n" +
482 "" + "\n" +
483 "[ENDEV1 SQL Server Service Account]" + "\n" +
484 "Group: Services" + "\n" +
485 "User Name: ABC" + "\n" +
486 "URL: " + "\n" +
487 "Password: 123456" + "\n" +
488 "Notes: ENDEV1" + "\n" +
489 "" + "\n" +
490 "[ENDEV2]" + "\n" +
491 "Group: Services" + "\n" +
492 "User Name: ABC" + "\n" +
493 "URL: " + "\n" +
494 "Password: 123456" + "\n" +
495 "Notes: ENDEV2" + "\n" +
496 "" + "\n" +
497 "[Enquiro Domain - BackUpExec]" + "\n" +
498 "Group: Services" + "\n" +
499 "User Name: ABC" + "\n" +
500 "URL: " + "\n" +
501 "Password: 123456" + "\n" +
502 "Notes: ENSQL1" + "\n" +
503 "" + "\n" +
504 "[Enquiro Domain - SEIService Account]" + "\n" +
505 "Group: Services" + "\n" +
506 "User Name: ABC" + "\n" +
507 "URL: " + "\n" +
508 "Password: 123456" + "\n" +
509 "Notes: ENAPP1" + "\n" +
510 "" + "\n" +
511 "[Enquiro Domain - SQLServer]" + "\n" +
512 "Group: Services" + "\n" +
513 "User Name: ABC" + "\n" +
514 "URL: " + "\n" +
515 "Password: 123456" + "\n" +
516 "Notes: ENSQL1/ENSQL2" + "\n" +
517 "" + "\n" +
518 "[Enquiro Domain - SQLServer]" + "\n" +
519 "Group: Services" + "\n" +
520 "User Name: ABC" + "\n" +
521 "URL: " + "\n" +
522 "Password: 123456" + "\n" +
523 "Notes: ENSQL1" + "\n" +
524 "" + "\n" +
525 "[ENQUIRO/SEIService User Account]" + "\n" +
526 "Group: Services" + "\n" +
527 "User Name: ABC" + "\n" +
528 "URL: " + "\n" +
529 "Password: 123456" + "\n" +
530 "Notes: " + "\n" +
531 "" + "\n" +
532 "[ENSPS1 Anonymous User]" + "\n" +
533 "Group: Services" + "\n" +
534 "User Name: ABC" + "\n" +
535 "URL: " + "\n" +
536 "Password: 123456" + "\n" +
537 "Notes: ENSPS1" + "\n" +
538 "" + "\n" +
539 "[Exchange Email Archive]" + "\n" +
540 "Group: Services" + "\n" +
541 "User Name: ABC" + "\n" +
542 "URL: " + "\n" +
543 "Password: 123456" + "\n" +
544 "Notes: Cory changed this on 2007/01/31 to 123456" + "\n" +
545 "" + "\n" +
546 "[MySQL]" + "\n" +
547 "Group: Services" + "\n" +
548 "User Name: ABC" + "\n" +
549 "URL: " + "\n" +
550 "Password: 123456" + "\n" +
551 "Notes: BUGZILLA" + "\n" +
552 "" + "\n" +
553 "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" +
554 "Group: Services" + "\n" +
555 "User Name: ABC" + "\n" +
556 "URL: " + "\n" +
557 "Password: 123456" + "\n" +
558 "Notes: BLENDER" + "\n" +
559 "" + "\n" +
560 "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" +
561 "Group: Services" + "\n" +
562 "User Name: ABC" + "\n" +
563 "URL: " + "\n" +
564 "Password: 123456" + "\n" +
565 "Notes: BLENDER" + "\n" +
566 "" + "\n" +
567 "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" +
568 "Group: Services" + "\n" +
569 "User Name: ABC" + "\n" +
570 "URL: " + "\n" +
571 "Password: 123456" + "\n" +
572 "Notes: BLENDER" + "\n" +
573 "" + "\n" +
574 "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" +
575 "Group: Services" + "\n" +
576 "User Name: ABC" + "\n" +
577 "URL: " + "\n" +
578 "Password: 123456" + "\n" +
579 "Notes: BLENDER" + "\n" +
580 "" + "\n" +
581 "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" +
582 "Group: Services" + "\n" +
583 "User Name: ABC" + "\n" +
584 "URL: " + "\n" +
585 "Password: 123456" + "\n" +
586 "Notes: BLENDER" + "\n" +
587 "" + "\n" +
588 "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" +
589 "Group: Services" + "\n" +
590 "User Name: ABC" + "\n" +
591 "URL: " + "\n" +
592 "Password: 123456" + "\n" +
593 "Notes: BLENDER" + "\n" +
594 "" + "\n" +
595 "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" +
596 "Group: Services" + "\n" +
597 "User Name: ABC" + "\n" +
598 "URL: " + "\n" +
599 "Password: 123456" + "\n" +
600 "Notes: BLENDER" + "\n" +
601 "" + "\n" +
602 "[Sharepoint Single Sign On Acct]" + "\n" +
603 "Group: Services" + "\n" +
604 "User Name: ABC" + "\n" +
605 "URL: " + "\n" +
606 "Password: 123456" + "\n" +
607 "Notes: " + "\n" +
608 "" + "\n" +
609 "[SourceSafe on ENDEV1]" + "\n" +
610 "Group: Services" + "\n" +
611 "User Name: ABC" + "\n" +
612 "URL: " + "\n" +
613 "Password: 123456" + "\n" +
614 "Notes: ENDEV1" + "\n" +
615 "" + "\n" +
616 "[Bugzilla Database]" + "\n" +
617 "Group: Database Passwords" + "\n" +
618 "User Name: ABC" + "\n" +
619 "URL: " + "\n" +
620 "Password: 123456" + "\n" +
621 "Notes: BUGZILLA" + "\n" +
622 "" + "\n" +
623 "[Bugzilla Database]" + "\n" +
624 "Group: Database Passwords" + "\n" +
625 "User Name: ABC" + "\n" +
626 "URL: " + "\n" +
627 "Password: 123456" + "\n" +
628 "Notes: ENDEV1" + "\n" +
629 "" + "\n" +
630 "[ENDOC1 Goldmine SQL2005]" + "\n" +
631 "Group: Database Passwords" + "\n" +
632 "User Name: ABC" + "\n" +
633 "URL: " + "\n" +
634 "Password: 123456" + "\n" +
635 "Notes: added 19 Oct 2007 with the Goldmine upgrade." + "\n" +
636 "" + "\n" +
637 "[Enquiro Survey Database Account]" + "\n" +
638 "Group: Database Passwords" + "\n" +
639 "User Name: ABC" + "\n" +
640 "URL: " + "\n" +
641 "Password: 123456" + "\n" +
642 "Notes: " + "\n" +
643 "" + "\n" +
644 "[Enquiro Survey Development Account]" + "\n" +
645 "Group: Database Passwords" + "\n" +
646 "User Name: ABC" + "\n" +
647 "URL: " + "\n" +
648 "Password: 123456" + "\n" +
649 "Notes: " + "\n" +
650 "" + "\n" +
651 "[ENSQL1]" + "\n" +
652 "Group: Database Passwords" + "\n" +
653 "User Name: ABC" + "\n" +
654 "URL: " + "\n" +
655 "Password: 123456" + "\n" +
656 "Notes: ENSQL1" + "\n" +
657 "" + "\n" +
658 "[ENSQL1]" + "\n" +
659 "Group: Database Passwords" + "\n" +
660 "User Name: ABC" + "\n" +
661 "URL: " + "\n" +
662 "Password: 123456" + "\n" +
663 "Notes: ENSQL1" + "\n" +
664 "" + "\n" +
665 "[ENSQL1]" + "\n" +
666 "Group: Database Passwords" + "\n" +
667 "User Name: ABC" + "\n" +
668 "URL: " + "\n" +
669 "Password: 123456" + "\n" +
670 "Notes: ENSQL1" + "\n" +
671 "" + "\n" +
672 "[ENSQL1]" + "\n" +
673 "Group: Database Passwords" + "\n" +
674 "User Name: ABC" + "\n" +
675 "URL: " + "\n" +
676 "Password: 123456" + "\n" +
677 "Notes: " + "\n" +
678 "" + "\n" +
679 "[ENSQL2]" + "\n" +
680 "Group: Database Passwords" + "\n" +
681 "User Name: ABC" + "\n" +
682 "URL: " + "\n" +
683 "Password: 123456" + "\n" +
684 "Notes: " + "\n" +
685 "" + "\n" +
686 "[OutOfMyGord.com Database]" + "\n" +
687 "Group: Database Passwords" + "\n" +
688 "User Name: ABC" + "\n" +
689 "URL: " + "\n" +
690 "Password: 123456" + "\n" +
691 "Notes: VADER" + "\n" +
692 "" + "\n" +
693 "[Sharepoint Services Database]" + "\n" +
694 "Group: Database Passwords" + "\n" +
695 "User Name: ABC" + "\n" +
696 "URL: " + "\n" +
697 "Password: 123456" + "\n" +
698 "Notes: " + "\n" +
699 "" + "\n" +
700 "[Anti-Virus (Trend)]" + "\n" +
701 "Group: Miscellaneous" + "\n" +
702 "User Name: ABC" + "\n" +
703 "URL: " + "\n" +
704 "Password: 123456" + "\n" +
705 "Notes: http://ensql1.enquiro.net/officescan/console/cgi/cgiChkMasterPwd.exe" + "\n" +
706 "" + "\n" +
707 "[Anti-Virus Uninstall]" + "\n" +
708 "Group: Miscellaneous" + "\n" +
709 "User Name: " + "\n" +
710 "URL: " + "\n" +
711 "Password: 123456" + "\n" +
712 "Notes: " + "\n" +
713 "" + "\n" +
714 "[Anti-Virus Unload]" + "\n" +
715 "Group: Miscellaneous" + "\n" +
716 "User Name: " + "\n" +
717 "URL: " + "\n" +
718 "Password: 123456" + "\n" +
719 "Notes: " + "\n" +
720 "" + "\n" +
721 "[ENEXC1 Security Certificate]" + "\n" +
722 "Group: Miscellaneous" + "\n" +
723 "User Name: " + "\n" +
724 "URL: " + "\n" +
725 "Password: 123456" + "\n" +
726 "Notes: Required for using Outlook over HTTP" + "\n" +
727 "" + "\n" +
728 "[Eye Tracking Study PDF]" + "\n" +
729 "Group: Miscellaneous" + "\n" +
730 "User Name: " + "\n" +
731 "URL: " + "\n" +
732 "Password: 123456" + "\n" +
733 "Notes: PDF Password" + "\n" +
734 "" + "\n" +
735 "[Google Account - Research Department]" + "\n" +
736 "Group: Miscellaneous" + "\n" +
737 "User Name: ABC" + "\n" +
738 "URL: " + "\n" +
739 "Password: 123456" + "\n" +
740 "Notes: Used to track web history for personalization" + "\n" +
741 "" + "\n" +
742 "[Google Account - Research Department]" + "\n" +
743 "Group: Miscellaneous" + "\n" +
744 "User Name: ABC" + "\n" +
745 "URL: " + "\n" +
746 "Password: 123456" + "\n" +
747 "Notes: Used to track web history for personalization" + "\n" +
748 "" + "\n" +
749 "[Goldmine Administrator]" + "\n" +
750 "Group: Miscellaneous" + "\n" +
751 "User Name: ABC" + "\n" +
752 "URL: " + "\n" +
753 "Password: 123456" + "\n" +
754 "Notes: Adding users to Goldmine" + "\n" +
755 "" + "\n" +
756 "[AIG Insurance]" + "\n" +
757 "Group: Clients" + "\n" +
758 "User Name: ABC" + "\n" +
759 "URL: " + "\n" +
760 "Password: 123456" + "\n" +
761 "Notes: ENSPS1" + "\n" +
762 "" + "\n" +
763 "[Allstate Insurance Company]" + "\n" +
764 "Group: Clients" + "\n" +
765 "User Name: ABC" + "\n" +
766 "URL: " + "\n" +
767 "Password: 123456" + "\n" +
768 "Notes: ENSPS1" + "\n" +
769 "" + "\n" +
770 "[Babyzone]" + "\n" +
771 "Group: Clients" + "\n" +
772 "User Name: ABC" + "\n" +
773 "URL: " + "\n" +
774 "Password: 123456" + "\n" +
775 "Notes: Babyzone Google Sitemaps Login" + "\n" +
776 "" + "\n" +
777 "[Habeas]" + "\n" +
778 "Group: Clients" + "\n" +
779 "User Name: ABC" + "\n" +
780 "URL: " + "\n" +
781 "Password: 123456" + "\n" +
782 "Notes: ENSPS1" + "\n" +
783 "" + "\n" +
784 "[Hanley Wood]" + "\n" +
785 "Group: Clients" + "\n" +
786 "User Name: ABC" + "\n" +
787 "URL: " + "\n" +
788 "Password: 123456" + "\n" +
789 "Notes: ENSPS1" + "\n" +
790 "" + "\n" +
791 "[Kaboose Inc.]" + "\n" +
792 "Group: Clients" + "\n" +
793 "User Name: ABC" + "\n" +
794 "URL: " + "\n" +
795 "Password: 123456" + "\n" +
796 "Notes: ENSPS1" + "\n" +
797 "" + "\n" +
798 "[Lesley University]" + "\n" +
799 "Group: Clients" + "\n" +
800 "User Name: ABC" + "\n" +
801 "URL: " + "\n" +
802 "Password: 123456" + "\n" +
803 "Notes: ENSPS1" + "\n" +
804 "" + "\n" +
805 "[Plastic Products Mfg]" + "\n" +
806 "Group: Clients" + "\n" +
807 "User Name: ABC" + "\n" +
808 "URL: " + "\n" +
809 "Password: 123456" + "\n" +
810 "Notes: ENSPS1" + "\n" +
811 "" + "\n" +
812 "[Project Server Extranet User]" + "\n" +
813 "Group: Clients" + "\n" +
814 "User Name: ABC" + "\n" +
815 "URL: " + "\n" +
816 "Password: 123456" + "\n" +
817 "Notes: " + "\n" +
818 "" + "\n" +
819 "[Rent Chalets]" + "\n" +
820 "Group: Clients" + "\n" +
821 "User Name: ABC" + "\n" +
822 "URL: " + "\n" +
823 "Password: 123456" + "\n" +
824 "Notes: ENSPS1" + "\n" +
825 "" + "\n" +
826 "[Siemens Communications]" + "\n" +
827 "Group: Clients" + "\n" +
828 "User Name: ABC" + "\n" +
829 "URL: " + "\n" +
830 "Password: 123456" + "\n" +
831 "Notes: ENSPS1" + "\n" +
832 "" + "\n" +
833 "[Sterling Commerce]" + "\n" +
834 "Group: Clients" + "\n" +
835 "User Name: ABC" + "\n" +
836 "URL: " + "\n" +
837 "Password: 123456" + "\n" +
838 "Notes: ENSPS1" + "\n" +
839 "" + "\n" +
840 "[Enquiro]" + "\n" +
841 "Group: FTP" + "\n" +
842 "User Name: ABC" + "\n" +
843 "URL: " + "\n" +
844 "Password: 123456" + "\n" +
845 "Notes: " + "\n" +
846 "" + "\n" +
847 "[clientlogs.enquiro.net]" + "\n" +
848 "Group: FTP" + "\n" +
849 "User Name: ABC" + "\n" +
850 "URL: " + "\n" +
851 "Password: 123456" + "\n" +
852 "Notes: 199.60.252.152" + "\n" +
853 "" + "\n" +
854 "[HrHero]" + "\n" +
855 "Group: FTP" + "\n" +
856 "User Name: ABC" + "\n" +
857 "URL: " + "\n" +
858 "Password: 123456" + "\n" +
859 "Notes: 199.60.252.152" + "\n" +
860 "" + "\n" +
861 "[Kaboose]" + "\n" +
862 "Group: FTP" + "\n" +
863 "User Name: ABC" + "\n" +
864 "URL: " + "\n" +
865 "Password: 123456" + "\n" +
866 "Notes: 199.60.252.152" + "\n" +
867 "" + "\n" +
868 "[Royal Roads University]" + "\n" +
869 "Group: FTP" + "\n" +
870 "User Name: ABC" + "\n" +
871 "URL: " + "\n" +
872 "Password: 123456" + "\n" +
873 "Notes: 199.60.252.152" + "\n" +
874 "" + "\n" +
875 "[ftp.enquiro.com]" + "\n" +
876 "Group: FTP" + "\n" +
877 "User Name: ABC" + "\n" +
878 "URL: " + "\n" +
879 "Password: 123456" + "\n" +
880 "Notes: TYRANUS (199.60.252.157)" + "\n" +
881 "" + "\n" +
882 "[Gene6 FTP Admistrator]" + "\n" +
883 "Group: FTP" + "\n" +
884 "User Name: ABC" + "\n" +
885 "URL: ensql2" + "\n" +
886 "Password: 123456" + "\n" +
887 "Notes: Used to create FTP folders for client use" + "\n" +
888 "" + "\n";
889
890
891//-------------------------------------------------------------------------
892//
893 //This data is probably in the KeePassX export format that is not supported right now
894//
895testData['Jordan_Curzon_data'] = "" +
896 "*** Group: Financial ***" + "\n" +
897 "" + "\n" +
898 " Title: Allstate" + "\n" +
899 " Username: jones" + "\n" +
900 " Url: allstate.com" + "\n" +
901 " Password: bobfred" + "\n" +
902 " Comment:" + "\n" +
903 "" + "\n" +
904 " Title: NW Natural" + "\n" +
905 " Username: jones@gmail.com" + "\n" +
906 " Url: nwnatural.com" + "\n" +
907 " Password: bobfred" + "\n" +
908 " Comment: Account number: 097oe9u0098098" + "\n" +
909 "" + "\n";
910
diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html
new file mode 100644
index 0000000..a8a1317
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html
@@ -0,0 +1,59 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.KeePassExportProcessor - test</title>
32
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script>
45
46 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
47
48 <!-- script type="text/javascript" src="./KeePassExportProcessor.data.js"></script>
49 <script type="text/javascript" src="./KeePassExportProcessor.test.js"></script -->
50
51</head>
52<body>
53
54<pre id="test">
55<script type="text/javascript" src="./KeePassExportProcessor.data.js"></script>
56<script type="text/javascript" src="./KeePassExportProcessor.test.js"></script>
57</pre>
58</body>
59</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js
new file mode 100644
index 0000000..0ce4c91
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js
@@ -0,0 +1,141 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29var tests = {
30
31 //-------------------------------------------------------------------------
32
33 'test1_test': function (someTestArgs) {
34 var deferredResult;
35 varkeePassProcessor;
36
37 keePassProcessor = new Clipperz.KeePassExportProcessor();
38
39 deferredResult = new Clipperz.Async.Deferred("test1_test", someTestArgs);
40 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" });
41 deferredResult.addMethod(keePassProcessor, 'deferredParse');
42 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); });
43 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
44
45 deferredResult.callback();
46
47 return deferredResult;
48 },
49
50 'test2_test': function (someTestArgs) {
51 var deferredResult;
52 varkeePassProcessor;
53
54 keePassProcessor = new Clipperz.KeePassExportProcessor();
55
56 deferredResult = new Clipperz.Async.Deferred("test2_test", someTestArgs);
57 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
58 deferredResult.addMethod(keePassProcessor, 'deferredParse');
59 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); });
60 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
61
62 deferredResult.callback();
63
64 return deferredResult;
65 },
66
67 'test3_test': function (someTestArgs) {
68 var deferredResult;
69 varkeePassProcessor;
70
71 keePassProcessor = new Clipperz.KeePassExportProcessor();
72
73 deferredResult = new Clipperz.Async.Deferred("test3_test", someTestArgs);
74 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
75 deferredResult.addMethod(keePassProcessor, 'deferredParse');
76 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); });
77 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
78
79 deferredResult.callback();
80
81 return deferredResult;
82 },
83
84 //-------------------------------------------------------------------------
85
86 'Barb_Newman_test': function (someTestArgs) {
87 var deferredResult;
88 varkeePassProcessor;
89
90 keePassProcessor = new Clipperz.KeePassExportProcessor();
91
92 deferredResult = new Clipperz.Async.Deferred("Barb_Newman_test", someTestArgs);
93 // deferredResult.addCallback(function () { return testData['Barb_Newman_data']; });
94 deferredResult.addMethod(keePassProcessor, 'deferredParse');
95 deferredResult.addBoth(function(aResult) {
96 SimpleTest.is(aResult.length, 121, "Barb's data contains 121 records");
97 return aResult;
98 });
99 deferredResult.addBoth(function(aResult) {
100 SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Domain Administration Account\", \"Group\":\"Windows\", \"User Name\":\"_ABC\", \"URL\":\"\", \"Password\":\"123456\", \"Notes\":\"\"}", "Barb's first record data matches");
101 return aResult;
102 });
103 // deferredResult.callback();
104 deferredResult.callback(testData['Barb_Newman_data']);
105
106 return deferredResult;
107 },
108
109 //-------------------------------------------------------------------------
110/*
111 'Jordan_Curzon_test': function (someTestArgs) {
112 var deferredResult;
113 varkeePassProcessor;
114
115 keePassProcessor = new Clipperz.KeePassExportProcessor();
116
117 deferredResult = new Clipperz.Async.Deferred("Jordan_Curzon_test", someTestArgs);
118 deferredResult.addCallback(function () { return testData['Jordan_Curzon_data']; });
119 deferredResult.addMethod(keePassProcessor, 'deferredParse');
120 deferredResult.addBoth(function(aResult) {
121 SimpleTest.is(aResult.length, 2, "Jordarn's data contains 2 records");
122 return aResult;
123 });
124 deferredResult.addBoth(function(aResult) {
125 SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Allstate\", \"Username\":\"jones\", \"Url\":\"allstate.com\", \"Password\":\"bobfred\", \"Comment\":\"\"}", "Barb's first record data matches");
126 return aResult;
127 });
128 deferredResult.callback();
129
130 return deferredResult;
131 },
132 */
133 //-------------------------------------------------------------------------
134 'syntaxFix': MochiKit.Base.noop
135};
136
137
138
139//#############################################################################
140
141SimpleTest.runDeferredTests("Clipperz.KeyPassExportProcessor", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html
new file mode 100644
index 0000000..f856f98
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html
@@ -0,0 +1,52 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
34
35 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
36
37 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
42
43 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
45</head>
46<body>
47
48<pre id="test">
49<script type="text/javascript" src="KeyValueObjectStore.test.js"></script>
50</pre>
51</body>
52</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js
new file mode 100644
index 0000000..53cf5d3
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js
@@ -0,0 +1,255 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29var tests = {
30
31 //-------------------------------------------------------------------------
32
33 'simple_tests': function() {
34 vardeferredResult;
35
36 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
37 deferredResult.addCallback(function() {
38 varobjectStore;
39
40 objectStore = new Clipperz.KeyValueObjectStore();
41
42 ok(objectStore != null, "created an object store");
43
44 objectStore.setValue('key', "value");
45 is(objectStore.getValue('key'), "value", "can store and read a value to a simple key");
46
47 objectStore.setValue('key', "overwritten value");
48 is(objectStore.getValue('key'), "overwritten value", "using the same key overwrites the previous value");
49
50 objectStore.setValue('record.keys', [1, 2, 3]);
51 is(
52 MochiKit.Base.compare(objectStore.getValue('record'), {'keys': [1,2,3]}),
53 0,
54 "getting a partial key returns the whole content associate with that key"
55 );
56 is(
57 MochiKit.Base.compare(objectStore.getValue('record.keys'), [1,2,3]),
58 0,
59 "accessing data using a key.path return the matching content"
60 );
61 is(
62 MochiKit.Base.compare(objectStore.getValue('record.keys.1'), 2),
63 0,
64 "accessing data using a key.path return the matching content, even inside an array"
65 );
66
67 is(
68 objectStore.setValue('key', "value"),
69 "value",
70 "setting a value return the value itself, as a convenience to chain deferred methods"
71 );
72
73 is(
74 objectStore.getValue('not_set_key'),
75 null,
76 "accessing a previously undefined key will return null"
77 );
78 is(
79 objectStore.getValue('record.not_set_key'),
80 null,
81 "accessing a previously undefined key will return null, even if part of the path is defined"
82 );
83 is(
84 objectStore.getValue('not_set_path.not_set_key'),
85 null,
86 "accessing a previously undefined key will return null, even if using a completely undefined path"
87 );
88
89 objectStore.removeAllData();
90 is(
91 objectStore.getValue('key'),
92 null,
93 "getting a value after a 'removeAllData' return no value"
94 );
95
96 });
97
98 deferredResult.callback();
99
100 return deferredResult;
101 },
102
103 //-------------------------------------------------------------------------
104
105 'simple_deferredGetOrSet_test': function () {
106 vardeferredResult;
107 varobjectStore;
108 var testValue;
109
110 objectStore = new Clipperz.KeyValueObjectStore();
111 testValue = "nifty test value";
112
113 deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_test", {trace:false});
114 deferredResult.addMethod(objectStore, 'setValue', 'key', testValue);
115 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue});
116 deferredResult.addCallback(function(aResult) {
117 SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store");
118 })
119 deferredResult.callback();
120 },
121
122 //-------------------------------------------------------------------------
123
124 'deferredGetOrSet_test': function () {
125 vardeferredResult;
126 varobjectStore;
127 var testValue;
128
129 objectStore = new Clipperz.KeyValueObjectStore();
130 testValue = "nifty test value";
131
132 deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_test", {trace:false});
133 deferredResult.addMethod(objectStore, 'setValue', 'key.path', testValue);
134 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; });
135 deferredResult.addCallback(function(aResult) {
136 SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store");
137 })
138 deferredResult.callback();
139 },
140
141 //-------------------------------------------------------------------------
142
143 'simple_deferredGetOrSet_withMissingValue_test': function () {
144 vardeferredResult;
145 varobjectStore;
146 var testValue;
147
148 objectStore = new Clipperz.KeyValueObjectStore();
149 testValue = "nifty test value";
150
151 deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_withMissingValue_test", {trace:false});
152 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue});
153 deferredResult.addCallback(function(aResult) {
154 SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store");
155 })
156 deferredResult.callback();
157 },
158
159 //-------------------------------------------------------------------------
160
161 'deferredGetOrSet_withMissingValue_test': function () {
162 vardeferredResult;
163 varobjectStore;
164 var testValue;
165
166 objectStore = new Clipperz.KeyValueObjectStore();
167 testValue = "nifty test value";
168
169 deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_withMissingValue_test", {trace:false});
170 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; });
171 deferredResult.addCallback(function(aResult) {
172 SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store");
173 })
174 deferredResult.callback();
175 },
176
177 //-------------------------------------------------------------------------
178
179 'deleteObjectKey': function () {
180 varsomeValues;
181 var objectStore;
182
183 someValues = {
184 'key1': {
185 'key1_1': "value 1.1",
186 'key1_2': "value 1.2"
187 },
188 'key2': {
189 'key2_1': {
190 'key2.1.1': "value 2.1.1",
191 'key2.1.2': "value 2.1.2"
192 },
193 'key2_2': "value 2.2"
194 }
195 }
196
197 objectStore = new Clipperz.KeyValueObjectStore();
198 objectStore.initWithValues(someValues);
199 objectStore.removeValue('key2.key2_1');
200
201 SimpleTest.is(objectStore.getValue('key1.key1_1'), "value 1.1", "The first element is still there");
202 SimpleTest.is(objectStore.getValue('key1.key1_2'), "value 1.2", "The second element is still there");
203 SimpleTest.is(objectStore.getValue('key2.key2_1'), null, "The deleted element is actually gone");
204 SimpleTest.is(MochiKit.Base.keys(objectStore.getValue('key2')).length, 1, "Even the key is not stored anylonger");
205 SimpleTest.is(objectStore.getValue('key2.key2_2'), "value 2.2", "The sibling of the deleted element is still there");
206 },
207
208 //-------------------------------------------------------------------------
209
210 'accessDataUsingANumericKey': function () {
211 varsomeValues;
212 var objectStore;
213
214 someValues = {
215 '1': "value 1",
216 '2': "value 2"
217 }
218
219 objectStore = new Clipperz.KeyValueObjectStore();
220 objectStore.initWithValues(someValues);
221
222 SimpleTest.is(objectStore.getValue(1), "value 1", "The first element is accessed even using a numeric key");
223
224 objectStore.setValue(3, "value 3");
225 SimpleTest.is(objectStore.getValue('3'), "value 3", "I can set the value using a numeric key and get it with a string key");
226 },
227
228 //-------------------------------------------------------------------------
229
230 'isEmpty_test': function () {
231 varsomeValues;
232 var objectStore;
233
234 someValues = {
235 '1': "value 1",
236 '2': "value 2"
237 }
238
239 objectStore = new Clipperz.KeyValueObjectStore();
240 SimpleTest.is(objectStore.isEmpty(), true, "A newly initialized KeyValueStore is empty");
241
242 objectStore.initWithValues(someValues);
243 SimpleTest.is(objectStore.isEmpty(), false, "Once the KeyValueStore is initialized with some values, it is no logner empty");
244
245 objectStore.removeAllData();
246 SimpleTest.is(objectStore.isEmpty(), true, "A KeyValueStore is empty after invoking the 'removeAllData' method");
247 },
248
249 //-------------------------------------------------------------------------
250 'syntaxFix': MochiKit.Base.noop
251};
252
253//#############################################################################
254
255SimpleTest.runDeferredTests("Clipperz.KeyValueObjectStore", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html
new file mode 100644
index 0000000..9bd344e
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html
@@ -0,0 +1,59 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.BookmarkletProcessor - test</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
45
46 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
49
50 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
51
52</head>
53<body>
54
55<pre id="test">
56<script type="text/javascript" src="BookmarkletProcessor.test.js"></script>
57</pre>
58</body>
59</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js
new file mode 100644
index 0000000..21776a3
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js
@@ -0,0 +1,132 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29function testBookmarkletConfigurationString (aConfiguration, shouldFail, aMessage) {
30 //var configuration;
31
32//try {
33 //configuration = Clipperz.Base.evalJSON(aConfiguration);
34//} catch (exception) {
35 //console.log("EXCEPTION", exception);
36 //throw exception;
37//}
38
39//console.log("configuration", configuration);
40
41 if (shouldFail == true) {
42 try {
43 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration);
44 SimpleTest.ok(false, "vulnerability not caught - " + aMessage);
45 } catch(exception) {
46 SimpleTest.ok(true, "vulnerability correctly caught - " + aMessage);
47 }
48 } else {
49 try {
50 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration);
51 SimpleTest.ok(true, "configuration correctly checked - " + aMessage);
52 } catch(exception) {
53 SimpleTest.ok(false, "configuration wrongly caught as malicious - " + aMessage);
54 // console.log(exception);
55 }
56 }
57}
58
59//#############################################################################
60
61var tests = {
62
63 //-------------------------------------------------------------------------
64
65 'simpleAmazonConfiguration_test': function () {
66 var bookmarkletConfigurationString;
67
68 bookmarkletConfigurationString = "{"+
69 "\"page\": {\"title\": \"Sign In\"},\n" +
70 "\"form\": {" +
71 "\"attributes\": {" +
72 "\"action\": \"https://www.amazon.com/gp/flex/sign-in/select.html\",\n" +
73 "\"method\": \"post\"" +
74 "},\n" +
75 "\"inputs\": [" +
76 "{\"type\": \"hidden\",\n\"name\": \"path\",\n\"value\": \"/gp/yourstore\"},\n" +
77 "{\"type\": \"hidden\",\n\"name\": \"useRedirectOnSuccess\",\n\"value\": \"1\"},\n" +
78 "{\"type\": \"hidden\",\n\"name\": \"query\",\n\"value\": \"signIn=1&action=sign-out&useRedirectOnSuccess=1&path=/gp/yourstore&ref_=pd_irl_gw_r\"},\n" +
79 "{\"type\": \"hidden\",\n\"name\": \"mode\",\n\"value\": \"\"},\n" +
80 "{\"type\": \"hidden\",\n\"name\": \"redirectProtocol\",\n\"value\": \"\"},\n" +
81 "{\"type\": \"hidden\",\n\"name\": \"pageAction\",\n\"value\": \"/gp/yourstore\"},\n" +
82 "{\"type\": \"hidden\",\n\"name\": \"disableCorpSignUp\",\n\"value\": \"\"},\n" +
83 "{\"type\": \"hidden\",\n\"name\": \"protocol\",\n\"value\": \"https\"},\n" +
84 "{\"type\": \"hidden\",\n\"name\": \"sessionId\",\n\"value\": \"105-1479357-7902864\"},\n" +
85 "{\"type\": \"hidden\",\n\"name\": \"referer\",\n\"value\": \"flex\"},\n" +
86 "{\"type\": \"text\",\n\"name\": \"email\",\n\"value\": \"\"},\n" +
87 "{\"type\": \"password\",\n\"name\": \"password\",\n\"value\": \"\"},\n" +
88 "{\"type\": \"hidden\",\n\"name\": \"metadata1\",\n\"value\": \"Firefox 3.0.3 Mac\"},\n" +
89 "{\"type\": \"hidden\",\n\"name\": \"metadataf1\",\n\"value\": \"\"},\n" +
90 "{\"type\": \"hidden\",\n\"name\": \"metadata2\",\n\"value\": \"Default Plug-in Java Embedding Plugin 0.9.6.4 Shockwave Flash 90124RealPlayer Plugin QuickTime Plug-in 7.5.5 Flip4Mac Windows Media Plugin 2.2 4||1440-900-878-24-*-*-*\"},\n" +
91 "{\"type\": \"hidden\",\n\"name\": \"metadata3\",\n\"value\": \"timezone: -1 execution time: 3\"},\n" +
92 "{\"name\": \"action\",\n\"type\": \"radio\",\n\"options\": [" +
93 "{\"value\": \"new-user\",\n\"checked\": false},\n" +
94 "{\"value\": \"sign-in\",\n\"checked\": true}" +
95 "]}" +
96 "]" +
97 "},\n" +
98 "\"version\": \"0.2.3\"" +
99 "}";
100 testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "regular Amazon.com configuration");
101 },
102
103 //-------------------------------------------------------------------------
104
105 'hackedConfigurationWithXSSAttackVectorReadyToBeTriggeredWhenActivatingTheDirectLogin_test': function () {
106 var bookmarkletConfigurationString;
107
108 bookmarkletConfigurationString = "{" +
109 "\"page\": {\"title\": \"Example Attack\"}," +
110 "\"form\": { " +
111 "\"attributes\": { " +
112 "\"action\": \"javascript:opener.document.body.innerHTML = 'hacked!';close();\", " +
113 "\"style\": \"-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss')\", " +
114 "\"method\": null " +
115 "}, " +
116 "\"inputs\": [" +
117 "{\"type\": \"text\", \"name\": \"username\", \"value\": \"\"}, " +
118 "{\"type\": \"password\", \"name\": \"password\", \"value\": \"\"}" +
119 "]" +
120 "}," +
121 "\"version\": \"0.2.3\" " +
122 "}";
123 testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "hacked configuration that is trying to inject a XSS attack vector. It should not fail, as it is responsability of the direct login to avoid triggering such attack vector");
124 },
125
126 //-------------------------------------------------------------------------
127 'syntaxFix': MochiKit.Base.noop
128}
129
130//#############################################################################
131
132SimpleTest.runDeferredTests("Clipperz.PM.BookmarkletProcessor", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js
new file mode 100644
index 0000000..9dec232
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js
@@ -0,0 +1,841 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29testData = {
30
31 //-------------------------------------------------------------------------
32
33 'joe_clipperz_offline_copy_data': {
34 users:{
35 'catchAllUser': {
36 __masterkey_test_value__: 'masterkey',
37 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
38 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
39 },
40 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
41 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
42 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
43 version: '0.2',
44 maxNumberOfRecords: '100',
45 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}',
46 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
47 userDetailsVersion: '0.3',
48 records: {
49 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
50 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
51 version: '0.2',
52 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
53 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
54 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
55 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
56 versions: {
57 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
58 header: '####',
59 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
60 version: '0.2',
61 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
62 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
63 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
64 }
65 }
66 },
67 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
68 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
69 version: '0.3',
70 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
71 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
72 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
73 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
74 versions: {
75 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
76 header: '####',
77 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
78 version: '0.3',
79 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
80 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
81 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
82 },
83 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
84 header: '####',
85 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
86 version: '0.3',
87 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
88 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
89 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
90 },
91 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
92 header: '####',
93 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
94 version: '0.3',
95 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
96 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
97 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
98 },
99 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
100 header: '####',
101 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
102 version: '0.3',
103 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
104 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
105 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
106 },
107 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
108 header: '####',
109 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
110 version: '0.3',
111 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
112 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
113 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
114 },
115 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
116 header: '####',
117 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
118 version: '0.3',
119 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
120 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
121 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
122 },
123 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
124 header: '####',
125 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
126 version: '0.3',
127 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
128 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
129 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
130 },
131 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
132 header: '####',
133 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
134 version: '0.3',
135 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
136 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
137 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
138 }
139 }
140 },
141 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
142 data: '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',
143 version: '0.2',
144 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
145 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
146 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
147 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
148 versions: {
149 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
150 header: '####',
151 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
152 version: '0.2',
153 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
154 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
155 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
156 },
157 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
158 header: '####',
159 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
160 version: '0.2',
161 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
162 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
163 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
164 },
165 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
166 header: '####',
167 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
168 version: '0.2',
169 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
170 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
171 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
172 },
173 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
174 header: '####',
175 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
176 version: '0.2',
177 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
178 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
179 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
180 },
181 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
182 header: '####',
183 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
184 version: '0.2',
185 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
186 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
187 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
188 },
189 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
190 header: '####',
191 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
192 version: '0.2',
193 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
194 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
195 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
196 },
197 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
198 header: '####',
199 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
200 version: '0.2',
201 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
202 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
203 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
204 },
205 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
206 header: '####',
207 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
208 version: '0.2',
209 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
210 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
211 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
212 }
213 }
214 },
215 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
216 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
217 version: '0.3',
218 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
219 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
220 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
221 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
222 versions: {
223 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
224 header: '####',
225 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
226 version: '0.2',
227 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
228 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
229 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
230 },
231 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
232 header: '####',
233 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
234 version: '0.3',
235 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
236 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
237 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
238 },
239 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
240 header: '####',
241 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
242 version: '0.2',
243 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
244 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
245 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
246 },
247 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
248 header: '####',
249 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
250 version: '0.3',
251 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
252 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
253 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
254 }
255 }
256 },
257 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
258 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
259 version: '0.2',
260 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
261 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
262 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
263 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
264 versions: {
265 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
266 header: '####',
267 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
268 version: '0.2',
269 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
270 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
271 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
272 }
273 }
274 },
275 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
276 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
277 version: '0.3',
278 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
279 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
280 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
281 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
282 versions: {
283 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
284 header: '####',
285 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
286 version: '0.3',
287 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
288 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
289 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
290 }
291 }
292 },
293 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
294 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
295 version: '0.2',
296 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
297 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
298 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
299 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
300 versions: {
301 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
302 header: '####',
303 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
304 version: '0.2',
305 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
306 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
307 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
308 }
309 }
310 },
311 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
312 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
313 version: '0.2',
314 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
315 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
316 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
317 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
318 versions: {
319 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
320 header: '####',
321 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
322 version: '0.2',
323 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
324 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
325 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
326 }
327 }
328 },
329 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
330 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
331 version: '0.2',
332 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
333 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
334 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
335 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
336 versions: {
337 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
338 header: '####',
339 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
340 version: '0.2',
341 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
342 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
343 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
344 }
345 }
346 },
347 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
348 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
349 version: '0.3',
350 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
351 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
352 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
353 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
354 versions: {
355 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
356 header: '####',
357 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
358 version: '0.3',
359 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
360 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
361 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
362 }
363 }
364 },
365 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
366 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
367 version: '0.2',
368 creationDate: 'Tue May 01 01:10:17 CEST 2007',
369 updateDate: 'Tue May 01 01:13:27 CEST 2007',
370 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
371 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
372 versions: {
373 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
374 header: '####',
375 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
376 version: '0.2',
377 creationDate: 'Tue May 01 01:10:17 CEST 2007',
378 updateDate: 'Tue May 01 01:10:17 CEST 2007',
379 accessDate: 'Tue May 01 01:10:17 CEST 2007'
380 },
381 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
382 header: '####',
383 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
384 version: '0.2',
385 creationDate: 'Tue May 01 01:13:27 CEST 2007',
386 updateDate: 'Tue May 01 01:13:27 CEST 2007',
387 accessDate: 'Mon Jan 19 16:10:02 CET 2009'
388 }
389 }
390 },
391 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
392 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
393 version: '0.2',
394 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
395 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
396 accessDate: 'Mon Jan 19 16:10:01 CET 2009',
397 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
398 versions: {
399 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
400 header: '####',
401 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
402 version: '0.2',
403 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
404 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
405 accessDate: 'Mon Jan 19 16:10:01 CET 2009'
406 }
407 }
408 },
409 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
410 data: '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',
411 version: '0.3',
412 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
413 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
414 accessDate: 'Thu Feb 12 12:54:37 CET 2009',
415 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
416 versions: {
417 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
418 header: '####',
419 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
420 version: '0.3',
421 creationDate: 'Thu Feb 12 12:54:37 CET 2009',
422 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
423 accessDate: 'Thu Feb 12 12:54:37 CET 2009'
424 },
425 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
426 header: '####',
427 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
428 version: '0.3',
429 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
430 updateDate: 'Thu Feb 12 12:45:43 CET 2009',
431 accessDate: 'Thu Feb 12 12:45:43 CET 2009'
432 },
433 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
434 header: '####',
435 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
436 version: '0.3',
437 creationDate: 'Thu Feb 12 12:47:39 CET 2009',
438 updateDate: 'Thu Feb 12 12:47:39 CET 2009',
439 accessDate: 'Thu Feb 12 12:47:39 CET 2009'
440 }
441 }
442 },
443 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
444 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
445 version: '0.2',
446 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
447 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
448 accessDate: 'Mon Jan 19 16:10:12 CET 2009',
449 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
450 versions: {
451 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
452 header: '####',
453 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
454 version: '0.2',
455 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
456 updateDate: 'Wed Mar 14 15:51:17 CET 2007',
457 accessDate: 'Wed Apr 25 10:37:27 CEST 2007'
458 },
459 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
460 header: '####',
461 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
462 version: '0.2',
463 creationDate: 'Wed Apr 25 10:39:26 CEST 2007',
464 updateDate: 'Wed Apr 25 10:39:26 CEST 2007',
465 accessDate: 'Wed Apr 25 10:39:26 CEST 2007'
466 },
467 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
468 header: '####',
469 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
470 version: '0.2',
471 creationDate: 'Wed Apr 25 11:14:05 CEST 2007',
472 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
473 accessDate: 'Mon Jan 19 16:10:12 CET 2009'
474 },
475 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
476 header: '####',
477 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
478 version: '0.2',
479 creationDate: 'Wed Apr 25 10:51:49 CEST 2007',
480 updateDate: 'Wed Apr 25 10:51:49 CEST 2007',
481 accessDate: 'Wed Apr 25 10:51:49 CEST 2007'
482 },
483 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
484 header: '####',
485 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
486 version: '0.2',
487 creationDate: 'Wed Apr 25 11:01:21 CEST 2007',
488 updateDate: 'Wed Apr 25 11:01:21 CEST 2007',
489 accessDate: 'Wed Apr 25 11:01:21 CEST 2007'
490 },
491 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
492 header: '####',
493 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
494 version: '0.2',
495 creationDate: 'Wed Apr 25 10:59:57 CEST 2007',
496 updateDate: 'Wed Apr 25 10:59:57 CEST 2007',
497 accessDate: 'Wed Apr 25 10:59:57 CEST 2007'
498 },
499 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
500 header: '####',
501 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
502 version: '0.2',
503 creationDate: 'Wed Apr 25 10:38:17 CEST 2007',
504 updateDate: 'Wed Apr 25 10:38:17 CEST 2007',
505 accessDate: 'Wed Apr 25 10:38:17 CEST 2007'
506 },
507 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
508 header: '####',
509 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
510 version: '0.2',
511 creationDate: 'Wed Apr 25 10:56:58 CEST 2007',
512 updateDate: 'Wed Apr 25 10:56:58 CEST 2007',
513 accessDate: 'Wed Apr 25 10:56:58 CEST 2007'
514 },
515 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
516 header: '####',
517 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
518 version: '0.2',
519 creationDate: 'Wed Apr 25 10:58:33 CEST 2007',
520 updateDate: 'Wed Apr 25 10:58:33 CEST 2007',
521 accessDate: 'Wed Apr 25 10:58:33 CEST 2007'
522 }
523 }
524 },
525 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
526 data: '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',
527 version: '0.2',
528 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
529 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
530 accessDate: 'Mon Jan 19 16:10:23 CET 2009',
531 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
532 versions: {
533 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
534 header: '####',
535 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
536 version: '0.2',
537 creationDate: 'Wed Mar 14 17:27:40 CET 2007',
538 updateDate: 'Wed Mar 14 17:27:40 CET 2007',
539 accessDate: 'Wed Mar 14 19:00:21 CET 2007'
540 },
541 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
542 header: '####',
543 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
544 version: '0.2',
545 creationDate: 'Wed Mar 14 16:09:07 CET 2007',
546 updateDate: 'Wed Mar 14 16:09:07 CET 2007',
547 accessDate: 'Wed Mar 14 16:39:40 CET 2007'
548 },
549 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
550 header: '####',
551 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
552 version: '0.2',
553 creationDate: 'Wed Mar 14 19:01:05 CET 2007',
554 updateDate: 'Wed Mar 14 19:01:05 CET 2007',
555 accessDate: 'Tue Apr 17 19:20:33 CEST 2007'
556 },
557 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
558 header: '####',
559 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
560 version: '0.2',
561 creationDate: 'Wed Mar 14 17:17:20 CET 2007',
562 updateDate: 'Wed Mar 14 17:17:20 CET 2007',
563 accessDate: 'Wed Mar 14 17:22:06 CET 2007'
564 },
565 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
566 header: '####',
567 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
568 version: '0.2',
569 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
570 updateDate: 'Wed Mar 14 16:06:54 CET 2007',
571 accessDate: 'Wed Mar 14 16:06:54 CET 2007'
572 },
573 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
574 header: '####',
575 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
576 version: '0.2',
577 creationDate: 'Tue Apr 17 19:23:41 CEST 2007',
578 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
579 accessDate: 'Mon Jan 19 16:10:23 CET 2009'
580 },
581 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
582 header: '####',
583 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
584 version: '0.2',
585 creationDate: 'Tue Apr 17 19:22:08 CEST 2007',
586 updateDate: 'Tue Apr 17 19:22:08 CEST 2007',
587 accessDate: 'Tue Apr 17 19:22:08 CEST 2007'
588 }
589 }
590 },
591 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
592 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
593 version: '0.2',
594 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
595 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
596 accessDate: 'Mon Jan 19 16:09:28 CET 2009',
597 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
598 versions: {
599 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
600 header: '####',
601 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
602 version: '0.2',
603 creationDate: 'Wed Mar 14 16:51:02 CET 2007',
604 updateDate: 'Wed Mar 14 16:51:02 CET 2007',
605 accessDate: 'Wed Mar 14 16:51:02 CET 2007'
606 },
607 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
608 header: '####',
609 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
610 version: '0.2',
611 creationDate: 'Mon Jul 09 15:10:15 CEST 2007',
612 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
613 accessDate: 'Mon Jan 19 16:09:28 CET 2009'
614 },
615 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
616 header: '####',
617 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
618 version: '0.2',
619 creationDate: 'Wed Mar 21 12:56:43 CET 2007',
620 updateDate: 'Wed Mar 21 12:56:43 CET 2007',
621 accessDate: 'Wed Apr 25 09:59:58 CEST 2007'
622 },
623 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
624 header: '####',
625 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
626 version: '0.2',
627 creationDate: 'Sat May 19 11:26:44 CEST 2007',
628 updateDate: 'Sat May 19 11:26:44 CEST 2007',
629 accessDate: 'Mon Jul 09 15:08:39 CEST 2007'
630 },
631 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
632 header: '####',
633 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
634 version: '0.2',
635 creationDate: 'Wed Mar 14 16:38:54 CET 2007',
636 updateDate: 'Wed Mar 14 16:38:54 CET 2007',
637 accessDate: 'Wed Mar 14 16:38:54 CET 2007'
638 },
639 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
640 header: '####',
641 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
642 version: '0.2',
643 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
644 updateDate: 'Wed Mar 14 16:36:20 CET 2007',
645 accessDate: 'Wed Mar 14 16:38:12 CET 2007'
646 },
647 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
648 header: '####',
649 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
650 version: '0.2',
651 creationDate: 'Wed Apr 25 10:04:29 CEST 2007',
652 updateDate: 'Wed Apr 25 10:04:29 CEST 2007',
653 accessDate: 'Sat May 19 11:22:01 CEST 2007'
654 },
655 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
656 header: '####',
657 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
658 version: '0.2',
659 creationDate: 'Wed Mar 14 16:52:12 CET 2007',
660 updateDate: 'Wed Mar 14 16:52:12 CET 2007',
661 accessDate: 'Wed Mar 21 12:16:29 CET 2007'
662 }
663 }
664 },
665 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
666 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
667 version: '0.2',
668 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
669 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
670 accessDate: 'Mon Jan 19 16:10:06 CET 2009',
671 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
672 versions: {
673 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
674 header: '####',
675 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
676 version: '0.2',
677 creationDate: 'Wed Mar 14 16:45:40 CET 2007',
678 updateDate: 'Wed Mar 14 16:45:40 CET 2007',
679 accessDate: 'Wed Mar 14 16:45:40 CET 2007'
680 },
681 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
682 header: '####',
683 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
684 version: '0.2',
685 creationDate: 'Wed Mar 14 16:47:01 CET 2007',
686 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
687 accessDate: 'Mon Jan 19 16:10:06 CET 2009'
688 },
689 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
690 header: '####',
691 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
692 version: '0.2',
693 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
694 updateDate: 'Wed Mar 14 16:20:58 CET 2007',
695 accessDate: 'Wed Mar 14 16:43:46 CET 2007'
696 }
697 }
698 },
699 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
700 data: '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',
701 version: '0.2',
702 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
703 updateDate: 'Thu May 10 15:01:21 CEST 2007',
704 accessDate: 'Mon Jan 19 16:09:54 CET 2009',
705 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
706 versions: {
707 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
708 header: '####',
709 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
710 version: '0.2',
711 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
712 updateDate: 'Wed Mar 14 13:35:58 CET 2007',
713 accessDate: 'Wed Mar 14 13:35:58 CET 2007'
714 },
715 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
716 header: '####',
717 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
718 version: '0.2',
719 creationDate: 'Wed Mar 14 19:24:49 CET 2007',
720 updateDate: 'Wed Mar 14 19:24:49 CET 2007',
721 accessDate: 'Wed Mar 14 19:24:49 CET 2007'
722 },
723 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
724 header: '####',
725 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
726 version: '0.2',
727 creationDate: 'Wed Mar 14 17:41:15 CET 2007',
728 updateDate: 'Wed Mar 14 17:41:15 CET 2007',
729 accessDate: 'Wed Mar 14 17:41:15 CET 2007'
730 },
731 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
732 header: '####',
733 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
734 version: '0.2',
735 creationDate: 'Wed Mar 14 19:25:28 CET 2007',
736 updateDate: 'Wed Mar 14 19:25:28 CET 2007',
737 accessDate: 'Thu May 10 15:00:47 CEST 2007'
738 },
739 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
740 header: '####',
741 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
742 version: '0.2',
743 creationDate: 'Wed Mar 14 14:46:36 CET 2007',
744 updateDate: 'Wed Mar 14 14:46:36 CET 2007',
745 accessDate: 'Wed Mar 14 17:40:01 CET 2007'
746 },
747 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
748 header: '####',
749 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
750 version: '0.2',
751 creationDate: 'Thu May 10 15:01:21 CEST 2007',
752 updateDate: 'Thu May 10 15:01:21 CEST 2007',
753 accessDate: 'Mon Jan 19 16:09:54 CET 2009'
754 },
755 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
756 header: '####',
757 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
758 version: '0.2',
759 creationDate: 'Wed Mar 14 17:43:29 CET 2007',
760 updateDate: 'Wed Mar 14 17:43:29 CET 2007',
761 accessDate: 'Wed Mar 14 19:23:51 CET 2007'
762 }
763 }
764 },
765 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
766 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
767 version: '0.3',
768 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
769 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
770 accessDate: 'Mon Jan 19 16:09:41 CET 2009',
771 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
772 versions: {
773 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
774 header: '####',
775 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
776 version: '0.2',
777 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
778 updateDate: 'Wed Mar 14 17:39:39 CET 2007',
779 accessDate: 'Tue Apr 17 19:09:44 CEST 2007'
780 },
781 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
782 header: '####',
783 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
784 version: '0.2',
785 creationDate: 'Tue Apr 17 19:12:39 CEST 2007',
786 updateDate: 'Tue Apr 17 19:12:39 CEST 2007',
787 accessDate: 'Wed Feb 13 15:27:04 CET 2008'
788 },
789 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
790 header: '####',
791 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
792 version: '0.3',
793 creationDate: 'Wed Feb 13 15:29:04 CET 2008',
794 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
795 accessDate: 'Mon Jan 19 16:09:41 CET 2009'
796 },
797 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
798 header: '####',
799 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
800 version: '0.3',
801 creationDate: 'Wed Feb 13 15:28:28 CET 2008',
802 updateDate: 'Wed Feb 13 15:28:28 CET 2008',
803 accessDate: 'Wed Feb 13 15:28:28 CET 2008'
804 },
805 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
806 header: '####',
807 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
808 version: '0.2',
809 creationDate: 'Tue Apr 17 19:11:33 CEST 2007',
810 updateDate: 'Tue Apr 17 19:11:33 CEST 2007',
811 accessDate: 'Tue Apr 17 19:11:33 CEST 2007'
812 }
813 }
814 },
815 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
816 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
817 version: '0.2',
818 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
819 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
820 accessDate: 'Mon Jan 19 16:09:30 CET 2009',
821 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
822 versions: {
823 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
824 header: '####',
825 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
826 version: '0.2',
827 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
828 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
829 accessDate: 'Mon Jan 19 16:09:30 CET 2009'
830 }
831 }
832 }
833 }
834 }
835 }
836 },
837
838 //-------------------------------------------------------------------------
839
840 'syntaxFix': ""
841}
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.html b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html
new file mode 100644
index 0000000..181a3bf
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html
@@ -0,0 +1,71 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.Connection - test</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
60
61 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
62
63</head>
64<body>
65
66<pre id="test">
67<script type="text/javascript" src="Connection.data.js"></script>
68<script type="text/javascript" src="Connection.test.js"></script>
69</pre>
70</body>
71</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js
new file mode 100644
index 0000000..e4d0d15
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js
@@ -0,0 +1,255 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 //-------------------------------------------------------------------------
34
35 'simple_tests': function () {
36 vardeferredResult;
37
38 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
39 deferredResult.addCallback(function() {
40 var connection;
41
42 SimpleTest.is(Clipperz.PM.Connection.communicationProtocol.versions['current'], Clipperz.PM.Connection.SRP['1.1'], "the current connection is 1.1");
43
44 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']();
45 SimpleTest.ok(connection != null, "can create a connection with the 'current' communication protocol");
46
47 SimpleTest.is(connection.proxy(), Clipperz.PM.Proxy.defaultProxy, "the connection uses the defaultProxy if no proxy is specified on the constructor");
48 });
49
50 deferredResult.callback();
51
52 return deferredResult;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'simpleProxy_tests': function () {
58 vardeferredResult;
59
60 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
61 deferredResult.addCallback(function() {
62 var connection;
63 var proxy;
64
65 proxy = new Clipperz.PM.Proxy();
66 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({proxy:proxy});
67 SimpleTest.is(connection.proxy(), proxy, "the connection uses the specified proxy, when present");
68 });
69
70 deferredResult.callback();
71
72 return deferredResult;
73 },
74
75 //-------------------------------------------------------------------------
76
77 'login_test': function () {
78 var deferredResult;
79 var connection;
80 var proxy;
81
82 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, shouldCheckExpectedRequests:true});
83 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({
84 proxy: proxy,
85 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; }
86 });
87
88 deferredResult = new Clipperz.Async.Deferred("login_tests", {trace:false});
89 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
90 deferredResult.addCallback(function() {
91 proxy.expectedRequests().unshift({
92 name: "First handshake step",
93 functionName: 'handshake',
94 parameters: {
95 parameters: {
96 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"),
97 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
98 parameters: {
99 C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"),
100 A: MochiKit.Base.operator.truth
101 }
102 }
103 }
104 });
105 });
106 deferredResult.addCallback(function() {
107 proxy.expectedRequests().unshift({
108 name: "Second handshake step",
109 functionName: 'handshake',
110 parameters: {
111 parameters: {
112 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"),
113 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
114 parameters: {
115 M1: MochiKit.Base.operator.truth
116 }
117 }
118 }
119 });
120 });
121 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/);
122 deferredResult.addCallback(function(aResult) {
123 SimpleTest.is(aResult.result, 'done', "successfully logged in");
124 })
125 deferredResult.addErrback(SimpleTest.ok, false, "the login procedure should succeed, and NOT going through this code path");
126 deferredResult.callback();
127
128 return deferredResult;
129 },
130
131 //-------------------------------------------------------------------------
132
133 'login_with_toll_test': function () {
134 var deferredResult;
135 var connection;
136 var proxy;
137
138 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:true});
139 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({
140 proxy:proxy,
141 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; }
142 });
143
144 deferredResult = new Clipperz.Async.Deferred("login_with_toll_test", {trace:false});
145 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
146 deferredResult.addCallback(function() {
147 proxy.expectedRequests().unshift({
148 name: "knock step",
149 functionName: 'knock',
150 parameters: {
151 requestType: MochiKit.Base.partial(MochiKit.Base.operator.eq, "CONNECT")
152 }
153 });
154 });
155 deferredResult.addCallback(function() {
156 proxy.expectedRequests().unshift({
157 name: "First handshake step",
158 functionName: 'handshake',
159 parameters: {
160 parameters: {
161 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"),
162 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
163 parameters: {
164 C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"),
165 A: MochiKit.Base.operator.truth
166 }
167 },
168 toll: {
169 targetValue: MochiKit.Base.operator.truth,
170 toll: MochiKit.Base.operator.truth
171 }
172 }
173 });
174 });
175 deferredResult.addCallback(function() {
176 proxy.expectedRequests().unshift({
177 name: "Second handshake step",
178 functionName: 'handshake',
179 parameters: {
180 parameters: {
181 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"),
182 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
183 parameters: {
184 M1: MochiKit.Base.operator.truth
185 }
186 },
187 toll: {
188 targetValue: MochiKit.Base.operator.truth,
189 toll: MochiKit.Base.operator.truth
190 }
191 }
192 });
193 });
194 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/);
195 deferredResult.addCallback(function(aResult) {
196 SimpleTest.is(aResult.result, 'done', "successfully logged in");
197 })
198 deferredResult.callback();
199
200 return deferredResult;
201 },
202
203 //-------------------------------------------------------------------------
204
205 'getUserDetails_test': function () {
206 var deferredResult;
207 var connection;
208 var proxy;
209
210 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:false});
211 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({
212 proxy:proxy,
213 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; }
214 });
215
216 deferredResult = new Clipperz.Async.Deferred("getUserDetails_test", {trace:false});
217 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
218 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/);
219 deferredResult.addCallback(function(aResult) {
220 SimpleTest.is(aResult.result, 'done', "successfully logged in");
221 });
222 deferredResult.addMethod(proxy, 'setShouldCheckExpectedRequests', [
223 {
224 name: "Get user details",
225 functionName: 'message',
226 parameters: {
227 parameters: {
228 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "getUserDetails"),
229 srpSharedSecret: MochiKit.Base.operator.truth
230 },
231 toll: {
232 targetValue: MochiKit.Base.operator.truth,
233 toll: MochiKit.Base.operator.truth
234 }
235 }
236 }
237 ]);
238 deferredResult.addMethod(connection, 'message', 'getUserDetails');
239 deferredResult.addCallback(function(aResult) {
240 SimpleTest.ok(aResult['header'] != null, "got user details - header");
241 SimpleTest.ok(aResult['statistics'] != null, "got user details - statistics");
242 SimpleTest.ok(aResult['version'] == '0.3', "got user details - version");
243 });
244 deferredResult.callback();
245
246 return deferredResult;
247 },
248
249 //-------------------------------------------------------------------------
250 'syntaxFix': MochiKit.Base.noop
251};
252
253//#############################################################################
254
255SimpleTest.runDeferredTests("Clipperz.PM.Connection", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
new file mode 100644
index 0000000..f95e994
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
@@ -0,0 +1,281 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.Crypto - TEST</title>
32
33 <script>
34 jslog_config_enabled = true;
35 clipperz_profiling_enabled = true;
36 </script>
37
38 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
39 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
40 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
41
42 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
45
46 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Profile.js'></script>
52
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
59
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
63
64 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
65<!--
66 <script>
67 MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true));
68 MochiKit.Logging.logger.useNativeConsole = true;
69 </script>
70-->
71</head>
72<body>
73<pre id="test">
74
75<script type="text/javascript">
76
77
78Clipperz_PM_Crypt_test = function() {
79 varkey;
80
81 var plainData;
82 var encryptedData;
83 var decryptedData;
84
85 var result;
86 var expectedResult;
87
88 var plainText;
89 var longPlainText;
90
91 key = 'trustno1';
92
93 plainText = "Lorem ipsum dolor sit amet";
94 longPlainText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
95
96 //
97 //hashing
98 //
99 plainData = new Clipperz.ByteArray(plainText);
100
101 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData);
102 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a short text");
103
104 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData);
105 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a short text");
106
107
108 plainData = new Clipperz.ByteArray(longPlainText);
109
110 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData);
111 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a long text");
112
113 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData);
114 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a long text");
115
116
117 //
118 //encrypting / decripting
119 //
120 plainData = plainText;
121
122 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData);
123 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData);
124 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a short text");
125
126 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData);
127 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData);
128 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a short text");
129
130//console.time("encrypt-256-short");
131 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData);
132//console.timeEnd("encrypt-256-short");
133//console.time("decrypt-256-short");
134 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData);
135//console.timeEnd("decrypt-256-short");
136 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a short text");
137
138
139 plainData = longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText;
140
141/*
142 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData);
143 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData);
144 is(plainData, decryptedData, "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a long text");
145
146 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData);
147 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData);
148 is(plainData, decryptedData, "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a long text");
149
150 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData);
151 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData);
152 is(plainData, decryptedData, "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a long text");
153*/
154
155 {
156 var deferredResult;
157 var startTime;
158 // var nonce;
159
160 // nonce = new Clipperz.ByteArray("0x00000000000000000000000000000000");
161 plainData = plainData + plainData + plainData + plainData + plainData + plainData + plainData + plainData;
162MochiKit.Logging.logDebug("plainData length: " + plainData.length);
163 startTime = new Date();
164
165 deferredResult = new MochiKit.Async.Deferred();
166
167 deferredResult.addCallback(function() {
168 return Clipperz.PM.Crypto.deferredEncrypt({key:key, value:plainData, version:'0.3'});
169 // return Clipperz.PM.Crypto.encrypt(key, plainData, '0.3' / *Clipperz.PM.Crypto.encryptingFunctions.currentVersion* /);
170 });
171 deferredResult.addCallback(function(aResult) {
172 MochiKit.Logging.logDebug("encrypting: " + (new Date() - startTime));
173 startTime = new Date();
174 return aResult;
175 });
176 deferredResult.addCallback(MochiKit.Async.wait, 1);
177 deferredResult.addCallback(function(aResult) {
178 MochiKit.Logging.logDebug("pause: " + (new Date() - startTime));
179 startTime = new Date();
180 return aResult;
181 });
182 deferredResult.addCallback(function(anEncryptedValue) {
183 return Clipperz.PM.Crypto.deferredDecrypt({key:key, value:anEncryptedValue, version:'0.3'});
184 });
185 deferredResult.addCallback(function(aResult) {
186 MochiKit.Logging.logDebug("decrypting: " + (new Date() - startTime));
187 startTime = new Date();
188 return aResult;
189 });
190 deferredResult.addCallback(MochiKit.Async.wait, 1);
191 deferredResult.addBoth(function(aDecryptedValue) {
192 is(plainData, aDecryptedValue, "deferredEncript/deferredDecript functions work with a long text");
193 });
194
195
196
197/*
198 deferredResult.addCallback(function(aResult) {
199 var i,c;
200 var currentChar;
201 var unicode;
202
203 unicode = 150;
204
205 c = 100000;
206 startTime = new Date();
207 for (i=0; i<c; i++) {
208 currentChar = String.fromCharCode(unicode+1);
209 }
210 MochiKit.Logging.logDebug("String.fromCharCode: " + (new Date() - startTime));
211 });
212
213 deferredResult.addCallback(function(aResult) {
214 var i,c;
215 var currentByte;
216 var unicode;
217
218 currentByte = 150;
219
220 c = 100000;
221 startTime = new Date();
222 for (i=0; i<c; i++) {
223 unicode = (currentByte & 0x0f) << (6+6);
224 }
225 MochiKit.Logging.logDebug("(currentByte & 0x0f) << (6+6): " + (new Date() - startTime));
226 });
227
228 deferredResult.addCallback(function(aResult) {
229 var i,c;
230 var currentByte;
231 var byteArray;
232
233 currentByte = 150;
234
235 byteArray = new Clipperz.ByteArray(plainData);
236 c = byteArray.length();
237 startTime = new Date();
238 for (i=0; i<c; i++) {
239 currentByte = byteArray.byteAtIndex(i);
240 }
241 MochiKit.Logging.logDebug("byteAtIndex: " + (new Date() - startTime));
242 });
243*/
244
245 deferredResult.addBoth(function() {
246 SimpleTest.ok(true, "COMPLETED all tests");
247 SimpleTest.finish();
248 })
249
250 deferredResult.callback();
251 }
252
253 SimpleTest.waitForExplicitFinish();
254}
255
256//#############################################################################
257
258try {
259 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', Clipperz_PM_Crypt_test);
260
261 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
262 SimpleTest.waitForExplicitFinish();
263} catch (err) {
264
265 var s = "test suite failure!\n";
266 var o = {};
267 var k = null;
268 for (k in err) {
269 // ensure unique keys?!
270 if (!o[k]) {
271 s += k + ": " + err[k] + "\n";
272 o[k] = err[k];
273 }
274 }
275 ok ( false, s );
276}
277
278</script>
279</pre>
280</body>
281</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html
new file mode 100644
index 0000000..094a58d
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html
@@ -0,0 +1,153 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.Crypt - Performance evaluation - TEST</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
50
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
54
55<!--< script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES_other_implementation.js'>< /script> -->
56
57</head>
58<body>
59<pre id="test">
60
61<script type="text/javascript">
62
63try {
64 var key;
65 var shortText;
66 var longText;
67 var veryLongText;
68 var byteArray;
69 varplainText;
70 var encryptedText;
71 var decryptedText;
72 var startTime, endTime;
73 var startTime1, endTime1;
74 var ClipperzCryptoVersion;
75 var i,c;
76
77 ClipperzCryptoVersion = '0.3';
78 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
79 key = 'trustno1';
80
81 shortText = "Lorem ipsum dolor sit amet";
82 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
83 veryLongText = "";
84 c = 100;
85 for (i=0; i<100; i++) {
86 veryLongText += longText;
87 }
88 nonce = new Clipperz.ByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
89
90
91 //--------------------------------------------------------------
92 //
93 // longTextencryption performance
94 //
95 //--------------------------------------------------------------
96
97 plainText = longText;
98
99startTime = new Date();
100 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText, nonce);
101endTime = new Date();
102//console.log("[1] encryption time: " + (endTime - startTime));
103 is((endTime - startTime < 350), true, "[1] Need to improve some more (" + (endTime - startTime) + ")");
104 is(encryptedText, "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", "encrypted text");
105 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText);
106 is(decryptedText, plainText, "encrypt <-> decrypt works (specifying the nonce)");
107
108startTime = new Date();
109 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText);
110endTime = new Date();
111//console.log("[2] encryption time: " + (endTime - startTime));
112 is((endTime - startTime < 350), true, "[2] Need to improve some more (" + (endTime - startTime) + ")");
113 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText);
114 is(decryptedText, plainText, "encrypt <-> decrypt works");
115
116 //--------------------------------------------------------------
117 //
118 // veryLongTextencryption performance
119 //
120 //--------------------------------------------------------------
121/*
122 plainText = veryLongText;
123
124startTime = new Date();
125 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText);
126endTime = new Date();
127//console.log("[3] encryption time: " + (endTime - startTime));
128 is((endTime - startTime < 35000), true, "[3] Need to improve some more (" + (endTime - startTime) + ")");
129 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText);
130 is(decryptedText, plainText, "encrypt <-> decrypt works");
131*/
132
133//#############################################################################
134
135} catch (err) {
136
137 var s = "test suite failure!\n";
138 var o = {};
139 var k = null;
140 for (k in err) {
141 // ensure unique keys?!
142 if (!o[k]) {
143 s += k + ": " + err[k] + "\n";
144 o[k] = err[k];
145 }
146 }
147 ok ( false, s );
148}
149
150</script>
151</pre>
152</body>
153</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html
new file mode 100644
index 0000000..f5b0a60
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html
@@ -0,0 +1,169 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.Crypto - TEST</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34
35 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
51
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
55
56
57<!-- ================================================================================ --> <script>
58//MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true));
59//MochiKit.Logging.logger.useNativeConsole = true;
60
61//-----------------------------------------------------------------------------
62
63encodePassword = function (anEvent) {
64 varusername;
65 var password;
66 var encodedPassword;
67 var srpConnection;
68
69 anEvent.stop();
70
71 srpConnection = new Clipperz.PM.Connection.SRP['1.1']();
72
73 username = MochiKit.DOM.getElement('username').value;
74 passphrase = MochiKit.DOM.getElement('passphrase').value;
75 encodedPassword = srpConnection.normalizedCredentials({'username':username , 'password':passphrase })['password'];
76
77 MochiKit.DOM.getElement('encodedPassword').value = encodedPassword;
78}
79
80//-----------------------------------------------------------------------------
81
82decryptData = function (anEvent) {
83 vardeferredResult;
84 varkey;
85 varversion;
86 var value;
87
88 key = MochiKit.DOM.getElement('key').value;
89 version = MochiKit.DOM.getElement('version').value;
90 value = MochiKit.DOM.getElement('encryptedText').value;
91
92 anEvent.stop();
93
94 deferredResult = new Clipperz.Async.Deferred("Decrypted data", {trace:false});
95 deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, {key:key, version:version, value:value});
96 deferredResult.addCallback(Clipperz.Base.serializeJSON);
97 deferredResult.addCallback(function (aValue) {
98 MochiKit.DOM.getElement('decryptedText').value = aValue;
99 });
100 deferredResult.addErrback(alert);
101
102 deferredResult.callback();
103}
104
105//-----------------------------------------------------------------------------
106
107encryptData = function (anEvent) {
108 vardeferredResult;
109 varkey;
110 varversion;
111 var value;
112
113 key = MochiKit.DOM.getElement('key').value;
114 version = MochiKit.DOM.getElement('version').value;
115 value = Clipperz.Base.evalJSON(MochiKit.DOM.getElement('decryptedText').value);
116
117 anEvent.stop();
118
119 deferredResult = new Clipperz.Async.Deferred("Encrypted data", {trace:false});
120 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt, {key:key, version:version, value:value});
121 deferredResult.addCallback(function (aValue) {
122 MochiKit.DOM.getElement('encryptedText').value = aValue;
123 });
124 deferredResult.addErrback(alert);
125
126 deferredResult.callback();
127}
128
129//-----------------------------------------------------------------------------
130
131init = function () {
132 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
133
134
135 MochiKit.Signal.connect('decryptForm', 'onsubmit', decryptData)
136 MochiKit.Signal.connect('decryptButton', 'onclick', decryptData)
137 MochiKit.Signal.connect('encryptButton', 'onclick', encryptData)
138
139 //MochiKit.Signal.connect('encodePassword', 'onclick', encodePassword)
140}
141
142//-----------------------------------------------------------------------------
143
144MochiKit.DOM.addLoadEvent(init);
145
146</script> <!-- =============================================================================== -->
147
148</head>
149<body>
150<!--
151 <form id='computeKey'>
152 <input type='text' name='username' value='' id='username' size='30'/>
153 <input type='text' name='passphrase' value='' id='passphrase' size='30'/>
154 <input type='button' name='encode' value='encode' id='encodePassword'>
155 <input type='text' name='encodedPassword' value='' id='encodedPassword' size='30'/>
156 </form>
157 <hr>
158-->
159 <form id='decryptForm'>
160 <div><textarea id='encryptedText' cols='80' rows='20'></textarea></div>
161 <div><input type='text' name='key' value='' id='key' size='30'/></div>
162 <div><input type='text' name='version' value='0.3' id='version' /></div>
163 <div><input type='button' name='decrypt' value='decrypt' id='decryptButton'> <input type='button' name='encrypt' value='encrypt' id='encryptButton'></div>
164 <hr>
165 <div><textarea id='decryptedText' cols='80' rows='20' style="background-color: lightgrey;">&lt;result&gt;</textarea></div>
166 </form>
167
168</body>
169</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html
new file mode 100644
index 0000000..e11adfd
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html
@@ -0,0 +1,103 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.DataModel.DirectLogin - test</title>
32
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
47
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
54
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
60
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
63
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
79 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
80
81 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
82<script>
83 Clipperz_IEisBroken = false;
84</script>
85
86<!--[if IE]><script>
87Clipperz_IEisBroken = true;
88Clipperz_normalizedNewLine = '\x0d\x0a';
89</script><![endif]-->
90
91</head>
92<body>
93
94<pre id="test">
95<script>
96 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
97</script>
98<script type="text/javascript" src="User.data.js"></script>
99<script type="text/javascript" src="User.data.old.js"></script>
100<script type="text/javascript" src="DirectLogin.test.js"></script>
101</pre>
102</body>
103</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js
new file mode 100644
index 0000000..d385c8c
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js
@@ -0,0 +1,195 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33/*
34 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
35 ...
36 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
37 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
38
39
40 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
41 ...
42 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
43 deferredResult.addMethod(user, 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0)
44 deferredResult.addMethod(user, 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1)
45 deferredResult.addMethod(user, 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2)
46 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
47 DirectLogin references
48 - dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496 //Yahoo! Mail
49 - aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584 //(Yahoo! Groups)
50 - 6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f //(Flickr)
51 - a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e //(My Yahoo!)
52*/
53 //-------------------------------------------------------------------------
54
55 'editDirectLoginLabel_test': function (someTestArgs) {
56 var deferredResult;
57 var proxy;
58 var user;
59
60 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
61 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
62
63 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test", someTestArgs);
64 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
65 deferredResult.addMethod(user, 'login');
66 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
67 deferredResult.addMethodcaller('directLogins');
68 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'));
69 deferredResult.addCallback(function (aDirectLogin) {
70 var innerDeferredResult;
71 var updatedLabel;
72
73 updatedLabel = "updated Yahoo! Mail label";
74
75 innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test <inner>", someTestArgs);
76 innerDeferredResult.addMethod(aDirectLogin, 'label');
77 innerDeferredResult.addTest("Yahoo! Mail", "The label of the selected direct login is correct.");
78 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel);
79
80 innerDeferredResult.addMethod(aDirectLogin, 'label');
81 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data.");
82
83 innerDeferredResult.addMethod(user, 'hasPendingChanges');
84 innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes.");
85
86//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ >>>")});
87 innerDeferredResult.addMethod(user, 'saveChanges');
88//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ <<<")});
89 innerDeferredResult.addMethod(user, 'hasPendingChanges');
90 innerDeferredResult.addTest(false, "After saving changes there should be no pending changes left.");
91
92 innerDeferredResult.addMethod(aDirectLogin, 'label');
93 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even after committing data.");
94
95 innerDeferredResult.callback();
96
97 return innerDeferredResult;
98 })
99
100 deferredResult.callback();
101
102 return deferredResult;
103 },
104
105 //-------------------------------------------------------------------------
106
107 'editDirectLoginLabel_thanResetItToThePreviousValue_test': function (someTestArgs) {
108 var deferredResult;
109 var proxy;
110 var user;
111
112 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
113 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
114
115 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test", someTestArgs);
116 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
117 deferredResult.addMethod(user, 'login');
118 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
119 deferredResult.addMethodcaller('directLogins');
120 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'));
121 deferredResult.addCallback(function (aDirectLogin) {
122 var innerDeferredResult;
123 var originalLabel;
124 var updatedLabel;
125
126 originalLabel = "Yahoo! Mail";
127 updatedLabel = "updated Yahoo! Mail label";
128
129 innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test <inner>", someTestArgs);
130 innerDeferredResult.addMethod(aDirectLogin, 'label');
131 innerDeferredResult.addTest(originalLabel, "The label of the selected direct login is correct.");
132 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel);
133
134 innerDeferredResult.addMethod(aDirectLogin, 'label');
135 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data.");
136
137 innerDeferredResult.addMethod(user, 'hasPendingChanges');
138 innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes [2].");
139
140 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', originalLabel);
141
142 innerDeferredResult.addMethod(aDirectLogin, 'hasPendingChanges');
143 innerDeferredResult.addTest(false, "Restoring the original label, the directLogin should report no pending changes.");
144
145 innerDeferredResult.addMethod(aDirectLogin.record(), 'hasPendingChanges');
146 innerDeferredResult.addTest(false, "Restoring the original label, the record should report no pending changes.");
147
148 innerDeferredResult.addMethod(user, 'hasPendingChanges');
149 innerDeferredResult.addTest(false, "Restoring the original label, the user should report no pending changes.");
150
151 innerDeferredResult.callback();
152
153 return innerDeferredResult;
154 })
155
156 deferredResult.callback();
157
158 return deferredResult;
159 },
160
161 //-------------------------------------------------------------------------
162/*
163 'bindingValues_test': function (someTestArgs) {
164 var deferredResult;
165 var proxy;
166 var user;
167
168 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
169 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
170
171 deferredResult = new Clipperz.Async.Deferred("DirectLogin.bindingValues_test", someTestArgs);
172 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
173 deferredResult.addMethod(user, 'login');
174 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
175 deferredResult.addMethodcaller('directLogins');
176 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'));
177 deferredResult.addMethodcaller('bindingValues');
178 deferredResult.addCallback(function (someBindingValues) {
179 SimpleTest.is(MochiKit.Base.keys(someBindingValues).length, 2, "there should be 2 bindings for this direct login");
180 SimpleTest.is(someBindingValues['login'], 'joe.clipperz', "the login field should be filled with 'joe.clipperz'");
181 SimpleTest.is(someBindingValues['passwd'], 'enfvDG1RxAsl', "the passwd field should be filled with 'enfvDG1RxAsl'");
182 })
183
184 deferredResult.callback();
185
186 return deferredResult;
187 },
188*/
189 //-------------------------------------------------------------------------
190 'syntaxFix': MochiKit.Base.noop
191};
192
193//#############################################################################
194
195SimpleTest.runDeferredTests("Clipperz.PM.DataModel.DirectLogin", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js
new file mode 100644
index 0000000..6c0bf49
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js
@@ -0,0 +1,33 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29directLoginConfigurations = {
30 'Yahoo! Mail':'{\n "page": {\n "title": "Yahoo! Mail"\n },\n "form": {\n "attributes": {\n "action": "https://login.yahoo.com/config/login?",\n "method": "post"\n },\n "inputs": [\n {\n "type": "hidden",\n "name": ".tries",\n "value": "1"\n },\n {\n "type": "hidden",\n "name": ".src",\n "value": "ym"\n },\n {\n "type": "hidden",\n "name": ".md5",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".hash",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".js",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".last",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "promo",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".intl",\n "value": "us"\n },\n {\n "type": "hidden",\n "name": ".bypass",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".partner",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".u",\n "value": "5gp62cl2vg3ov"\n },\n {\n "type": "hidden",\n "name": ".v",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".challenge",\n "value": "iBEY0IK6k3t9Uals32mrTos8s48p"\n },\n {\n "type": "hidden",\n "name": ".yplus",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".emailCode",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "pkg",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "stepid",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".ev",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "hasMsgr",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".chkP",\n "value": "Y"\n },\n {\n "type": "hidden",\n "name": ".done",\n "value": "http://mail.yahoo.com"\n },\n {\n "type": "hidden",\n "name": ".pd",\n "value": "ym_ver%3d0%26c="\n },\n {\n "type": "text",\n "name": "login",\n "value": ""\n },\n {\n "type": "password",\n "name": "passwd",\n "value": ""\n },\n {\n "type": "checkbox",\n "name": ".persistent",\n "value": "y"\n },\n {\n "type": "submit",\n "name": ".save",\n "value": "Sign In"\n }\n ]\n },\n "version": "0.2"\n}',
31 'Parallels':'{"page": {"title": "Parallels Account"},\n"form": {"attributes": {"action": "https://www.parallels.com/account/",\n"method": "post"},\n"inputs": [{"type": "text",\n"name": "Email",\n"value": ""},\n{"type": "password",\n"name": "Password",\n"value": ""}]},\n"version": "0.2.3"}',
32 __syntaxFix__: "syntax fix"
33}; \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html
new file mode 100644
index 0000000..699c06d
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html
@@ -0,0 +1,66 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.DataModel.EncryptedRemoteObject - test</title>
32
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46
47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
56
57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
58 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
59</head>
60<body>
61
62<pre id="test">
63<script type="text/javascript" src="EncryptedRemoteObject.test.js"></script>
64</pre>
65</body>
66</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js
new file mode 100644
index 0000000..0a4fe0c
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js
@@ -0,0 +1,225 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 //-------------------------------------------------------------------------
34
35 'simple_tests': function(someTestArgs) {
36 vardeferredResult;
37 varencryptedRemoteObject;
38
39 varkey;
40 var version;
41 var rawData;
42
43 key = "just a random key";
44 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
45 rawData = "just a random text to encrypt";
46
47 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
48 'retrieveKeyFunction': MochiKit.Base.noop,
49 'retrieveRemoteDataFunction':function () { return "--"},
50 'encryptedDataKeypath': '--',
51 'encryptedVersionKeypath': '--'
52 });
53 SimpleTest.ok(encryptedRemoteObject != null, "create an encryptedRemoteObject");
54
55 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.test - simple_tests", [
56 MochiKit.Base.method(encryptedRemoteObject, 'getRemoteData'),
57 function(aResult) {
58 SimpleTest.is(aResult, "--", "setting and getting serverData works");
59 }
60 ], someTestArgs);
61
62 return deferredResult;
63 },
64
65 //-------------------------------------------------------------------------
66
67 'decrypt_test': function (someTestArgs) {
68 vardeferredResult;
69 varencryptedRemoteObject;
70 varkey;
71 var version;
72 var rawData;
73
74 key = "just a random key";
75 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
76 rawData = "just a random text to encrypt";
77
78 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
79 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key),
80 'retrieveRemoteDataFunction':MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [
81 MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}),
82 function (someEncryptedData) {
83 return {
84 'data': someEncryptedData,
85 'version': version
86 }
87 }
88 ], someTestArgs)//,
89 // 'encryptedDataKeypath': 'data',
90 // 'encryptedVersionKeypath': 'version'
91 });
92
93 deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs);
94 deferredResult.addMethod(encryptedRemoteObject, 'getDecryptedData');
95 deferredResult.addCallback(function (aResult) {
96 SimpleTest.is(aResult, rawData, "encrypt and decrypt works");
97 })
98 deferredResult.callback();
99
100 return deferredResult;
101 },
102
103 //-------------------------------------------------------------------------
104
105 'getValue_test': function (someTestArgs) {
106 vardeferredResult;
107 varencryptedRemoteObject;
108 varkey;
109 var version;
110 var rawData;
111
112 key = "just a random key";
113 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
114 rawData = {
115 key1: 'value1',
116 key2: 'value2'
117 };
118
119 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
120 'reference': "testReference",
121 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key),
122 'retrieveRemoteDataFunction':MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [
123 MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}),
124 function (someEncryptedData) {
125 return {
126 'data': someEncryptedData,
127 'version': version
128 }
129 }
130 ], someTestArgs)//,
131 // 'encryptedDataKeypath': 'data',
132 // 'encryptedVersionKeypath': 'version'
133 });
134
135 deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs);
136
137 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1');
138 deferredResult.addTest('value1', "getting 'key1' works");
139 deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData');
140 deferredResult.addTest(true, "After accessing a value, hasAnyCleanTextData returns false");
141
142 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges');
143 deferredResult.addTest(false, "if nothing has changed, the object should return not pending changes");
144
145 deferredResult.addMethod(encryptedRemoteObject, 'deleteAllCleanTextData');
146 deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData');
147 deferredResult.addTest(false, "After deleting all cleanTextData, hasAnyCleanTextData returns false");
148
149 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1');
150 deferredResult.addTest('value1', "getting 'key1' (also after a lock) works correctly");
151
152 deferredResult.addMethod(encryptedRemoteObject, 'setValue', 'key1', 'new value1');
153 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1');
154 deferredResult.addTest('new value1', "after setting a new value, it is correctly returned");
155
156 deferredResult.addMethod(encryptedRemoteObject, 'values');
157 deferredResult.addCallback(function (someValues) {
158 SimpleTest.is(someValues['key1'], 'new value1', "the value got straight from the objectStore is correct");
159 });
160
161 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges');
162 deferredResult.addTest(true, "once a value has been changed, the object should return that there're some pending changes");
163
164 deferredResult.addMethod(encryptedRemoteObject, 'revertChanges');
165 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges');
166 deferredResult.addTest(false, "reverting the changes should return the object to its initial state, without any peding changes");
167
168 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1');
169 deferredResult.addTest('value1', "also the value of the changed item has been restored");
170
171 deferredResult.callback();
172
173 return deferredResult;
174 },
175
176 //-------------------------------------------------------------------------
177
178 'encrypt_with_new_object_test': function (someTestArgs) {
179 vardeferredResult;
180 varencryptedRemoteObject;
181 varkey;
182 // var version;
183 // var rawData;
184
185 key = "just a random key";
186 // version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
187 // rawData = "just a random text to encrypt";
188
189 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
190 'retrieveRemoteDataFunction':MochiKit.Base.noop
191 });
192
193 encryptedRemoteObject.setValue('key1', "value1");
194 encryptedRemoteObject.setValue('key2', "value2");
195 encryptedRemoteObject.setValue('key3', "value3");
196
197 deferredResult = new Clipperz.Async.Deferred("encrypt_with_new_object_test", someTestArgs);
198 deferredResult.addMethod(encryptedRemoteObject, 'prepareRemoteDataWithKey', key);
199 deferredResult.addCallback(MochiKit.Base.itemgetter('data'));
200 deferredResult.collectResults({
201 'key': MochiKit.Base.partial(MochiKit.Async.succeed, key),
202 'value':MochiKit.Async.succeed,
203 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion)
204 });
205 deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt);
206 deferredResult.addCallback(function (aResult) {
207 SimpleTest.is(aResult['key1'], "value1", "encrypt and decrypt works for first element");
208 SimpleTest.is(aResult['key2'], "value2", "encrypt and decrypt works for second element");
209 SimpleTest.is(aResult['key3'], "value3", "encrypt and decrypt works for third element");
210 })
211 deferredResult.callback();
212
213 return deferredResult;
214 },
215
216 //-------------------------------------------------------------------------
217 //-------------------------------------------------------------------------
218 //-------------------------------------------------------------------------
219 //-------------------------------------------------------------------------
220 'syntaxFix': MochiKit.Base.noop
221};
222
223//#############################################################################
224
225SimpleTest.runDeferredTests("Clipperz.PM.DataModel.EncryptedRemoteObject", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html
new file mode 100644
index 0000000..a9bac22
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html
@@ -0,0 +1,105 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.DataModel.User - test</title>
32
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
47
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
54
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
60
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
63
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
65
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
79 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
80 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
81 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
82 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
83
84 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
85<script>
86 Clipperz_IEisBroken = false;
87</script>
88
89<!--[if IE]><script>
90Clipperz_IEisBroken = true;
91Clipperz_normalizedNewLine = '\x0d\x0a';
92</script><![endif]-->
93
94</head>
95<body>
96
97<pre id="test">
98<script>
99 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
100</script>
101<script type="text/javascript" src="User.data.js"></script>
102<script type="text/javascript" src="OneTimePassword.test.js"></script>
103</pre>
104</body>
105</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js
new file mode 100644
index 0000000..0171714
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js
@@ -0,0 +1,198 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 //-------------------------------------------------------------------------
34
35 'isValidOneTimePasswordValue_test': function (someTestArgs) {
36 var otp;
37 var notOTP;
38
39 otp = 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg';
40 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(otp), true, "isValidOneTimePasswordValue [expect true] - test 1");
41
42 notOTP = 'trustno1';
43 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(notOTP), false, "isValidOneTimePasswordValue [expect false] - test 1");
44
45 return MochiKit.Async.succeed('done');
46 },
47
48 //-------------------------------------------------------------------------
49
50 'loginUsingOtp_test': function (someTestArgs) {
51 var deferredResult;
52 var proxy;
53 var user, user2;
54 var username;
55 var passphrase;
56
57 username = "test";
58 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP
59
60 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
61 user =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
62 user2 =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
63
64 deferredResult = new Clipperz.Async.Deferred("loginUsingOtp_test", someTestArgs);
65 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']);
66
67 deferredResult.addMethod(user, 'login');
68 deferredResult.addMethod(user, 'getRecords');
69 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
70 deferredResult.addTest(1, "This account has one single card");
71
72 deferredResult.addMethod(user, 'getOneTimePasswords');
73 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
74 deferredResult.addTest(1, "This account has one OTP");
75
76 deferredResult.addMethod(user, 'getOneTimePasswords');
77 deferredResult.addCallback(MochiKit.Base.itemgetter(0));
78 deferredResult.addCallback(MochiKit.Base.methodcaller('status'));
79 deferredResult.addTest('USED', "The available OTP has been unsed to login, and should be marked accordingly");
80
81 deferredResult.addMethod(user2, 'login');
82 deferredResult.shouldFail("trying to login using the same OTP twice");
83
84 deferredResult.callback();
85
86 return deferredResult;
87 },
88
89 //-------------------------------------------------------------------------
90
91 'changePassphraseAndLoginUsingOtp_test': function (someTestArgs) {
92 var deferredResult;
93 var proxy;
94 var user;
95 var user2;
96 var user3;
97 var otp;
98
99 otp = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP
100
101 newPassphrase = 'tset';
102 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
103 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
104 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return otp;}});
105
106 deferredResult = new Clipperz.Async.Deferred("changePassphraseAndLoginUsingOtp_test", someTestArgs);
107 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']);
108
109 deferredResult.addMethod(user, 'login');
110
111 deferredResult.addMethod(user, 'getRecords');
112 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
113 deferredResult.addTest(1, "This account has only a single card");
114
115 deferredResult.addMethod(user, 'changePassphrase', newPassphrase);
116 deferredResult.addMethod(user, 'logout');
117
118 deferredResult.addMethod(user2, 'login');
119 deferredResult.addMethod(user2, 'getRecords');
120 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
121 deferredResult.addTest(1, "This account has oly a single card");
122 deferredResult.addMethod(user2, 'logout');
123
124 deferredResult.callback();
125
126 return deferredResult;
127 },
128
129 //-------------------------------------------------------------------------
130
131 'loginUsingOtpAndWrongUsername_test': function (someTestArgs) {
132 var deferredResult;
133 var proxy;
134 var user, user2;
135 var username;
136 var wrongUsername;
137 var passphrase;
138
139 username = "test";
140 wrongUsername = "tset";
141 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP
142
143 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
144 user =new Clipperz.PM.DataModel.User({username:wrongUsername, getPassphraseFunction:function () { return passphrase;}});
145 user2 =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
146
147 deferredResult = new Clipperz.Async.Deferred("loginUsingOtpAndWrongUsername_test", someTestArgs);
148 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']);
149
150 deferredResult.addMethod(user, 'login');
151 deferredResult.shouldFail("login in using the wrong username with the OTP should fail");
152
153 deferredResult.addMethod(user2, 'login');
154 deferredResult.shouldFail("trying to reuse the same OTP should fail, even if now it is used with the correct username");
155
156 deferredResult.callback();
157
158 return deferredResult;
159 },
160
161 //-------------------------------------------------------------------------
162
163 'loginUserWithAPassphraseLookingExactlyLikeAnOTP_test': function (someTestArgs) {
164 var deferredResult;
165 var proxy;
166 var user;
167 var username;
168 var passphrase;
169
170 username = "otp_user";
171 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //passphrase
172
173 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
174 user =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
175
176 deferredResult = new Clipperz.Async.Deferred("loginUserWithAPassphraseLookingExactlyLikeAnOTP_test", someTestArgs);
177 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['otp_user_test']);
178
179 deferredResult.addMethod(user, 'login');
180 deferredResult.addMethod(user, 'getRecords');
181 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
182 deferredResult.addTest(1, "This account has one single card");
183
184 deferredResult.callback();
185
186 return deferredResult;
187 },
188
189 //-------------------------------------------------------------------------
190 //-------------------------------------------------------------------------
191 'syntaxFix': MochiKit.Base.noop
192};
193
194
195
196//#############################################################################
197
198SimpleTest.runDeferredTests("Clipperz.PM.DataModel.OneTimePassword", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html
new file mode 100644
index 0000000..c349e0d
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html
@@ -0,0 +1,98 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.DataModel.Record - test</title>
32
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
47
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
54
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
60 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
63
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
66
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
79 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
80 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
81 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
82 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
83 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
84
85 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
86</head>
87<body>
88
89<pre id="test">
90<script>
91 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
92</script>
93<script type="text/javascript" src="DirectLoginConfigurations.data.js"></script>
94<script type="text/javascript" src="User.data.js"></script>
95<script type="text/javascript" src="Record.test.js"></script>
96</pre>
97</body>
98</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
new file mode 100644
index 0000000..7d024d9
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
@@ -0,0 +1,1285 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 //-------------------------------------------------------------------------
34
35 'recordUseOf_retrieveIndexDataFunction_and_getRemoteDataFunction_test': function (someTestArgs) {
36 var deferredResult;
37 var record;
38
39//console.log("#### new Clipperz.PM.DataModel.Record [5]");
40 record = new Clipperz.PM.DataModel.Record({
41 'reference': '<<< record reference >>>',
42 'retrieveKeyFunction': MochiKit.Base.noop,
43 'retrieveRemoteDataFunction': function (aRecordReference) {
44 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for encrypted data");
45 return MochiKit.Async.succeed({
46 // fake server payload
47 'data': "#### fake encrypted data ####",
48 'version': "0.x",
49 'currentVersion': {
50 'reference': "<<< fake record version reference >>>",
51 'data': "#### fake encrypted data ####",
52 'version': "0.x"
53 }
54 });
55 },
56 'updateDate': "Thu, 10 May 2007 13:01:21 UTC",
57 // 'encryptedDataKeypath': 'data',
58 // 'encryptedVersionKeypath': 'version',
59
60 'retrieveIndexDataFunction':function (aRecordReference) {
61 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for index data");
62 return MochiKit.Async.succeed({
63 key:'<< key >>',
64 label:'<< label >>',
65 notes:'<< notes >>'
66 });
67 },
68 'updateIndexDataFunction': MochiKit.Base.noop
69
70 });
71
72 deferredResult = new Clipperz.Async.Deferred("recordUseOf_retrieveIndexDataFunction_and_getEncryptedDataFunction_test", someTestArgs);
73 deferredResult.addMethod(record, 'label');
74 deferredResult.addTest('<< label >>', "Record returns the right value for label");
75 deferredResult.addMethod(record, 'notes');
76 deferredResult.addTest('<< notes >>', "Record returns the right value for notes - even the legacy one, stored on the header");
77 deferredResult.addMethod(record, 'getRemoteData');
78 deferredResult.addCallback(Clipperz.Async.Test.isDeeply({ 'data': "#### fake encrypted data ####", 'version': "0.x", 'currentVersion': { 'reference': "<<< fake record version reference >>>", 'data': "#### fake encrypted data ####", 'version': "0.x" } }, "Record returns the expected encrypted data"));
79 deferredResult.callback();
80
81 return deferredResult;
82 },
83
84 //-------------------------------------------------------------------------
85
86 'createRecordWithoutAllRequiredParameters_test': function (someTestArgs) {
87 varrecord;
88
89 try {
90//console.log("#### new Clipperz.PM.DataModel.Record [6]");
91 record = new Clipperz.PM.DataModel.Record({reference:'--'});
92 SimpleTest.ok(false, "creating a record without all parameters should raise an exception");
93 } catch(exception) {
94 // SimpleTest.is(exception.name, "Clipperz.Base.exception.MandatoryParameter", "creating a record without all parameters raises an exception");
95 SimpleTest.ok(/Clipperz\.Base\.exception\.MandatoryParameter.*/.test(exception.name), "creating a record without all parameters raises an exception");
96 }
97 },
98
99 //-------------------------------------------------------------------------
100
101 'recordFromOldData_version_0.1_test': function (someTestArgs) {
102 var deferredResult;
103 var proxy;
104 var user;
105 var recordID;
106
107//console.log("#### new Clipperz.PM.DataModel.Record [7]");
108/*
109 record = new Clipperz.PM.DataModel.Record({
110 'reference':'05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
111 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6'),
112 'retrieveRemoteDataFunction':MochiKit.Base.partial(MochiKit.Async.succeed, {
113 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c',
114 'version': '0.1',
115 'currentVersion': {
116 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
117 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c',
118 'version': '0.1'
119 }
120
121 }),
122
123 'retrieveIndexDataFunction':MochiKit.Base.partial(MochiKit.Async.succeed, {
124 // 'key': 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6',
125 'label': '<< label >>',
126 'notes': '<< notes >>'
127 }),
128 'updateIndexDataFunction': MochiKit.Base.noop,
129 'updateDate': 'Mon Oct 02 10:01:52 CEST 2006'
130 });
131*/
132 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
133 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
134 recordID = "05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a";
135
136 deferredResult = new Clipperz.Async.Deferred("recordFromOldData_version_0.1_test", someTestArgs);
137
138 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']);
139 deferredResult.addMethod(user, 'login');
140
141 deferredResult.addMethod(user, 'getRecord', recordID);
142 deferredResult.addMethodcaller('hasAnyCleanTextData');
143 deferredResult.addTest(false, "When first loaded, the record has no clean text data");
144
145 deferredResult.addMethod(user, 'getRecord', recordID);
146 deferredResult.addMethodcaller('label');
147 deferredResult.addTest("Card encoded with an old algorithm", "Record returns the right value for label");
148
149 deferredResult.addMethod(user, 'getRecord', recordID);
150 deferredResult.addMethodcaller('notes');
151 deferredResult.addTest("", "Record returns the right value for notes - even the legacy one, stored on the header");
152
153 deferredResult.addMethod(user, 'getRecord', recordID);
154 deferredResult.addMethodcaller('hasAnyCleanTextData');
155 deferredResult.addTest(true, "After reading some values, the record has some clean text data");
156
157 deferredResult.addMethod(user, 'getRecord', recordID);
158 deferredResult.addMethodcaller('fields');
159 deferredResult.addCallback(function (someFields) {
160 SimpleTest.is(MochiKit.Base.values(someFields).length, 6, "the card has 6 fields");
161 });
162 deferredResult.callback();
163
164 return deferredResult;
165
166 },
167
168 //-------------------------------------------------------------------------
169
170 'removeDirectLogin': function (someTestArgs) {
171 var deferredResult;
172 var proxy;
173 var user;
174
175 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4)
176 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
177
178 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
179 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
180 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
181
182 deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLogin", someTestArgs);
183 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
184 deferredResult.addMethod(user, 'login');
185 deferredResult.addMethod(user, 'getRecord', recordID);
186 deferredResult.addMethodcaller('directLogins');
187 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
188 deferredResult.addMethodcaller('remove');
189
190 deferredResult.addMethod(user, 'getRecord', recordID);
191 deferredResult.addMethodcaller('hasPendingChanges');
192 deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record");
193
194 deferredResult.addMethod(user, 'saveChanges');
195 deferredResult.addMethod(user, 'hasPendingChanges');
196 deferredResult.addTest(false, "after saving there should be not any pending changes");
197
198 deferredResult.addMethod(user, 'getRecord', recordID);
199 deferredResult.addMethodcaller('directLogins');
200 deferredResult.addCallback(MochiKit.Base.keys);
201 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
202 deferredResult.addTest(3, "after saving changes, the record should have only 3 direct logins");
203
204 deferredResult.addMethod(user2, 'login');
205 deferredResult.addMethod(user2, 'getRecord', recordID);
206 deferredResult.addMethodcaller('directLogins');
207 deferredResult.addCallback(MochiKit.Base.keys);
208 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
209 deferredResult.addTest(3, "also reloading all the data with a new user, the direct logins should always be 3");
210
211 deferredResult.callback();
212
213 return deferredResult;
214 },
215
216 //-------------------------------------------------------------------------
217
218 'removeDirectLoginAndRevertChanges': function (someTestArgs) {
219 var deferredResult;
220 var proxy;
221 var user;
222
223 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
224 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
225
226 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
227 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
228
229 deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLoginAndRevertChanges", someTestArgs);
230 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
231 deferredResult.addMethod(user, 'login');
232
233 deferredResult.addMethod(user, 'getDirectLogins');
234 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
235 deferredResult.addTest(22, "the user has 22 initially");
236
237 deferredResult.addMethod(user, 'getRecord', recordID);
238 deferredResult.addMethodcaller('directLogins');
239 deferredResult.addCallback(MochiKit.Base.keys);
240 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
241 deferredResult.addTest(4, "the selected record has 4 direct logins");
242
243 deferredResult.addMethod(user, 'getRecord', recordID);
244 deferredResult.addMethodcaller('directLogins');
245 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
246 deferredResult.addMethodcaller('remove');
247
248 deferredResult.addMethod(user, 'getRecord', recordID);
249 deferredResult.addMethodcaller('hasPendingChanges');
250 deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record");
251
252 deferredResult.addMethod(user, 'revertChanges');
253 deferredResult.addMethod(user, 'hasPendingChanges');
254 deferredResult.addTest(false, "after reverting the changes, the user should not have pending changes");
255
256 deferredResult.addMethod(user, 'getDirectLogins');
257 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
258 deferredResult.addTest(22, "after reverting the changes, the user should still have 22 direct logins");
259
260 deferredResult.addMethod(user, 'getRecord', recordID);
261 deferredResult.addMethodcaller('directLogins');
262 deferredResult.addCallback(MochiKit.Base.keys);
263 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
264 deferredResult.addTest(4, "after reverting the changes, the record should still have 4 direct logins");
265
266 deferredResult.callback();
267
268 return deferredResult;
269 },
270
271 //-------------------------------------------------------------------------
272
273 'addDirectLoginAndRevertChanges': function (someTestArgs) {
274 var deferredResult;
275 var proxy;
276 var user, user2;
277 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4)
278 var directLoginReference;
279
280 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
281 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
282 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
283
284 deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs);
285 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
286 deferredResult.addMethod(user, 'login');
287
288 deferredResult.addMethod(user, 'getRecord', recordID);
289 deferredResult.setValue('record');
290 deferredResult.addMethodcaller('directLogins');
291 deferredResult.addCallback(MochiKit.Base.keys);
292 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
293 deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins");
294
295 deferredResult.getValue('record');
296 deferredResult.addMethodcaller('createNewDirectLogin');
297 deferredResult.setValue('directLogin');
298
299 deferredResult.getValue('directLogin');
300 deferredResult.addMethodcaller('setLabel', "New direct login");
301
302 deferredResult.getValue('directLogin');
303 deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}');
304
305 deferredResult.addMethod(user, 'revertChanges');
306//deferredResult.addCallback(function () { console.log("###################################"); });
307 deferredResult.addMethod(user, 'hasPendingChanges');
308 deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes");
309
310 deferredResult.getValue('record');
311 deferredResult.addMethodcaller('hasPendingChanges');
312 deferredResult.addTest(false, "after reverting the changes, the record should NOT have pending changes");
313
314 deferredResult.addMethod(user2, 'login');
315
316 deferredResult.addMethod(user2, 'getRecord', recordID);
317 deferredResult.setValue('record_2');
318 deferredResult.addMethodcaller('directLogins');
319 deferredResult.addCallback(MochiKit.Base.keys);
320 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
321 deferredResult.addTest(4, "the record, when reloaded from scratch, has still 4 direct logins");
322
323 deferredResult.callback();
324
325 return deferredResult;
326 },
327
328 //-------------------------------------------------------------------------
329
330 'addDirectLoginAndSaveChanges': function (someTestArgs) {
331 var deferredResult;
332 var proxy;
333 var user, user2;
334 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4)
335 var directLoginReference;
336
337 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
338 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
339 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
340
341 deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndSaveChanges", someTestArgs);
342 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
343 deferredResult.addMethod(user, 'login');
344
345 deferredResult.addMethod(user, 'getRecord', recordID);
346 deferredResult.addMethodcaller('hasAnyCleanTextData');
347 deferredResult.addTest(false, "When first loaded, the record has no clean text data [2]");
348
349 deferredResult.addMethod(user, 'getRecord', recordID);
350 deferredResult.setValue('record');
351 deferredResult.addMethodcaller('directLogins');
352 deferredResult.addCallback(MochiKit.Base.keys);
353 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
354 deferredResult.addTest(4, "the selected record has 4 direct logins");
355
356 deferredResult.addMethod(user, 'getRecord', recordID);
357 deferredResult.addMethodcaller('hasAnyCleanTextData');
358 deferredResult.addTest(false, "Still no clean text data is stored on the record, as all accessed data are stored on the index");
359
360 deferredResult.addMethod(user, 'hasAnyCleanTextData');
361 deferredResult.addTest(true, "the user has some clean text data");
362
363 deferredResult.getValue('record');
364 deferredResult.addMethodcaller('createNewDirectLogin');
365 deferredResult.setValue('directLogin');
366
367 deferredResult.getValue('directLogin');
368 deferredResult.addMethodcaller('label');
369 deferredResult.addTest(null, "The label of a initially created direct login is empty");
370
371 deferredResult.getValue('directLogin');
372 deferredResult.addMethodcaller('bookmarkletConfiguration');
373 deferredResult.addTest('', "The bookmaraklet configuration of a initially created direct login is empty");
374
375 deferredResult.getValue('directLogin');
376 deferredResult.addMethodcaller('bindings');
377 deferredResult.addCallback(Clipperz.Async.Test.isDeeply({}, "The bindings of a initially created direct login is empty"));
378
379 deferredResult.getValue('directLogin');
380 deferredResult.addMethodcaller('setLabel', "New direct login");
381
382 deferredResult.getValue('directLogin');
383 deferredResult.addMethodcaller('setBookmarkletConfiguration', directLoginConfigurations['Parallels']);
384
385 deferredResult.getValue('directLogin');
386 deferredResult.addMethodcaller('bindings');
387 deferredResult.addCallback(MochiKit.Base.itemgetter('Email'));
388 deferredResult.addMethodcaller('setFieldKey', '4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'); //"userID"
389
390 deferredResult.getValue('directLogin');
391 deferredResult.addMethodcaller('bindings');
392 deferredResult.addCallback(MochiKit.Base.itemgetter('Password'));
393 deferredResult.addMethodcaller('setFieldKey', 'ef2dee54322bf401540657d469e158a50e9228bc0a192a31d2e3ee56a77e565b'); //"password"
394
395 deferredResult.getValue('directLogin');
396 deferredResult.addMethodcaller('favicon'),
397 deferredResult.addTest('http://www.parallels.com/favicon.ico', "the original favicon is the expected one"),
398
399 deferredResult.getValue('directLogin');
400 deferredResult.addMethodcaller('reference');
401 deferredResult.addCallback(function (aReference) {
402 directLoginReference = aReference;
403 });
404
405 deferredResult.addMethod(user, 'hasPendingChanges');
406 deferredResult.addTest(true, "after adding a new direct login, the user should have pending changes");
407
408 deferredResult.getValue('record');
409 deferredResult.addMethodcaller('hasPendingChanges');
410 deferredResult.addTest(true, "after adding a new direct login, the record should have pending changes");
411
412 deferredResult.getValue('record');
413 deferredResult.addMethodcaller('directLogins');
414 deferredResult.addCallback(MochiKit.Base.keys);
415 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
416 deferredResult.addTest(5, "after adding a new direct login, the record has now 5 direct logins");
417
418
419 deferredResult.addMethod(user, 'saveChanges');
420 deferredResult.addMethod(user, 'hasPendingChanges');
421 deferredResult.addTest(false, "after saving the changes, the user should NOT have pending changes");
422
423
424 deferredResult.addMethod(user2, 'login');
425
426 deferredResult.addMethod(user2, 'getRecord', recordID);
427 deferredResult.setValue('record_2');
428 deferredResult.addMethodcaller('directLogins');
429 deferredResult.addCallback(MochiKit.Base.keys);
430 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
431 deferredResult.addTest(5, "the record, when reloaded from scratch, has still 5 direct logins");
432
433 deferredResult.getValue('record_2');
434 deferredResult.addMethodcaller('directLogins');
435 deferredResult.addCallback(MochiKit.Base.values);
436 deferredResult.addCallback(MochiKit.Base.itemgetter('4')); //TODO: accessing directLogins by index is not really nice
437 deferredResult.setValue('directLogin_2');
438 deferredResult.addMethodcaller('label');
439 deferredResult.addTest('New direct login', "The label of the direct login has been correctly saved");
440
441 deferredResult.getValue('directLogin_2');
442 deferredResult.addMethodcaller('bindings');
443 deferredResult.addCallback(MochiKit.Base.itemgetter('Email'));
444 deferredResult.addMethodcaller('field');
445 deferredResult.addMethodcaller('value');
446 deferredResult.addTest('joe.clipperz', "The value bound to the direct login 'Email' field is correct");
447
448 deferredResult.getValue('directLogin_2');
449 deferredResult.addMethodcaller('bindings');
450 deferredResult.addCallback(MochiKit.Base.itemgetter('Password'));
451 deferredResult.addMethodcaller('field');
452 deferredResult.addMethodcaller('value');
453 deferredResult.addTest('enfvDG1RxAsl', "The value bound to the direct login 'Password' field is correct");
454
455 deferredResult.callback();
456
457 return deferredResult;
458 },
459
460 //-------------------------------------------------------------------------
461
462 'readDirectLoginAttributes': function (someTestArgs) {
463 var deferredResult;
464 var proxy;
465 var user;
466
467 var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e';
468 var directLoginID ='03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c';
469
470 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
471 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
472
473 deferredResult = new Clipperz.Async.Deferred("Record.test.readDirectLoginAttributes", someTestArgs);
474 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']);
475 deferredResult.addMethod(user, 'login');
476
477 deferredResult.addMethod(user, 'getRecord', recordID);
478 deferredResult.addMethodcaller('directLogins');
479 deferredResult.addCallback(MochiKit.Base.itemgetter('03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c'));
480 deferredResult.setValue('directLogin');
481
482 deferredResult.getValue('directLogin');
483 deferredResult.addMethodcaller('inputs');
484 deferredResult.addCallback(MochiKit.Base.keys);
485 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
486 deferredResult.addTest(13, "Amazon direct login has 13 inputs");
487
488 deferredResult.getValue('directLogin');
489 deferredResult.addMethodcaller('inputs');
490 deferredResult.addCallback(MochiKit.Base.values);
491 deferredResult.addCallback(MochiKit.Base.filter, MochiKit.Base.methodcaller('needsFormValue'));
492 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
493 deferredResult.addTest(1, "Amazon direct login has 1 field needing a form value");
494
495 deferredResult.getValue('directLogin');
496 deferredResult.addMethodcaller('inputs');
497 deferredResult.addCallback(MochiKit.Base.values);
498 deferredResult.addCallback(MochiKit.Base.filter, MochiKit.Base.methodcaller('needsBinding'));
499 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
500 deferredResult.addTest(2, "Amazon direct login has 2 field needing a binding");
501
502
503 deferredResult.getValue('directLogin');
504 deferredResult.addMethodcaller('bindings');
505 deferredResult.addCallback(MochiKit.Base.keys);
506 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
507 deferredResult.addTest(2, "Amazon direct login has just two bindings");
508
509 deferredResult.getValue('directLogin');
510 deferredResult.addMethodcaller('bindings');
511 deferredResult.addCallback(MochiKit.Base.itemgetter('email'));
512 deferredResult.addMethodcaller('fieldKey');
513 deferredResult.addTest('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2', "Amazon direct login 'email' binding points to the correct field");
514
515 deferredResult.getValue('directLogin');
516 deferredResult.addMethodcaller('bindings');
517 deferredResult.addCallback(MochiKit.Base.itemgetter('password'));
518 deferredResult.setValue('passwordBinding');
519 deferredResult.addMethodcaller('fieldKey');
520 deferredResult.addTest('01e4bb6dcf054f312c535de8160bcf50bdccd664bdc05721b10d4e69583765f7', "Amazon direct login 'password' binding points to the correct field");
521
522 deferredResult.getValue('passwordBinding');
523 deferredResult.addMethodcaller('field');
524 deferredResult.addMethodcaller('label');
525 deferredResult.addTest('password', "Amazon direct login 'password' binding points to the 'password' field");
526
527
528 deferredResult.getValue('directLogin');
529 deferredResult.addMethodcaller('formValues');
530 deferredResult.addCallback(MochiKit.Base.keys);
531 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
532 deferredResult.addTest(1, "Amazon direct login has just one formValue");
533
534 deferredResult.getValue('directLogin');
535 deferredResult.addMethodcaller('formValues');
536 deferredResult.addCallback(MochiKit.Base.itemgetter('action'));
537 deferredResult.addMethodcaller('value');
538 deferredResult.addTest('sign-in', "Amazon direct 'action' formValue is set to 'sign-in'");
539
540
541 deferredResult.callback();
542
543 return deferredResult;
544 },
545
546 //-------------------------------------------------------------------------
547
548 'editDirectLoginLabel': function (someTestArgs) {
549 var deferredResult;
550 var proxy;
551 var user;
552 var oldLabel;
553 var newLabel;
554
555 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
556 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
557
558 oldLabel = "Yahoo! Mail";
559 newLabel = "YAHOO! Mail";
560
561 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
562 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
563
564 deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginLabel", someTestArgs);
565 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
566 deferredResult.addMethod(user, 'login');
567
568 deferredResult.addMethod(user, 'getRecord', recordID);
569 deferredResult.addMethodcaller('directLogins');
570 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
571 deferredResult.addMethodcaller('label');
572 deferredResult.addTest(oldLabel, "the current label of the direct login");
573
574 deferredResult.addMethod(user, 'getRecord', recordID);
575 deferredResult.addMethodcaller('directLogins');
576 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
577 deferredResult.addMethodcaller('setLabel', newLabel);
578
579 deferredResult.addMethod(user, 'hasPendingChanges');
580 deferredResult.addTest(true, "changing the label of a direct login should trigger some changes");
581
582 deferredResult.addMethod(user, 'getRecord', recordID);
583 deferredResult.addMethodcaller('hasPendingChanges');
584 deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the record itself");
585
586 deferredResult.addMethod(user, 'getRecord', recordID);
587 deferredResult.addMethodcaller('directLogins');
588 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
589 deferredResult.addMethodcaller('hasPendingChanges');
590 deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the directLogin itself");
591
592 deferredResult.callback();
593
594 return deferredResult;
595 },
596
597 //-------------------------------------------------------------------------
598
599 'editDirectLoginFormValueAndRestoreChanges': function (someTestArgs) {
600 var deferredResult;
601 var proxy;
602 var user;
603
604 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
605 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
606
607 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
608 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
609
610 deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginFormValueAndRestoreChanges", someTestArgs);
611 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
612 deferredResult.addMethod(user, 'login');
613
614 deferredResult.addMethod(user, 'getRecord', recordID);
615 deferredResult.addMethodcaller('directLogins');
616 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
617 deferredResult.setValue('directLogin');
618 deferredResult.addMethodcaller('formValues');
619 deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent'));
620 deferredResult.addMethodcaller('value');
621 deferredResult.addTest(null, "original formValue value matches");
622
623 deferredResult.getValue('directLogin');
624 deferredResult.addMethodcaller('formValues');
625 deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent'))
626 deferredResult.addMethodcaller('setValue', 'y');
627
628 deferredResult.getValue('directLogin');
629 deferredResult.addMethodcaller('formValues');
630 deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent'))
631 deferredResult.addMethodcaller('value');
632 deferredResult.addTest('y', "the newly set value is retained");
633
634
635 deferredResult.addMethod(user, 'hasPendingChanges');
636 deferredResult.addTest(true, "changing the label of a direct login should trigger some changes");
637
638 deferredResult.addMethod(user, 'getRecord', recordID);
639 deferredResult.addMethodcaller('hasPendingChanges');
640 deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the record itself");
641
642 deferredResult.addMethod(user, 'getRecord', recordID);
643 deferredResult.addMethodcaller('directLogins');
644 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
645 deferredResult.addMethodcaller('hasPendingChanges');
646 deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the directLogin itself");
647
648 deferredResult.addMethod(user, 'revertChanges');
649
650 deferredResult.getValue('directLogin');
651 deferredResult.addMethodcaller('formValues');
652 deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent'))
653 deferredResult.addMethodcaller('value');
654 deferredResult.addTest(null, "the old formValue value is correctly restored");
655
656 deferredResult.callback();
657
658 return deferredResult;
659 },
660
661 //-------------------------------------------------------------------------
662
663 'editDirectLoginConfigurationAndRevertChanges': function (someTestArgs) {
664 var deferredResult;
665 var proxy;
666 var user;
667
668 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
669 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
670
671 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
672 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
673
674 deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfigurationAndRevertChanges", someTestArgs);
675 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
676 deferredResult.addMethod(user, 'login');
677
678 deferredResult.addMethod(user, 'getRecord', recordID);
679 deferredResult.addMethodcaller('directLogins');
680 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
681
682 deferredResult.addCallback(function (aDirectLogin) {
683 // var newBookmarkletConfiguration;
684
685 // newBookmarkletConfiguration = '{\n \"page\": {\n \"title\": \"Yahoo! Mail\"\n },\n \"form\": {\n \"attributes\": {\n \"action\": \"https://login.yahoo.com/config/login?\",\n \"method\": \"post\"\n },\n \"inputs\": [\n {\n \"type\": \"text\",\n \"name\": \"login\",\n \"value\": \"\"\n },\n {\n \"type\": \"password\",\n \"name\": \"passwd\",\n \"value\": \"\"\n },\n {\n \"type\": \"checkbox\",\n \"name\": \".persistent\",\n \"value\": \"y\"\n }\n ]\n },\n \"version\": \"0.2\"\n}';
686 return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration [inner call]", [
687 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
688 Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration"),
689
690 MochiKit.Base.method(aDirectLogin, 'favicon'),
691 Clipperz.Async.Test.is('http://login.yahoo.com/favicon.ico', "the original favicon is the expected one"),
692
693 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', directLoginConfigurations['Parallels']),
694
695 MochiKit.Base.method(aDirectLogin, 'favicon'),
696 Clipperz.Async.Test.is('http://login.yahoo.com/favicon.ico', "the original favicon is the expected one"),
697
698 MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'),
699 Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes on the direct login"),
700 MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'),
701 Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes also on the record"),
702 MochiKit.Base.method(user, 'hasPendingChanges'),
703 Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes also on the user"),
704
705 MochiKit.Base.method(aDirectLogin, 'revertChanges'),
706
707 MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'),
708 Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login"),
709 MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'),
710 Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record"),
711 MochiKit.Base.method(user, 'hasPendingChanges'),
712 Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user"),
713
714 MochiKit.Base.noop
715 ], someTestArgs);
716 })
717
718 deferredResult.callback();
719
720 return deferredResult;
721 },
722
723 //-------------------------------------------------------------------------
724
725 'editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges': function (someTestArgs) {
726 var deferredResult;
727 var proxy;
728 var user;
729 var user2;
730 var newBookmarkletConfiguration;
731
732 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
733 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
734
735 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
736 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
737 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
738
739 newBookmarkletConfiguration = '{\n \"page\": {\n \"title\": \"Yahoo! Mail\"\n },\n \"form\": {\n \"attributes\": {\n \"action\": \"https://login.yahoo.com/config/login?\",\n \"method\": \"post\"\n },\n \"inputs\": [\n {\n \"type\": \"text\",\n \"name\": \"login\",\n \"value\": \"\"\n },\n {\n \"type\": \"password\",\n \"name\": \"passwd\",\n \"value\": \"\"\n },\n {\n \"type\": \"checkbox\",\n \"name\": \".persistent\",\n \"value\": \"y\"\n }\n ]\n },\n \"version\": \"0.2\"\n}';
740
741 deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges", someTestArgs);
742 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
743 deferredResult.addMethod(user, 'login');
744
745 deferredResult.addMethod(user, 'getRecord', recordID);
746 deferredResult.addMethodcaller('directLogins');
747 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
748 deferredResult.addCallback(function (aDirectLogin) {
749 return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges [inner call 1]", [
750 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
751 Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration (1)"),
752
753 MochiKit.Base.method(aDirectLogin, 'inputs'),
754 MochiKit.Base.keys,
755 MochiKit.Base.itemgetter('length'),
756 Clipperz.Async.Test.is(26, "The original direct login had 26 inputs"),
757
758 MochiKit.Base.method(aDirectLogin, 'bindings'),
759 MochiKit.Base.keys,
760 MochiKit.Base.itemgetter('length'),
761 Clipperz.Async.Test.is(2, "The original direct login had 2 inputs"),
762
763 MochiKit.Base.method(aDirectLogin, 'bindings'),
764 MochiKit.Base.itemgetter('login'),
765 MochiKit.Base.methodcaller('field'),
766 MochiKit.Base.methodcaller('reference'),
767 Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the original 'login' direct login binding points to the correct field"),
768
769 MochiKit.Base.method(aDirectLogin, 'formValues'),
770 MochiKit.Base.keys,
771 MochiKit.Base.itemgetter('length'),
772 Clipperz.Async.Test.is(1, "The original direct login had 1 form values"),
773
774 MochiKit.Base.method(aDirectLogin, 'formValues'),
775 MochiKit.Base.itemgetter('.persistent'),
776 MochiKit.Base.methodcaller('type'),
777 Clipperz.Async.Test.is('checkbox', "the original formValue has the expected type"),
778
779 MochiKit.Base.method(aDirectLogin, 'formValues'),
780 MochiKit.Base.itemgetter('.persistent'),
781 MochiKit.Base.methodcaller('value'),
782 Clipperz.Async.Test.is(null, "the original formValue is correct (1)"),
783
784 MochiKit.Base.method(aDirectLogin, 'formValues'),
785 MochiKit.Base.itemgetter('.persistent'),
786 MochiKit.Base.methodcaller('setValue', 'y'),
787
788
789 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', newBookmarkletConfiguration),
790 MochiKit.Base.method(user, 'saveChanges'),
791
792 MochiKit.Base.method(aDirectLogin, 'bindings'),
793 MochiKit.Base.itemgetter('login'),
794 MochiKit.Base.methodcaller('field'),
795 MochiKit.Base.methodcaller('reference'),
796 Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the 'login' binding is still valid after the new configuration is set"),
797
798 MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'),
799 Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login (2)"),
800 MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'),
801 Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record (2)"),
802 MochiKit.Base.method(user, 'hasPendingChanges'),
803 Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user (2)"),
804
805 MochiKit.Base.noop
806 ], someTestArgs);
807 })
808
809 deferredResult.addMethod(user2, 'login');
810
811 deferredResult.addMethod(user2, 'getRecord', recordID);
812 deferredResult.addMethodcaller('directLogins');
813 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
814 deferredResult.addCallback(function (aDirectLogin) {
815 return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges [inner call 2]", [
816 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
817 Clipperz.Async.Test.is(newBookmarkletConfiguration, "the direct login has the new bookmarkletConfiguration even after being reloaded"),
818
819 MochiKit.Base.method(aDirectLogin, 'inputs'),
820 MochiKit.Base.keys,
821 MochiKit.Base.itemgetter('length'),
822 Clipperz.Async.Test.is(3, "The new direct login has 3 inputs"),
823
824 MochiKit.Base.method(aDirectLogin, 'bindings'),
825 MochiKit.Base.keys,
826 MochiKit.Base.itemgetter('length'),
827 Clipperz.Async.Test.is(2, "The new direct login had 2 inputs"),
828
829 MochiKit.Base.method(aDirectLogin, 'bindings'),
830 MochiKit.Base.itemgetter('login'),
831 MochiKit.Base.methodcaller('field'),
832 MochiKit.Base.methodcaller('reference'),
833 Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the new 'login' direct login binding still points to the correct field"),
834
835 MochiKit.Base.method(aDirectLogin, 'formValues'),
836 MochiKit.Base.keys,
837 MochiKit.Base.itemgetter('length'),
838 Clipperz.Async.Test.is(1, "The new direct login had 1 form values (1)"),
839
840 MochiKit.Base.method(aDirectLogin, 'formValues'),
841 MochiKit.Base.itemgetter('.persistent'),
842 MochiKit.Base.methodcaller('value'),
843 Clipperz.Async.Test.is(null, "the formValue is still correctly set"),
844
845 MochiKit.Base.noop
846 ], someTestArgs);
847 });
848
849 deferredResult.callback();
850
851 return deferredResult;
852 },
853
854 //-------------------------------------------------------------------------
855
856 'editDirectLoginConfiguration_changingTheStructure_AndSaveChanges': function (someTestArgs) {
857 var deferredResult;
858 var proxy;
859 var user;
860 var user2;
861
862 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
863 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
864
865 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
866 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
867 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
868
869 deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges", someTestArgs);
870 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
871 deferredResult.addMethod(user, 'login');
872
873 deferredResult.addMethod(user, 'getRecord', recordID);
874 deferredResult.addMethodcaller('directLogins');
875 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
876 deferredResult.addCallback(function (aDirectLogin) {
877 return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges [inner call 1]", [
878 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
879 Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration (2)"),
880
881 MochiKit.Base.method(aDirectLogin, 'inputs'),
882 MochiKit.Base.keys,
883 MochiKit.Base.itemgetter('length'),
884 Clipperz.Async.Test.is(26, "The original direct login had 26 inputs"),
885
886 MochiKit.Base.method(aDirectLogin, 'bindings'),
887 MochiKit.Base.keys,
888 MochiKit.Base.itemgetter('length'),
889 Clipperz.Async.Test.is(2, "The original direct login had 2 inputs"),
890
891 MochiKit.Base.method(aDirectLogin, 'bindings'),
892 MochiKit.Base.itemgetter('login'),
893 MochiKit.Base.methodcaller('field'),
894 MochiKit.Base.methodcaller('reference'),
895 Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the original 'login' direct login binding points to the correct field"),
896
897 MochiKit.Base.method(aDirectLogin, 'formValues'),
898 MochiKit.Base.keys,
899 MochiKit.Base.itemgetter('length'),
900 Clipperz.Async.Test.is(1, "The original direct login had 1 form values"),
901
902 MochiKit.Base.method(aDirectLogin, 'formValues'),
903 MochiKit.Base.itemgetter('.persistent'),
904 MochiKit.Base.methodcaller('value'),
905 Clipperz.Async.Test.is(null, "the original formValue is correct (2)"),
906
907
908 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', directLoginConfigurations['Parallels']),
909 MochiKit.Base.method(user, 'saveChanges'),
910
911 MochiKit.Base.method(aDirectLogin, 'inputs'),
912 MochiKit.Base.keys,
913 MochiKit.Base.itemgetter('length'),
914 Clipperz.Async.Test.is(2, "The new direct login has 2 inputs"),
915
916 MochiKit.Base.method(aDirectLogin, 'formValues'),
917 MochiKit.Base.keys,
918 MochiKit.Base.itemgetter('length'),
919 Clipperz.Async.Test.is(0, "The new direct login has no form values"),
920
921 MochiKit.Base.method(aDirectLogin, 'bindings'),
922 MochiKit.Base.keys,
923 MochiKit.Base.itemgetter('length'),
924 Clipperz.Async.Test.is(2, "The new direct login has 2 inputs"),
925
926 MochiKit.Base.method(aDirectLogin, 'bindings'),
927 MochiKit.Base.itemgetter('login'),
928 Clipperz.Async.Test.is(null, "the 'login' binding should not exist within the new configuration"),
929
930 MochiKit.Base.method(aDirectLogin, 'bindings'),
931 MochiKit.Base.itemgetter('passwd'),
932 Clipperz.Async.Test.is(null, "the 'passwd' binding should not exist within the new configuration"),
933
934 MochiKit.Base.method(aDirectLogin, 'bindings'),
935 MochiKit.Base.itemgetter('Email'),
936 Clipperz.Async.Test.ok("the 'Email' binding should exist within the new configuration"),
937
938 MochiKit.Base.method(aDirectLogin, 'bindings'),
939 MochiKit.Base.itemgetter('Password'),
940 Clipperz.Async.Test.ok("the 'Password' binding should exist within the new configuration"),
941
942
943 MochiKit.Base.method(aDirectLogin, 'bindings'),
944 MochiKit.Base.itemgetter('Email'),
945 MochiKit.Base.methodcaller('field'),
946 Clipperz.Async.Test.is(null, "the 'Email' binding should not point to any field, yet"),
947
948
949 MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'),
950 Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login (2)"),
951 MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'),
952 Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record (2)"),
953 MochiKit.Base.method(user, 'hasPendingChanges'),
954 Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user (2)"),
955
956 MochiKit.Base.noop
957 ], someTestArgs);
958 })
959
960 deferredResult.addMethod(user2, 'login');
961
962 deferredResult.addMethod(user2, 'getRecord', recordID);
963 deferredResult.addMethodcaller('directLogins');
964 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
965 deferredResult.addCallback(function (aDirectLogin) {
966 return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges [inner call 2]", [
967 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
968 Clipperz.Base.evalJSON,
969 MochiKit.Base.itemgetter('form'),
970 Clipperz.Async.Test.isDeeply(Clipperz.Base.evalJSON(directLoginConfigurations['Parallels'])['form'], "the direct login has the new bookmarkletConfiguration even after being reloaded"),
971
972 MochiKit.Base.method(aDirectLogin, 'inputs'),
973 MochiKit.Base.keys,
974 MochiKit.Base.itemgetter('length'),
975 Clipperz.Async.Test.is(2, "The new -reloaded- direct login has 2 inputs"),
976
977 MochiKit.Base.method(aDirectLogin, 'bindings'),
978 MochiKit.Base.keys,
979 MochiKit.Base.itemgetter('length'),
980 Clipperz.Async.Test.is(2, "The new direct login had 2 inputs"),
981
982 MochiKit.Base.method(aDirectLogin, 'bindings'),
983 MochiKit.Base.itemgetter('login'),
984 Clipperz.Async.Test.is(null, "the 'login' binding should not exist within the new configuration"),
985
986 MochiKit.Base.method(aDirectLogin, 'formValues'),
987 MochiKit.Base.keys,
988 MochiKit.Base.itemgetter('length'),
989 Clipperz.Async.Test.is(0, "The new direct login has no form values (2)"),
990
991 MochiKit.Base.noop
992 ], someTestArgs);
993 });
994
995 deferredResult.callback();
996
997 return deferredResult;
998 },
999
1000 //-------------------------------------------------------------------------
1001
1002 'editFieldValueAndRestoreIt': function (someTestArgs) {
1003 var deferredResult;
1004 var proxy;
1005 var user;
1006
1007 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
1008
1009 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
1010 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1011
1012 deferredResult = new Clipperz.Async.Deferred("Record.test.editValueAndRestoreIt", someTestArgs);
1013 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1014 deferredResult.addMethod(user, 'login');
1015
1016 deferredResult.addMethod(user, 'getRecord', recordID);
1017 deferredResult.addMethodcaller('fields');
1018 deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'));
1019 deferredResult.addMethodcaller('value');
1020 deferredResult.addTest('joe.clipperz', "the current field value is 'joe.clipperz'");
1021
1022 deferredResult.addMethod(user, 'getRecord', recordID);
1023 deferredResult.addMethodcaller('fields');
1024 deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'));
1025 deferredResult.addMethodcaller('setValue', 'fake.clipperz');
1026
1027 deferredResult.addMethod(user, 'getRecord', recordID);
1028 deferredResult.addMethodcaller('hasPendingChanges');
1029 deferredResult.addTest(true, "changing the value of a field should trigger pending changes");
1030
1031 deferredResult.addMethod(user, 'getRecord', recordID);
1032 deferredResult.addMethodcaller('fields');
1033 deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'));
1034 deferredResult.addMethodcaller('setValue', 'joe.clipperz');
1035
1036 deferredResult.addMethod(user, 'getRecord', recordID);
1037 deferredResult.addMethodcaller('hasPendingChanges');
1038 deferredResult.addTest(false, "restoring the value of a field should revert pending changes");
1039
1040
1041 deferredResult.callback();
1042
1043 return deferredResult;
1044 },
1045
1046 //-------------------------------------------------------------------------
1047
1048 'accessFieldValues': function (someTestArgs) {
1049 var deferredResult;
1050 var proxy;
1051 var user;
1052
1053 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
1054
1055 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
1056 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1057
1058 deferredResult = new Clipperz.Async.Deferred("Record.test.accessFieldValues", someTestArgs);
1059 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1060 deferredResult.addMethod(user, 'login');
1061
1062 deferredResult.addMethod(user, 'getRecord', recordID);
1063 deferredResult.addMethodcaller('fieldWithLabel', 'userID');
1064 deferredResult.addMethodcaller('value');
1065 deferredResult.addTest('joe.clipperz', "the current field value is 'joe.clipperz'");
1066
1067
1068 deferredResult.callback();
1069
1070 return deferredResult;
1071 },
1072
1073 //-------------------------------------------------------------------------
1074
1075 'editFieldValueAndSaveIt': function (someTestArgs) {
1076 var deferredResult;
1077 var proxy;
1078 var user, user2;
1079
1080 var recordID ='2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e';
1081 var passwordFieldID ='01e4bb6dcf054f312c535de8160bcf50bdccd664bdc05721b10d4e69583765f7';
1082
1083 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
1084 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1085 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1086
1087 deferredResult = new Clipperz.Async.Deferred("Record.test.editValueAndRestoreIt", someTestArgs);
1088 // deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1089 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']);
1090 deferredResult.addMethod(user, 'login');
1091
1092 deferredResult.addMethod(user, 'getRecord', recordID);
1093 deferredResult.addMethodcaller('getVersions');
1094 deferredResult.addCallback(MochiKit.Base.keys);
1095 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1096 deferredResult.addTest(5, "the selected record has 5 versions");
1097
1098 deferredResult.addMethod(user, 'getRecord', recordID);
1099 deferredResult.addMethodcaller('fields');
1100 deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID));
1101 deferredResult.collectResults({
1102 'label': MochiKit.Base.methodcaller('label'),
1103 'value': MochiKit.Base.methodcaller('value')
1104 });
1105 deferredResult.addTest({'label': 'password', 'value': 'HRRd7ycaFVG6'},"the current field label and value match", true);
1106
1107 deferredResult.addMethod(user, 'getRecord', recordID);
1108 deferredResult.addMethodcaller('fields');
1109 deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID));
1110 deferredResult.addMethodcaller('setValue', '<<pippo>>');
1111
1112 deferredResult.addMethod(user, 'getRecord', recordID);
1113 deferredResult.addMethodcaller('hasPendingChanges');
1114 deferredResult.addTest(true, "changing the value of a field should trigger pending changes");
1115
1116 deferredResult.addMethod(user, 'saveChanges');
1117 deferredResult.addMethod(user, 'hasPendingChanges');
1118 deferredResult.addTest(false, "after saving, there should be no pending changes");
1119
1120 deferredResult.addMethod(user, 'getRecord', recordID);
1121 deferredResult.addMethodcaller('getVersions');
1122 deferredResult.addCallback(MochiKit.Base.keys);
1123 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1124 deferredResult.addTest(6, "the selected record, after saving a new version, has now 6 versions");
1125
1126 deferredResult.addMethod(user2, 'login');
1127
1128 deferredResult.addMethod(user2, 'getRecord', recordID);
1129 deferredResult.addMethodcaller('getVersions');
1130 deferredResult.addCallback(MochiKit.Base.keys);
1131 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1132 deferredResult.addTest(6, "the selected record - reloaded from the db - has 6 versions");
1133
1134 deferredResult.addMethod(user2, 'getRecord', recordID);
1135 deferredResult.addMethodcaller('fields');
1136 deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID));
1137 deferredResult.collectResults({
1138 'label': MochiKit.Base.methodcaller('label'),
1139 'value': MochiKit.Base.methodcaller('value')
1140 });
1141 deferredResult.addTest({'label': 'password', 'value': '<<pippo>>'},"the current field label and value match", true);
1142
1143/*
1144deferredResult.addCallback(function (aValue) { console.log("FIELDS", aValue); return aValue});
1145
1146 deferredResult.addMethod(user, 'getRecord', recordID);
1147 deferredResult.addMethodcaller('fields');
1148 deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'));
1149 deferredResult.addMethodcaller('setValue', 'joe.clipperz');
1150
1151 deferredResult.addMethod(user, 'getRecord', recordID);
1152 deferredResult.addMethodcaller('hasPendingChanges');
1153 deferredResult.addTest(false, "restoring the value of a field should revert pending changes");
1154*/
1155
1156 deferredResult.callback();
1157
1158 return deferredResult;
1159 },
1160
1161 //-------------------------------------------------------------------------
1162
1163 'editNotesAndRestoreIt': function (someTestArgs) {
1164 var deferredResult;
1165 var proxy;
1166 var user;
1167
1168 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
1169
1170 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
1171 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1172
1173 deferredResult = new Clipperz.Async.Deferred("Record.test.editNotesAndRestoreIt", someTestArgs);
1174 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1175 deferredResult.addMethod(user, 'login');
1176
1177 deferredResult.addMethod(user, 'getRecord', recordID);
1178 deferredResult.addMethodcaller('notes');
1179 deferredResult.addTest('', "the current note is the empty string even if nothing is set on the record");
1180
1181 deferredResult.addMethod(user, 'getRecord', recordID);
1182 deferredResult.addMethodcaller('setNotes', '');
1183
1184 deferredResult.addMethod(user, 'getRecord', recordID);
1185 deferredResult.addMethodcaller('hasPendingChanges');
1186 deferredResult.addTest(false, "setting notes to an empty string should be the same has not having the notes altogether");
1187
1188 deferredResult.callback();
1189
1190 return deferredResult;
1191 },
1192
1193 //-------------------------------------------------------------------------
1194
1195 'loadAllRecordVersions': function (someTestArgs) {
1196 var deferredResult;
1197 var proxy;
1198 var user;
1199
1200 var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e';
1201
1202 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
1203 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1204
1205 deferredResult = new Clipperz.Async.Deferred("Record.test.loadAllRecordVersions", someTestArgs);
1206 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']);
1207 deferredResult.addMethod(user, 'login');
1208
1209 deferredResult.addMethod(user, 'getRecord', recordID);
1210 deferredResult.addMethodcaller('label');
1211 deferredResult.addTest('Amazon.com', "the selected record is the expected one");
1212
1213 deferredResult.addMethod(user, 'getRecord', recordID);
1214 deferredResult.addMethodcaller('getVersions');
1215 deferredResult.addCallback(MochiKit.Base.keys);
1216 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1217 deferredResult.addTest(5, "the 'Amazon' record has 5 versions");
1218
1219 deferredResult.addMethod(user, 'getRecord', recordID);
1220 deferredResult.addMethodcaller('getCurrentRecordVersion');
1221 deferredResult.addMethodcaller('fields');
1222 deferredResult.addCallback(MochiKit.Base.keys);
1223 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1224 deferredResult.addTest(3, "the current version of 'Amazon' record has 3 fields");
1225
1226 deferredResult.callback();
1227
1228 return deferredResult;
1229 },
1230
1231 //-------------------------------------------------------------------------
1232
1233 'createDirectLoginAndDeleteItAfterward': function (someTestArgs) {
1234 var deferredResult;
1235 var proxy;
1236 var user, user2;
1237 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4)
1238 var directLoginReference;
1239
1240 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
1241 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1242 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1243
1244 deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs);
1245 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1246 deferredResult.addMethod(user, 'login');
1247
1248 deferredResult.addMethod(user, 'getRecord', recordID);
1249 deferredResult.setValue('record');
1250 deferredResult.addMethodcaller('directLogins');
1251 deferredResult.addCallback(MochiKit.Base.keys);
1252 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1253 deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins");
1254
1255 deferredResult.getValue('record');
1256 deferredResult.addMethodcaller('createNewDirectLogin');
1257 deferredResult.setValue('directLogin');
1258
1259 deferredResult.getValue('directLogin');
1260 deferredResult.addMethodcaller('setLabel', "New direct login");
1261
1262 deferredResult.getValue('directLogin');
1263 deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}');
1264
1265 deferredResult.getValue('directLogin');
1266 deferredResult.addMethodcaller('remove');
1267
1268 deferredResult.addMethod(user, 'hasPendingChanges');
1269 deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes");
1270
1271 deferredResult.callback();
1272
1273 return deferredResult;
1274 },
1275
1276 //-------------------------------------------------------------------------
1277
1278 'syntaxFix': MochiKit.Base.noop
1279};
1280
1281
1282
1283//#############################################################################
1284
1285SimpleTest.runDeferredTests("Clipperz.PM.DataModel.Record", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js
new file mode 100644
index 0000000..5684dbd
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js
@@ -0,0 +1,1941 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29testData = {
30
31 //-----------------------------------------------------------------------------
32
33 'simpleLogin_001': function () { return {
34 'users': [
35 {
36 'username': "joe",
37 'passphrase': "eoj",
38 'version': "0.2",
39 'connectionVersion':"0.2",
40 'records':{
41 'record 1': {
42 'notes':"Some notes here",
43 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"}
46 ],
47 'directLogins':{
48 "record 1 direct login": {
49 'configuration':"",
50 'bindings':[
51 ],
52 'favicon':"http://www.example.com/favicon.ico"
53 }
54 }
55 }
56 },
57 'otp':[
58 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321"
60 ]
61 }
62 ]
63 };}(),
64
65 //-----------------------------------------------------------------------------
66
67 'joe_clipperz_offline_copy_data': function () { return {
68 users:{
69 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2',
78 maxNumberOfRecords: '100',
79 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"6tqzHY7/lB/JVfDi3iJ7BIJTiX1Fih//aTUF7IDoLdlnafC9hoIQ/5lGk+/Ezilw59n11ocPN31aOA9ddFGc9oa2vQ1BdymV8F91sWGLGyWft+PRCWOqxy7U1XxvbgyRbCs0mbtSLp/qlC6gewnAXJpH6KT9oURIjKkyaR8jJ7ng6IlfGUIL2KUFnAv6KNoWO5cdXDU0nrrdSYehcApmXYlTyreHDbrFlLJ2YuR9JLvw9bDxXi/xBY1wZgwiUsGVlG3j0e4f63mJVrpmPI1jhaXD3BQD8cbl96l1ImhYe1Boz53gLq94KSk+3bkjG4GRhvlDPtvk8vdSZPsYPsbC0Cu0M4TMS70nPX7qNj5LDvzrd+S+zDj1/CW0yctRThXstrxDyG/L75k/xdZcVbMzXQHQR4OwWWFiqGOnLpyiZIHGfV5+xZ1a1uxT9TPDoDdwPuE5P1Uwh3PeGc9jatk3waQN6fo3g8PQrCOtPn7C7b6y4MEjpAG4e53HFb0B/hEfK6ApycT6QAglsA3qF/tZyZbwNCwert4pG52rIG/PODZ1XxVZHFX8VFWeSxuk/jnPpJg/pvfpRzBMyCGVDJb/i+dlwFcnOAVvqju5xXJk4mu05XrngF10NzHnVRMfxwXmdtTDYE/lDuODy1SiE5yBZlt/Ff6a0eMS/P8HLsUS8+dtz9yOIQ8rh+52nVS7F5tFWXFOvT7nfq1L4HaHCigY187Jk0Y3LCsZW6ziB5qhKZlbQxdCAx5UDNWNs/F59qxVWP5k2UagBgAJoh+iMTZAMWkaURqQxY84SVYIkm9vNZv6Jf+ppFJNn6s3ZZSUe8gmmgMPJP0Lmoh/VCPNypzR+sZULfVFpmPmNXfaAOQ875iDgvUuBWsDSBdyx2+8Q+fUO0w+W4WkDM09VGmFxrHHjfpRsOT1B3dVFti2ypyiCdkvm878pvTS2j4Obweh6+bmzE7lqOXJgtQUydKNZIb3hNbjB7LwPro6e70ctm3eM9OLFT73u+khVM2UtAhfMseEb+Ny+PldW+VgXnHFm8n5CDBHoDJPXBfJq60l6+1OnDPfB+7tIgnCVH56CZ0jFX2EbxWS63xAHNLttfMtxdbkf4AbpanqLJvNiU4P0ThW4+VNRKBid0v78WC40rWX4UTEv9HPvUA5JUsj1v6+I5UI+quCUfx0vQgeO/gAlI0YuVgDBB1ouWUSES9+U9QIGoUsVTHDo4ZOEInsnhjPbz+IFyRMoMfbiYx3gviHluxHNGYsIMFxo+yB8aW/CedyWYt54ijgViPIXhH+R8bMgFBX4JX6hu8l3NMSYvMV82ua9Pnyl7NxbwuL1S/0JAp2uh0OzGMX9iOOcFWqbWVAX7NCePAG4VTJ0wZ2iL/MUGAVG72qBWvCb1ckavQc1LTw8l2vPG6YwFf0frFHsVvZsGHRptswFTp+77U1bpn/TL2MUXJQ9gQWgCQHxE+STunbJDDWOe9FZeKkJgjqQQ2E70UFoyUp4U/H1fA5Sy9+gS8QMtOcPJ6tCbcIXnq1nif+6bDBjtQCofs59Mm7ibwnofXPGkWv8Id3SyhW9YZCYhJZss2dkMyWfqw4jDysWxQAHjxZg4qgVXA9xpwuhu7O82vMOutk7vPyEuJ4gqlDroN4aPecD405YOEXWeWrWsL2V3y5PwXBrYWq22XzJeL3PvS9usj1Vg2TtG2O3HLuB6Rm6+i7kraiRbENemst4MjLrZwYjI07ZD7DUifsrUvjA50JXXb8pjudYqwUrTKOzcE/uZ1WbSbm+2x8PYVimLtDE4/lOp34J07WV7ZxJL8yk4J4CYRxLnnS7xps8skfy6glRA8fTKRVLv+9VqVxJgE3X/G8Kfosd9K03DJbD+L+h3kvLAAZ6Xr6FpbnA5HeGXzfQ/k5lBqIS39iqT2kZKMxIOXhfwmmuTSS25nk7hD+0R1TdnnTOYQrEn8bdyPuFXzd08FxN9KSYm2H1Gdg+2h+N9UWTED7zXmv/H+gfzk5gfoNOKyWWoaEFT/NL3ky6ApzuiokUj3x+xvCwOXoozLHXhdeZYtYkIu1HlYWQx1YAk2ilg47nnRhQQaYjMvIHfsdYjdb1CpGO5K1dYlRBOCMttp+j5QVz/jCSeCrMh8dtu9ZGLEZ3QL06tqmXp03fCsvKOG0it/KuNG5EJpfb6bV+5DsZvI6k4VLXjcKvZhhh+VZSf2mr+mzFEGKBSeleZvii2g8dVyaEBms37SBFCdIwkMxFRmzo/n+1m8axx9o57NPwISU4q8eAjUK2bWrBECZaI4FwLqmlGK9hMPGB/lbrcuHtlqmv5qzo2TJb5/xoX0LyJB/FZVk5Wsm8vC+O8b7o6JDxaPkOgy07+p8Sg9wuKVy6hHrFRnZ+MEZO3Bbk74omg4+6y4HVuRCgxztzRyUiYTssFphqKBsC/e6fQN0QtSwhLSld/B5qoPMn/9CMs8UxmRbA2Ekwi+7Ss51YsWNmd8dKUqxMKWFZOQYe2dbvcYbRwKwjrARxR7d5aaQr8b96hKsWs0YkLQDn71C3AQfEUvClvDXJdJ97B9WkDHz/DQ9EaIp9+4ZSl3SIrew09vUkvUSVGU7egHzv1Oe2gf4jI/3zToRq307AzCT1tF4k0VbInDFKb8YSG35UaJAtfTENvkAQ+8KmR3gQyHRupLi6D8TNvy/03n8naG8BV8+EArzmUAgxmfv3PTipnn3bdsaIFK1+uldQXVUoHm7PgZidzOHpNXvNzgrL3c3gv7Et/s="},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"xuiWbu5GjkueQhyH6sKg5Cn9/CSsPIjYgbhaHmjgwnnB+GL8UO5u0uURxTY6tkG2HbaFRpYZwLnqUUulEkVY6iNqJajFI0qDtrKams11cF2y9LaAalbqyv6U7EUt76d666DkXW8tf88nJ4HYfyAhhPCJ0cw5053K9BAVPbQM7fMA4MYY29k45U3HcIKNZcNqMftCc+fZB+fmZl1g7mSbrXaZyagRkwWwTdJ6/ecVOSSVOkWpckAaQWzGhwbO6zVWLtR9XQReIQZV52TwDMnV5IYJHnlw0Uvv2ZCVSu/oMN2TneW5fcIwQ0x/SRe+n4Mklzucpvasza+ZhRaRUFS53kvmbfPFI5tXqB3Z1+9S7LRLr9Ws97suTQ6G5eW6jKT2vf65ehnQJtA/gW6uwH+3IAT7ukFxO1knaRf7dRJDLuIc4Xnh+bRDnZUqfA+B+04pp6r0OS9oysD35t/HydVFeHgoyMCbL4RzduZvmu7y16WhIznn0DEfRmrYmC68C+DNcAbxeiXU8v14PgGycIg1++0v44Qor/BXfP5JW4WnYjVLW3aXN3FgI5rPuN6PqTzMn7z+eF2V28GNss5pui1xIbR2bTECAAnaRQiaz98F1LH4z5kYG1ehmyjIOLqz1nAv3Kuo7+DZKaSez4nX1oWznbXEnwd6uguukcCGpQllZoHYso/fz07e6p/9fskXPmg7LnMMHApP7Vay6XPhXV/AG0imU7uREFLbgnw3305Ey9fslmD8qCzi8LlqNALEt1TFNpAukvqodkv8V1o6zqzYNMSKaqJV4E9dWMNDpOFFTKv1FuZjZfzyPwyCcePgP7vcJGtUSYqRJwl56Ia8UA+l3FBiX8DCSW3GkG+wusf7bZ5kV6lV5DQJTScIyFxWwcECJ5S8/2QaBPTopeLo2NuMmFwjUwhBGVrDkUmtqjfb6DSfr/dR6AbmraRLXrpd/KUN7wWgp5GdLUAKNT+RdsUc0mLsLF3oT+XshfgfsQqi/pDnX9x3QfH/WuRtoywAIE5APU8Rnl+1NGsEidzeYrBnryA8VRi9vxfhuaxe3+rx1ewB1pgVSERPLF+0MYtetug01yRSxEUYJgYHxQmfnmkCoz+kKCejdpYVqKC+RzhjIMytRbFXNmS0NpRmtBxZrSIskKXjjwjUeEzMAttqAPC4IK1kt5IK+5NZPNZbf2Y8qDsWcBNXfw5sh7pJymRwPCge+S5Jy69tadeSAWpX1YMuq+By/o2KWawpokstxmE6w2RNPFhKXtGPvukoDnpV9wDFgBcoNDJctDVdIPqNolLxn6Y57HoOid6CO2s+PqQcfZSEo7V70Rk6OQ+02M0ED0/4XGq6vflc6IlQ5LO1urRT4INrAQmWdulHnmLf+HESJAc0ZICO1T73aQVaGVVHFQxDMVgaTer1UXP1xxfB1tazfJme2aycsDM1WS5lTwMRRlvgwupkzS+YwGq+nB1QFsZknKgeoacGYxQjFo6EGvszitNU+sK4U/EeAShS/nM/96c10awZVwQnal5T9sYOO31mA2pxyI4TwxkgWw2wkj38msz+8afHvPlFlqlU0UiEm7hYMj5s4L08msIY+GVc7tGgaRYklsnRFUU6s0Kql8BLPkbpdM9RAoSczy4tlGlaBAPeC6ouPgyNf1+VRfVZnqlPF063ok1KcEbd6QqQHo0kgsUMLbtdPbe752dmUo64sZXkuDKISmFEwQjn3SN4K7OOg9sk5QEz1STMvm8pazq1yb+0CE1iad5e+HoNkrGT+5GSVX+YShiItu5eyZXjZ7m8GQ2HZTA7mgv6FwGSI6o0URPIRk/UgKMCggTSat2gf3oVk+aZvRCvkGg+ISjkEKk49tQasLDAfvVjdue2JHpM1UwNhTlurHNasqnwNEzFzhflsMuM+V7dv/6/3AiJBUSC9Oyd/kWRpt5DS0nW+BkBcL5eBoofyssj0tAqxpWe+nNwCL9ljVPdytQCHWp71xEqnDxSq1KWV7u57MmBSaGStdyWtShBvEQdHQIDpXz8HVfOWOxQKttNYkupVJcbYhHNicwLzc3Ox1TaT/trfkmTXT80XXfQA83Ls1VVsYKjHDBT5/bIOx3IzjS0KNl7C5E8BuggSL69t8ogHSOKwH9CugZje3vj0BuzhZsl65k1i/pNS+vYwOifv6BhhbgWS6D2s9+a1Xi5YLGLE/EvMlw82N+o/owUluZ2vhekbYJ0HkuyrL+18l0L5B+8iJS62LzdD+hC93cGxqD9RVQA37yxzpN33l2y6teSrypYU7j2hMVv1l0Y6JU0l5itSdWT3VmWyHzdKLYNFjpA2WY3UgvsWRTJfFYzFEYUu2V6OqY7HzUiuKcVTYwB5Ky2qESzmIFiLRv0E9E+fVoYTKjk8v2gDaNwKWq7AJTabgeNaQVif3lUdZ1oQerb6aRc7PBBBKBD1YE3S8+wJ6C4MIs+XIxuJvjhhbOav5Q+G9Tk251dlt44cWQ61sCPi5pCMAgzcwRH2+ZQOZeYslt6g4XS3TorVlHveIpQkBOPvzO3fUkfUQzKPZ1QXFIBZnTLLIcsV+L/tt5kep9ucrqUjNcREPODf+nM/mQlfLGT8SLU9r2zMFkMm4zXNWswWTsXO7zm1YEErAtyggWff6gM66wz1dnNMiVXMQ=="},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3',
82 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
85 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
87 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
88 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 }
99 }
100 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
103 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
105 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
106 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
114 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
115 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
116 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
122 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
123 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
124 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
130 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
131 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
132 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####',
135 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
136 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
138 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
139 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
140 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####',
143 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
144 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
146 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
147 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
148 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
154 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
155 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
156 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
162 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
163 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
164 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
170 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
171 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
172 }
173 }
174 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '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',
177 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
179 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
180 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
188 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
189 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
190 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
196 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
197 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
198 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
204 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
205 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
206 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
212 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
213 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
214 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
220 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
221 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
222 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
228 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
229 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
230 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
236 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
237 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
238 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
244 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
245 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
246 }
247 }
248 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
253 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
254 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
262 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
263 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
264 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
270 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
271 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
272 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
278 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
279 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
280 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
286 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
287 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
288 }
289 }
290 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
293 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
295 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
296 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
304 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
305 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
306 }
307 }
308 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
313 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
314 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
322 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
323 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
324 }
325 }
326 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
331 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
332 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
340 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
341 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
342 }
343 }
344 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
349 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
350 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
358 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
359 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
360 }
361 }
362 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
365 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
367 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
368 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
376 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
377 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
378 }
379 }
380 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
385 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
386 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
394 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
395 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
396 }
397 }
398 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 CEST 2007',
403 updateDate: 'Tue May 01 01:13:27 CEST 2007',
404 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####',
409 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
410 version: '0.2',
411 creationDate: 'Tue May 01 01:10:17 CEST 2007',
412 updateDate: 'Tue May 01 01:10:17 CEST 2007',
413 accessDate: 'Tue May 01 01:10:17 CEST 2007'
414 },
415 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
416 header: '####',
417 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
418 version: '0.2',
419 creationDate: 'Tue May 01 01:13:27 CEST 2007',
420 updateDate: 'Tue May 01 01:13:27 CEST 2007',
421 accessDate: 'Mon Jan 19 16:10:02 CET 2009'
422 }
423 }
424 },
425 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
426 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
427 version: '0.2',
428 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
429 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
430 accessDate: 'Mon Jan 19 16:10:01 CET 2009',
431 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
432 versions: {
433 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
434 header: '####',
435 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
436 version: '0.2',
437 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
438 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
439 accessDate: 'Mon Jan 19 16:10:01 CET 2009'
440 }
441 }
442 },
443 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
444 data: 'HxkHstm/nWfD4tTwtaDqycSrP6vR7O9JUQrVXp90Z+prnnvuUMH3SbOlv+AQZFJotuM9VVOh52yWcl8TuSJ5SYR6pwmZVcK9GJd3aRH48wBRrsi9do+pgyxmzfpBm+CMnUtI63LMPfyz/zPndUQSke5+G/Q1b8ZddaShjYHWHEifjdswmKg68FOSu7RuElR/FwRCBwuT02vMRdrjwxSxxM5zWB3vqzN4xKi/jkvqGgIc21m8adTQoxAJARleZiyWXzfPO/MpUs3vA6nxH6ZO1kEayGw3ZAR3nFBiW0UjjdXCBI2b4PcUP0nSJKetRSiudo2cUKfYxsWgEPoG+PM/CQFdnlfGcPf4d0QYnkU+JHff99mLJRmz7VWH7ZeW10NTxzTEr47diHLpyufZ4knnRgfhfKtwOvgmG1n1lXyXDRVTeyfCCX+mB5qdB79ujqon1BiLOGQfLWZ8bDyTZAakpcRJb8qk3zP004XwN5BpO+jC2waMcUEuH62gSQeelGZ19pzBiRz8kn3ZZ8iviX46Wwk3X1TTke9teF7t6Pop4pRkaAj2z2ji0mqWtv4T/3QW4Xgf1mKaT2t8ZaucGvZ3jrxm0CW/Ra3Cy1v1APwRPvKnY5i/WPDS1elq3vNF0NY7EQbXrxBX7hgGpUGRcHSKYsuftIquJFv0HV31jRhd99nZz6Otx82xidWbroIS+37o2Rr56X/AwkLn3DgH+V/YAK24z3Otku+lbaorXnv6C8ZDUhcce2CjgEuCFPmv928YOahgmE0Q0uKniwVXgXACevvACEsduvW32JhI4D4cjRWcSzB6YhqXE8QYCQwK97OykJ30Szd/ZYykiXjdjymyqFOmI9tZqi/PUOKRJ9NhYZaVAeLEFUunvKJWHNs50CqElw6z7nAvBwYyEVvvc+rSpMb2Z/KAWLMzv5R3MeITVUph/RlRlMIrJr0lBhmghnLRt6cGRQcDA2Si3tGAm34K+BpxVbTK0ilTrwzCfaE3Q+dvBTFRcZzMcPFLHL7Mho1/kNMb5S0izIpsNPCb26yH/gueYghVmhRL76HQAH79k00uJcyXt57AYlOYQM7FKDHWciWtJDOMNjVFDYQJJSAS39HukwrLnAdqCNrabrS+AuWhX+CqmMlKQ0PRszjtT7oQaAcgJd0uPOVz3IsjyZ/CmrzSxM+c4iPXugkiiyS2HYU7EEz9IEDvoqwv3Djcy4+3oxPUdmIJGMz2Mk5UXMDyMpqfuujirZI5r5WQWWQLivD9mid5RWDiQp2NYwpnQ/J0emEpWFlf/XkmXW+Em/A0+DOeJtHB729WsKYEvMWOB1nuITkqPJShf8FVEunHzUuLKsG3Hf5yEc3isB5rWGO8hPCueVUKgiS/NSCxQ+iinBTO3gUl+hzK+yaajQUomCx7+N9/n5HTLM5kFsUxZ8gfG3LMEK1iaza4KZeS8Hmb58NU3e3MI0FvlZHa787LqNO226awx3sX/nuTMX+LXx9v8/AMrkRdbzlcYbe6xWRWcBGiTirbTV/CXMgCdop60xfRqCskQPbfj89zpHQS/GiTJjhUwh6XKc/TpbjQJ6OZ6dAQBDxexPa+sjr70kLARxeUhvDUytp/zd/A5OBpuZ0aUz530aQEj8BCAk18vdUks7TWcpiw+/Lq//QLu/9uLU/rLanu2DFUYGXo7bJzy2QpzuoHqKDqa3anK9Gs34NfcIjUbeMUyCzd6CFj+1vGNIk4zZi44PZvmqxZXI8XcxboTpnheNRksjw36FbhIKWMWksIIq+mh4XMnkQcS83PB9rwMHsYY4nKfCwddYfRlbVjcjX+jSlz0r6Oh3KxVDP6dt37CPo8DGMvXSeU4LFMcYBkZ/Q57sH3/gyblyHK8OqYX3pzbnkCqoaOwAseBrQYMel3OgSLt1nAxzhN+ZicCLhpSYHCcHYDcg9xoa/1u4uEMJ0JC+/OzU7xp3nC4OgSYxVzL+gBNnqX4Plep7oikvE7+qymqwtoEhEEuaO5pbOdPG4I7NknL+u/RazjXdy3IGyfUPCCQKsjAEbAkD6OBZZf4St21e4sSgV/anAYFGr87fHMPtXhBxH6QTQPgWqrK75Lr/RaOLihrQHgVhcQHYcTD7nTtPNelbJKx5aGOFtcqykaVizLzrflZWXnk+QAjHo6Hsn/edm7Hbna+JTlyVsttp2vcs8kHQk6xcCpi2kR7nJwb+6kntEEPZAyuFQVwvdkqyC5nAecdg==',
445 version: '0.3',
446 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
447 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
448 accessDate: 'Thu Feb 12 12:54:37 CET 2009',
449 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
450 versions: {
451 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
452 header: '####',
453 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
454 version: '0.3',
455 creationDate: 'Thu Feb 12 12:54:37 CET 2009',
456 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
457 accessDate: 'Thu Feb 12 12:54:37 CET 2009'
458 },
459 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
460 header: '####',
461 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
462 version: '0.3',
463 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
464 updateDate: 'Thu Feb 12 12:45:43 CET 2009',
465 accessDate: 'Thu Feb 12 12:45:43 CET 2009'
466 },
467 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
468 header: '####',
469 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
470 version: '0.3',
471 creationDate: 'Thu Feb 12 12:47:39 CET 2009',
472 updateDate: 'Thu Feb 12 12:47:39 CET 2009',
473 accessDate: 'Thu Feb 12 12:47:39 CET 2009'
474 }
475 }
476 },
477 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
478 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
479 version: '0.2',
480 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
481 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
482 accessDate: 'Mon Jan 19 16:10:12 CET 2009',
483 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
484 versions: {
485 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
486 header: '####',
487 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
488 version: '0.2',
489 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
490 updateDate: 'Wed Mar 14 15:51:17 CET 2007',
491 accessDate: 'Wed Apr 25 10:37:27 CEST 2007'
492 },
493 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
494 header: '####',
495 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
496 version: '0.2',
497 creationDate: 'Wed Apr 25 10:39:26 CEST 2007',
498 updateDate: 'Wed Apr 25 10:39:26 CEST 2007',
499 accessDate: 'Wed Apr 25 10:39:26 CEST 2007'
500 },
501 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
502 header: '####',
503 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
504 version: '0.2',
505 creationDate: 'Wed Apr 25 11:14:05 CEST 2007',
506 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
507 accessDate: 'Mon Jan 19 16:10:12 CET 2009'
508 },
509 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
510 header: '####',
511 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
512 version: '0.2',
513 creationDate: 'Wed Apr 25 10:51:49 CEST 2007',
514 updateDate: 'Wed Apr 25 10:51:49 CEST 2007',
515 accessDate: 'Wed Apr 25 10:51:49 CEST 2007'
516 },
517 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
518 header: '####',
519 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
520 version: '0.2',
521 creationDate: 'Wed Apr 25 11:01:21 CEST 2007',
522 updateDate: 'Wed Apr 25 11:01:21 CEST 2007',
523 accessDate: 'Wed Apr 25 11:01:21 CEST 2007'
524 },
525 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
526 header: '####',
527 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
528 version: '0.2',
529 creationDate: 'Wed Apr 25 10:59:57 CEST 2007',
530 updateDate: 'Wed Apr 25 10:59:57 CEST 2007',
531 accessDate: 'Wed Apr 25 10:59:57 CEST 2007'
532 },
533 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
534 header: '####',
535 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
536 version: '0.2',
537 creationDate: 'Wed Apr 25 10:38:17 CEST 2007',
538 updateDate: 'Wed Apr 25 10:38:17 CEST 2007',
539 accessDate: 'Wed Apr 25 10:38:17 CEST 2007'
540 },
541 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
542 header: '####',
543 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
544 version: '0.2',
545 creationDate: 'Wed Apr 25 10:56:58 CEST 2007',
546 updateDate: 'Wed Apr 25 10:56:58 CEST 2007',
547 accessDate: 'Wed Apr 25 10:56:58 CEST 2007'
548 },
549 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
550 header: '####',
551 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
552 version: '0.2',
553 creationDate: 'Wed Apr 25 10:58:33 CEST 2007',
554 updateDate: 'Wed Apr 25 10:58:33 CEST 2007',
555 accessDate: 'Wed Apr 25 10:58:33 CEST 2007'
556 }
557 }
558 },
559 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
560 data: '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',
561 version: '0.2',
562 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
563 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
564 accessDate: 'Mon Jan 19 16:10:23 CET 2009',
565 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
566 versions: {
567 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
568 header: '####',
569 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
570 version: '0.2',
571 creationDate: 'Wed Mar 14 17:27:40 CET 2007',
572 updateDate: 'Wed Mar 14 17:27:40 CET 2007',
573 accessDate: 'Wed Mar 14 19:00:21 CET 2007'
574 },
575 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
576 header: '####',
577 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
578 version: '0.2',
579 creationDate: 'Wed Mar 14 16:09:07 CET 2007',
580 updateDate: 'Wed Mar 14 16:09:07 CET 2007',
581 accessDate: 'Wed Mar 14 16:39:40 CET 2007'
582 },
583 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
584 header: '####',
585 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
586 version: '0.2',
587 creationDate: 'Wed Mar 14 19:01:05 CET 2007',
588 updateDate: 'Wed Mar 14 19:01:05 CET 2007',
589 accessDate: 'Tue Apr 17 19:20:33 CEST 2007'
590 },
591 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
592 header: '####',
593 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
594 version: '0.2',
595 creationDate: 'Wed Mar 14 17:17:20 CET 2007',
596 updateDate: 'Wed Mar 14 17:17:20 CET 2007',
597 accessDate: 'Wed Mar 14 17:22:06 CET 2007'
598 },
599 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
600 header: '####',
601 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
602 version: '0.2',
603 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
604 updateDate: 'Wed Mar 14 16:06:54 CET 2007',
605 accessDate: 'Wed Mar 14 16:06:54 CET 2007'
606 },
607 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
608 header: '####',
609 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
610 version: '0.2',
611 creationDate: 'Tue Apr 17 19:23:41 CEST 2007',
612 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
613 accessDate: 'Mon Jan 19 16:10:23 CET 2009'
614 },
615 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
616 header: '####',
617 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
618 version: '0.2',
619 creationDate: 'Tue Apr 17 19:22:08 CEST 2007',
620 updateDate: 'Tue Apr 17 19:22:08 CEST 2007',
621 accessDate: 'Tue Apr 17 19:22:08 CEST 2007'
622 }
623 }
624 },
625 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
626 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
627 version: '0.2',
628 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
629 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
630 accessDate: 'Mon Jan 19 16:09:28 CET 2009',
631 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
632 versions: {
633 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
634 header: '####',
635 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
636 version: '0.2',
637 creationDate: 'Wed Mar 14 16:51:02 CET 2007',
638 updateDate: 'Wed Mar 14 16:51:02 CET 2007',
639 accessDate: 'Wed Mar 14 16:51:02 CET 2007'
640 },
641 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
642 header: '####',
643 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
644 version: '0.2',
645 creationDate: 'Mon Jul 09 15:10:15 CEST 2007',
646 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
647 accessDate: 'Mon Jan 19 16:09:28 CET 2009'
648 },
649 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
650 header: '####',
651 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
652 version: '0.2',
653 creationDate: 'Wed Mar 21 12:56:43 CET 2007',
654 updateDate: 'Wed Mar 21 12:56:43 CET 2007',
655 accessDate: 'Wed Apr 25 09:59:58 CEST 2007'
656 },
657 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
658 header: '####',
659 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
660 version: '0.2',
661 creationDate: 'Sat May 19 11:26:44 CEST 2007',
662 updateDate: 'Sat May 19 11:26:44 CEST 2007',
663 accessDate: 'Mon Jul 09 15:08:39 CEST 2007'
664 },
665 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
666 header: '####',
667 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
668 version: '0.2',
669 creationDate: 'Wed Mar 14 16:38:54 CET 2007',
670 updateDate: 'Wed Mar 14 16:38:54 CET 2007',
671 accessDate: 'Wed Mar 14 16:38:54 CET 2007'
672 },
673 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
674 header: '####',
675 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
676 version: '0.2',
677 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
678 updateDate: 'Wed Mar 14 16:36:20 CET 2007',
679 accessDate: 'Wed Mar 14 16:38:12 CET 2007'
680 },
681 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
682 header: '####',
683 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
684 version: '0.2',
685 creationDate: 'Wed Apr 25 10:04:29 CEST 2007',
686 updateDate: 'Wed Apr 25 10:04:29 CEST 2007',
687 accessDate: 'Sat May 19 11:22:01 CEST 2007'
688 },
689 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
690 header: '####',
691 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
692 version: '0.2',
693 creationDate: 'Wed Mar 14 16:52:12 CET 2007',
694 updateDate: 'Wed Mar 14 16:52:12 CET 2007',
695 accessDate: 'Wed Mar 21 12:16:29 CET 2007'
696 }
697 }
698 },
699 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
700 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
701 version: '0.2',
702 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
703 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
704 accessDate: 'Mon Jan 19 16:10:06 CET 2009',
705 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
706 versions: {
707 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
708 header: '####',
709 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
710 version: '0.2',
711 creationDate: 'Wed Mar 14 16:45:40 CET 2007',
712 updateDate: 'Wed Mar 14 16:45:40 CET 2007',
713 accessDate: 'Wed Mar 14 16:45:40 CET 2007'
714 },
715 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
716 header: '####',
717 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
718 version: '0.2',
719 creationDate: 'Wed Mar 14 16:47:01 CET 2007',
720 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
721 accessDate: 'Mon Jan 19 16:10:06 CET 2009'
722 },
723 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
724 header: '####',
725 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
726 version: '0.2',
727 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
728 updateDate: 'Wed Mar 14 16:20:58 CET 2007',
729 accessDate: 'Wed Mar 14 16:43:46 CET 2007'
730 }
731 }
732 },
733 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
734 data: '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',
735 version: '0.2',
736 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
737 updateDate: 'Thu May 10 15:01:21 CEST 2007',
738 accessDate: 'Mon Jan 19 16:09:54 CET 2009',
739 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
740 versions: {
741 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
742 header: '####',
743 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
744 version: '0.2',
745 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
746 updateDate: 'Wed Mar 14 13:35:58 CET 2007',
747 accessDate: 'Wed Mar 14 13:35:58 CET 2007'
748 },
749 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
750 header: '####',
751 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
752 version: '0.2',
753 creationDate: 'Wed Mar 14 19:24:49 CET 2007',
754 updateDate: 'Wed Mar 14 19:24:49 CET 2007',
755 accessDate: 'Wed Mar 14 19:24:49 CET 2007'
756 },
757 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
758 header: '####',
759 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
760 version: '0.2',
761 creationDate: 'Wed Mar 14 17:41:15 CET 2007',
762 updateDate: 'Wed Mar 14 17:41:15 CET 2007',
763 accessDate: 'Wed Mar 14 17:41:15 CET 2007'
764 },
765 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
766 header: '####',
767 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
768 version: '0.2',
769 creationDate: 'Wed Mar 14 19:25:28 CET 2007',
770 updateDate: 'Wed Mar 14 19:25:28 CET 2007',
771 accessDate: 'Thu May 10 15:00:47 CEST 2007'
772 },
773 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
774 header: '####',
775 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
776 version: '0.2',
777 creationDate: 'Wed Mar 14 14:46:36 CET 2007',
778 updateDate: 'Wed Mar 14 14:46:36 CET 2007',
779 accessDate: 'Wed Mar 14 17:40:01 CET 2007'
780 },
781 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
782 header: '####',
783 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
784 version: '0.2',
785 creationDate: 'Thu May 10 15:01:21 CEST 2007',
786 updateDate: 'Thu May 10 15:01:21 CEST 2007',
787 accessDate: 'Mon Jan 19 16:09:54 CET 2009'
788 },
789 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
790 header: '####',
791 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
792 version: '0.2',
793 creationDate: 'Wed Mar 14 17:43:29 CET 2007',
794 updateDate: 'Wed Mar 14 17:43:29 CET 2007',
795 accessDate: 'Wed Mar 14 19:23:51 CET 2007'
796 }
797 }
798 },
799 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
800 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
801 version: '0.3',
802 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
803 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
804 accessDate: 'Mon Jan 19 16:09:41 CET 2009',
805 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
806 versions: {
807 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
808 header: '####',
809 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
810 version: '0.2',
811 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
812 updateDate: 'Wed Mar 14 17:39:39 CET 2007',
813 accessDate: 'Tue Apr 17 19:09:44 CEST 2007'
814 },
815 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
816 header: '####',
817 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
818 version: '0.2',
819 creationDate: 'Tue Apr 17 19:12:39 CEST 2007',
820 updateDate: 'Tue Apr 17 19:12:39 CEST 2007',
821 accessDate: 'Wed Feb 13 15:27:04 CET 2008'
822 },
823 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
824 header: '####',
825 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
826 version: '0.3',
827 creationDate: 'Wed Feb 13 15:29:04 CET 2008',
828 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
829 accessDate: 'Mon Jan 19 16:09:41 CET 2009'
830 },
831 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
832 header: '####',
833 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
834 version: '0.3',
835 creationDate: 'Wed Feb 13 15:28:28 CET 2008',
836 updateDate: 'Wed Feb 13 15:28:28 CET 2008',
837 accessDate: 'Wed Feb 13 15:28:28 CET 2008'
838 },
839 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
840 header: '####',
841 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
842 version: '0.2',
843 creationDate: 'Tue Apr 17 19:11:33 CEST 2007',
844 updateDate: 'Tue Apr 17 19:11:33 CEST 2007',
845 accessDate: 'Tue Apr 17 19:11:33 CEST 2007'
846 }
847 }
848 },
849 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
850 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
851 version: '0.2',
852 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
853 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
854 accessDate: 'Mon Jan 19 16:09:30 CET 2009',
855 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
856 versions: {
857 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
858 header: '####',
859 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
860 version: '0.2',
861 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
862 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
863 accessDate: 'Mon Jan 19 16:09:30 CET 2009'
864 }
865 }
866 }
867 }
868 }
869 }
870 };}(),
871
872 //-------------------------------------------------------------------------
873
874 'test_test_offline_copy_data': function () { return {
875 users:{
876 'catchAllUser': {
877 __masterkey_test_value__: 'masterkey',
878 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
879 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
880 },
881 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': function () { return {
882 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
883 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
884 version: '0.2',
885 maxNumberOfRecords: '100',
886 userDetails: '{"records":{"index":{"8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13":"0"},"data":"Ki9chN/ker5c+7zB5NinstllVq1Vs+N5pezZIohKVVa15VLSIyre3DRilRoldy/94LbGaEM3SZsMlf28hYbWySln3ekNMIB+MItaYb8urw+8U6n8+QaRMAClHXukfi8te2d1OIlgjbrBQNMmzBorjIs="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"YgSYIsDeVT87bfiASQqXA2E9"},"version":"0.1"}',
887 statistics: '6Kupec1ZD7Dw0WzK7pPesnLE',
888 userDetailsVersion: '0.3',
889 records: {
890 '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13': function () { return {
891 data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
892 version: '0.3',
893 creationDate: 'Tue May 05 01:28:36 PDT 2009',
894 updateDate: 'Tue May 05 01:28:36 PDT 2009',
895 accessDate: 'Tue May 05 01:28:36 PDT 2009',
896 currentVersion: 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d',
897 versions: {
898 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d': {
899 header: '####',
900 data: 'Pc18C1A9NwNlecbOtOOAEymNZD5oq20ZvPqMfiCyNhkcmaN9sEnifF31epZSjpDw4XM4ex3HFhhITttXlCrossDVYB8z00k6XsFruCkdwFRmBjb2PdrdZFAkGQeS/8xTarYWgiflkfGocGqVm6EUq1gh8QLE173Jzo15LOSuzuSS90BTMvcsqzzRrIEe+9jwF9/ehLyQ5yYxNImFGQQ2jkW0KiZsjyEbQAGry7B1/AiSUBaGYHYzcB3bFgXnzC3ecPwL+ENZ+azpTd143WneuVMUJrWNp3S+9ZRzboRzcYV6Ax3nOLPS7LTc+e9j9s4CrPvc1L6pG23AzNByDWst0JrqhN37yp67EVVrFQfUDWcKgZyyA/M82q1TVScx+I4A+g9ASC+PdQ3+M5+EOtEfClkgYJFqzXqwPKYwBv4CBKxikS2Vt8x40271kjmVYyGQOIRTo1UKn6u07TS5hxdEgEI+WdukG52813USiD8bQFbN0r4VhjFSqKMAJoItjqvafBNBl+OXYQ1p1zRCXP7wHS4/F7mvrK98gSuIsBgfL+/q9rExXaxIZJNSbs1HGAXR1TxYSvyKZvLa',
901 version: '0.3',
902 creationDate: 'Tue May 05 01:28:36 PDT 2009',
903 updateDate: 'Tue May 05 01:28:36 PDT 2009',
904 accessDate: 'Tue May 05 01:28:36 PDT 2009'
905 }
906 }
907 };}()
908 }
909 };}()
910 }
911 };}(),
912
913 //-------------------------------------------------------------------------
914
915 'test_test_offline_copy_data_withExtraVersion': function () { return {
916 users:{
917 'catchAllUser': {
918 __masterkey_test_value__: 'masterkey',
919 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
920 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
921 },
922
923 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
924 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
925 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
926 version: '0.2',
927 maxNumberOfRecords: '100',
928 userDetails: '{"records":{"index":{"75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53":"0"},"data":"YjlNzXUO9m0EXdi5fUguA6RjR5jc2mwuHkpMsHAheExR2zpoV6OJx8tBTdUGqDBAlbIn6xUx2TT+dzgjic/XubgKNsv6JpTvnfiW6ZMWiebKXVigoZw7L5EvmcHjVLI8aoIhVEj4ADwkh9qHm0Kt1zFGQPwwJfo="},"directLogins":{"index":{},"data":"4W5csD8DxlxeXVRROk7wVbXi"},"preferences":{"data":"/DjOoFcgquxUbW5ye2LrpsKM"},"oneTimePasswords":{"data":"DEqkd74lLAGtG4YKRPniBNBU"},"version":"0.1"}',
929 statistics: 'EkRr9wEXi/WOlZfCXphn9kfx',
930 userDetailsVersion: '0.3',
931 records: {
932 '75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53': {
933 data: '/gtNfde5l2J9eeg+rlBHZtqO4RDaWNQwaMEluOVowKdUlGAYjo9FU0NwKsA9CM3ST4sTYl0mylP3C/AGybO8/9sTCkEn20wi0slharA61Rk8uB2lNjCICZB4l3ZGvD4AHKucu8YQzxpWop5dTN8f4us5eJ2VjvJPLqUzSKZL4g+6MiKbjQ==',
934 version: '0.3',
935 creationDate: 'Tue May 05 18:47:53 CEST 2009',
936 updateDate: 'Tue May 05 18:48:59 CEST 2009',
937 accessDate: 'Tue May 05 18:48:59 CEST 2009',
938 currentVersion: '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b',
939 versions: {
940 '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564': {
941 header: '####',
942 data: 'MZGx+tQAecxJNl6UbWHIM8g416Qa8DfWtGo7f2vLkPBbhsr20xnZ233oPqIGceG5/6WMssQd9c8U81urISK+4Ar8zHGUxTdIYLZaDq33Q0uF5vO7OsaBcjL7m+tX7zB+e/eu0ABbqvt+saMsZKKSdIZv2KNbAg5VTiL7GjWuowM23tWgiUBgX3eO5fnUUQWVkBygk0qy2O45oNfb1XcbsGMCfS4YPF9GB/wGSQKG8keMoy1ZWZh4nG+Pdx2ymIrYKLv8T+i7jtWEbyhvEglb7TadCMBBF0pnkYvG3F29skWooZC92dy5213o+3/uSKi0od5tAbvSYZHjT5hDulUtmjRFGq4ZRERLqvrZs9Sg8G2mjtf8Ta99Hob8WLxyGF9x7s1LcLPERtdsP9qCD+I0WtwrDiodl/sPQ/5s3G2S+M/YejKXBvG3AWwoO1gkdhec3+d3meFNvCr0hKNzotrHmDLC4tGyZIaAcBmPQ8xSD5KmNJJFU+V0QIdiEYKnPjo95oSmKyK1UtIoPrWCahfYSKXh+aW53XnzY4JKHRER9vWwdJzz',
943 version: '0.3',
944 creationDate: 'Tue May 05 18:47:53 CEST 2009',
945 updateDate: 'Tue May 05 18:47:53 CEST 2009',
946 accessDate: 'Tue May 05 18:47:53 CEST 2009'
947 },
948 '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7': {
949 header: '####',
950 data: 'Y38v4jhKwcsW8LDTigIhtdLJ2zgv+1rSutqyu0AilBQeSTe4D0rnapZZTW/mNnD5IGpWKFoEl8+WGj1zvGzleNdkOa08nWJEYDNe2h0+FjBSHBUAgH5fraezomRWzJ/Z5HHFiZuFfpjt2BHd0Y3Not6AuL3aBgjjkEai90r2o59Xr70maUwo1UqmtVg3gvX067MC3hlqhNIp390J8LFiSj8Z4US9x/WzVR5Xx069+0PFMBwipq9WJPrcfTPwvP6xVa+J8BCJk3HtboRutq1ZhhHpibm+TY3Xl3gFTTCHWDZCSJ4Rm1dWkyqpx51u/AVg2TC+ljFLKv7hq3euVZNMLNMY2BqoCkcb+w6dFLDs3WfPAW0aQN2P++GFa/eVpN90YxAeXufjsXKaArTMjGWKiHqyU1iVVI8N1QEiFYjjBV1GvkJxog5PjtAzJF++qwHDIa+gJ+NnOfenVF0wIRMCEnpGyvbg3SkUoenKFoHO0IcSP2CW2RWV/GAmiEZEuVD393mKi5B6fpjdO9JVPNyz0i0kW++dtzInwPnglhOAY1ywT0ExOBLIEr8=',
951 version: '0.3',
952 previousVersion: '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564',
953 previousVersionKey: 'f45/Sx3jMC8CgdT8cjfcC4ApA8xMXABFO48jiTh5VjJfTlVqw3NnHRO2KDBIhy0znPvP2AKlpKQHruW8LQno7YLyhEIXh4ChjMUjJsFFwB/LUg==',
954 creationDate: 'Tue May 05 18:48:11 CEST 2009',
955 updateDate: 'Tue May 05 18:48:11 CEST 2009',
956 accessDate: 'Tue May 05 18:48:11 CEST 2009'
957 },
958 '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b': {
959 header: '####',
960 data: 'tkiW41JHOfbYOt2KHx1HtDJEzxbfVS1Y2HJQqdQZ73zhvxnkWLw/X6FMiBexLeoKXO1H9NIWS884MzEO782vg8QRxTizg66Yye+q1Hox+QsaEoaD4UQ54XV1duTOB/XS5P0P9DFvtIz9msEu8GJrvizAdxu/7FG2b5XfENDkwqIzydI7JMfGC0JzDnfGvYkWqoL8jx3Joxa7TNqN4he4v771Ho1ZoUv3Pp7ZGwBU+btl6Q9mcycSf5KXdTw+6nDjfQh8qyts/u7O5xPFh2Yn8zS48x95I4SA4yFKtERU3pLAxIkcZWVb17xT8xlbPESreZ0RyYSR0CgW0wPMxkLHH1uqWycTa7yIxUhyn+JK9jCl4eDa/KUSGbN1yb6pOyjGuev1vHEZv3bOmO52RVVIdMHTe3LezCKY8xpDqtQKSfAvFg1TmabugXePXB+KvPbDDWI5otDEIwLYhDFcSn2FyqUEATSzeU2o1uXO+ffbU3QBrwr27tsreughWSP7905FQbEEshsRUc2Xt92WhTnVM6W74Y0bMLWjTrXbu+hNsjtFYYN6gtezcltnB58MVw==',
961 version: '0.3',
962 previousVersion: '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7',
963 previousVersionKey: 'XtJ8Ub99GXIkxErIPr0HaIrRqlAO0Naa/tPwUA51K2D5R6R3CR6QbHd3GpkCnu+y+bcEIRYrQqgabi3LROYT+1SZ9B9FctX6FyaTjYEazFdCvg==',
964 creationDate: 'Tue May 05 18:48:59 CEST 2009',
965 updateDate: 'Tue May 05 18:48:59 CEST 2009',
966 accessDate: 'Tue May 05 18:48:59 CEST 2009'
967 }
968 }
969 }
970 }
971 }
972 }
973 };}(),
974
975 //-------------------------------------------------------------------------
976
977 'test_test_someExtraOldData': function () { return {
978 users:{
979 'catchAllUser': {
980 __masterkey_test_value__: 'masterkey',
981 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
982 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
983 },
984
985 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
986 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
987 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
988 version: '0.2',
989 maxNumberOfRecords: '100',
990 userDetails: '{"records":{"index":{"05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a":"0"}, "data":"3iVejXl+Wnh1P1HeNXhuNswKZezHtSDEnMVPhtFmF+5qimM4vXvQ+8hTO398SktE18V+lTxzQBLrLjMfZBLIaq1rszO6CVi+Zz2+A4jC9jOkjqlHlMIQMxF0jwvTr2fRQSYJIT086H23LVH79Pdik+E/XmQCMyX5oPrm8xI3TnHmb02GDy3uEYTOodIw"}, "directLogins":{"index":{}, "data":"zxt4pdoEyLS2Z7F4GuHsR2Js"}, "preferences":{"data":"/nCI2oM+0mskwEBYj+ghKgvI"}, "oneTimePasswords":{"data":"OxUue8AceRz1qmwkj/c0V91x"}, "version":"0.1"}',
991 statistics: 'rGwA4ZUPNmYKzQCzLpstvcos',
992 userDetailsVersion: '0.3',
993 records: {
994 '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a': {
995 data: '1eab9775e41984618f366a58f3de6cd9d72725da399ade71071f83d3126552d95487437b1a6fc87cdb25b47d35097604ed23f7dd2b54bd71982eda7cac3e19e9fae5b1d8c52806d6a860a35e023d525bf0e43ef459901da8d819789031a80cf8ee4aabc0e8fd0a051a6b9a23e4e7151da900acb710439a5b11477259f464dbf38a6327adcc9dfd7ab7808ba7c6d26a39bc678da394083652bbbdfe382f32ff3a92a31697b72e83f1534e72e7af7b316137d60d597b80649fe11dd506f600315543c39bd447a884218d5ed8746102a95587dbc844f3437a7f057e26a311078a2fe508613894384c6b120e0b74444770dedc636930a5db17e39a55c79da36f44222ef7cc0d3060deccef7cfce9d4454fd3ab4f8e19e949a9cc208e915e29b24a6cd9c0ba01a84ed3c3d29aad374828c4f7174e51d5949799d29474f9d0e0ff421412225492926252c5c28859fd1945fe25',
996 version: '0.1',
997 creationDate: 'Mon Oct 02 10:01:52 CEST 2006',
998 updateDate: 'Mon Oct 02 10:01:52 CEST 2006',
999 accessDate: 'Sun May 24 21:33:48 CEST 2009',
1000 currentVersion: '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
1001 versions: {
1002 '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a': {
1003 header: '####',
1004 data: '1eab9775e41984618f366a58f3de6cd9d72725da399ade71071f83d3126552d95487437b1a6fc87cdb25b47d35097604ed23f7dd2b54bd71982eda7cac3e19e9fae5b1d8c52806d6a860a35e023d525bf0e43ef459901da8d819789031a80cf8ee4aabc0e8fd0a051a6b9a23e4e7151da900acb710439a5b11477259f464dbf38a6327adcc9dfd7ab7808ba7c6d26a39bc678da394083652bbbdfe382f32ff3a92a31697b72e83f1534e72e7af7b316137d60d597b80649fe11dd506f600315543c39bd447a884218d5ed8746102a95587dbc844f3437a7f057e26a311078a2fe508613894384c6b120e0b74444770dedc636930a5db17e39a55c79da36f44222ef7cc0d3060deccef7cfce9d4454fd3ab4f8e19e949a9cc208e915e29b24a6cd9c0ba01a84ed3c3d29aad374828c4f7174e51d5949799d29474f9d0e0ff421412225492926252c5c28859fd1945fe25',
1005 version: '0.1',
1006 creationDate: 'Mon Oct 02 10:01:52 CEST 2006',
1007 updateDate: 'Mon Oct 02 10:01:52 CEST 2006',
1008 accessDate: 'Sun May 24 21:33:48 CEST 2009'
1009 }
1010 }
1011 }
1012 }
1013 }
1014 }
1015 };}(),
1016
1017 //-------------------------------------------------------------------------
1018
1019 'joe_clipperz_offline_copy_with_preferences_and_OTPs_data': function () { return {
1020 users:{
1021 'catchAllUser': {
1022 __masterkey_test_value__: 'masterkey',
1023 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
1024 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
1025 },
1026 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
1027 s: '5f7dca20b7bc610a966ff3611cd8d6bcb5c5782d810123fcadf7155757ea39cd',
1028 v: '100000924a0b2bef390c27b2f5f379ab1a557e8b6c2d4ce5ef57e983d5c3ca49b',
1029 version: '0.2',
1030 maxNumberOfRecords: '100',
1031 userDetails: '{"records":{"index":{"a92c1ab3df0677f63da3cd1fdcec440fe3763e072e1035f8455672a97344a6bd":"0","cdc4624c921b8d99918c3cab5264b5e6de39df30ed167f504bc0a2c612404d5d":"1","6a17bd6b1bd576b99b678dfdac7da04e79402fc542055197017d3e586f6e8f38":"2","9ea260fcadc1ae2bbb8545c32035dc55499f715d005fbec71179600b50aa907a":"3","c0e76e60e08faa3ffa9d859ed869ba3cf3b42becc9478d45ac94cae6c004cc24":"4","5c5fed5764090b8c83435acbc22db01faae889c3154d51d502a3dc532c8709da":"5","97291f9d95cd97d089f940e5a4a674b7c33b06637337d3722010b528ab1fe34a":"6","6b147cfb119d690204cebb33ac047861a74504c87501432d914e07008ff3cc3a":"7","5d2b04a29a8af43562b1e307c416d9590ff55e370d9b542dc1e58c1e30127359":"8","52d2d8c69839e61f07b55c3ef496177e86b9ff35d27ddf4736bbe1907b30227a":"9","de7ce7e545acd2739d5d2d00b04f889fec7acc2229082a7a678ca050e2fdd3a0":"10","44d85d696125c6fa75e791b895359a31fdbdaec3303e286d09a484c0ea4a6558":"11","98af9721614f0d2f03d89ea5eb8930b7f1bee6a55a8e81f0eabe964016a930e3":"12","3c735070f699188a0813489b3fde68e9a7bf25f81d78e98689b81dee364eb013":"13","608adeba618077d125f0b489ef28fc7e3b1ba4fc2baeb01a3a1fc5f568578791":"14","35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b":"15","c742849667f8001483c1e6d3d388ae9d02a2e3561a1be7b1866b62a356b72b91":"16","2b58e7cdf7c90594d330ca9636565dfd1ef2e28bb49d16dae94335450c496b2b":"19","aa5a54aeeb4f7926e4d0b469207812e5384a4e00acfe9248dee45e939dc58b42":"10"},"data":"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"},"directLogins":{"index":{"03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"0","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"1","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"2","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"3","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"4","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"5","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"6","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"7","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"8","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"9","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"10","61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"11","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"12","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"13","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"14","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"15","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"16","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"17","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"18","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"19","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"20","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"21"},"data":"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"},"preferences":{"data":"pcQa/VkZWvrLv88k/npaOssWdQafXF9zJS+/DjM6MZwsUimSlhedy2pWLvrXp/TJ0ws7Pef1CbVmoxHJYyT1x7Eon7y0qy/cf483h4M="},"oneTimePasswords":{"data":"lyRIfuaIli6Zs4awYtZWI9JgUxQluHa+hxopJ4ADzlXfY7vTv5Iuxtmy1JviMKcGT+xge69tkrDBccydict+biWRPoZFEuR/V7tLMNndQBSdR54usAJ0e+obc6jDM0u38TpyMit0W3f3CL58lV7VkNUQgt6jEclKPxnKLMCqLOTNqoPTDNDMFJdlWVXFVeh+TDG02rarglHzIKd1lox9h/j+Ty4s04vjhISdlE1dNiQ2LqTZ3M2xv2Lg/kH9LBWMryCKmWpMI7IiD+S+eBnyq57EdwrqQi/3p6E34NcuJVJRnLBjnVAMoGkhU/vMg47iLcZXF9obP+oHYUg9mIKO2NNr/OYA7UIQ9lEHXWqs1XZmvnW4ORrzqQNnrXaO5/nWjYO93oG/PLGlJ9G/Tf/zsc2BAp3KJSwILoNS+xWckUydT7gickZqN+JSBXj5W1LZxJ60EY3PBIyE3i37yzho7nP4n30G8kGv5PgSA5BzpKj8/EiPFF3JFJVB5oDcwdeDgvDRsCOGUSMVWcWP1MfDsKHsRkMdGwW8kjFB65/jj3VTGaS5tYtyYVIhr49Mq3I/hUVBk7fcDQQM8DMYqj2EVfDoYAnA0BT+BAFRJ2bfez8Zj/vgW8GOwmsvfaha5YnneYVFg6w8Elw0cwJh3uKGHKCuXwXpe3h9LHSpA8RB95m/dvdoRQg9pg5l2y6oqFlMjBd+3qrpDWG68VZoz7pes0WHMVsNSmJQs+yJ8XfiVnRl27O8/8v4DmhRUb/GhuBSu3pew2YIPVWXEGq9C4nJlZhWAeT1pF49Gv+2bDzRI2R8fJykNXbStn1DO1I6bF01yECRgfzc830T6VBdSbUjpmmMMq67ZS0XVPvO8ZErmQcM6ua0RlttgMdXwNrO0pQ11TKNtGD6k72ud5MYDOYOtgMq5OFdpPc6A/b44mJ1Dim/8j4ETnRM53gl+FU43kbDGBkFu2Q5UGTmza/FctczfHqGEhthyBEE834FDFJeRZSNpGPAvGALGfReifNuc8GtrNyr4X5YxQdcNLHTa8wPAU04M+2gi/tXMsh7AlKbZ6FOEXmHe68A+twG0gcmPG5hEJo2n5L8pAd1eeW+EiYW/26g/oxKgl7p1x6I+fen3rlhcdNkGpUJeGnf1B/Su9wTKeQjobCcQax6RBbdjewLhbCFvSjRjH/9IbWNDgD1sI1xHEh1hKIgSebB1Wqi9pNc4Z8zRsko3/ENscVC7onTyZDu40QRNApD6c6sOLrAgQgUXdIC7Iinwv9MHFLARRmX/f4N+GfFqz5xvfuZtMeQI/H2MNtC1xVT5p+MhBxo02LM03wW9BuXCVDzquX+X5Zvo8hECl2zed/Bnpze7cuyaMFpQLqLnpgOrIzLUWix0ri50+k6SODYj6Fkzjz92COdx1DJCgrGNV/LyalPs+bsmwQQ2SgfxcE9+pWaayRlXB9zSxoZWv9wMX81xpd0fDLpxfLmINKx8G7hSK8YNU6Ldl9fQWM5Num7/NHkiROA57Bnwa8jEoJSejKLxWLzxoyVm6AwJUVFHpBhm/VOoM3lUW7IVyyCQeZP9zeCfmTtHtMDu4FkxNEUr2YppNmaT3CRtOJsLjcbpDqq+b5ls62U62uJ4HXz1ZBwgxfZcHUzU9t/dEr9dCvAiTSfnDhXnqPP4g5G+TGvcfOw+UdkxAOMvvsoYXKO3A6VqJOwrynUJKxSd7I="},"version":"0.1"}',
1032 statistics: 'I0/F4RIPSdiZYXN7dF5ceIel',
1033 userDetailsVersion: '0.3',
1034 records: {
1035 '2b58e7cdf7c90594d330ca9636565dfd1ef2e28bb49d16dae94335450c496b2b': {
1036 data: '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',
1037 version: '0.3',
1038 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1039 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1040 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1041 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
1042 versions: {
1043 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
1044 header: '####',
1045 data: '4VJOhqSOjhTFz/k+JEODmNhY7cCD25PLK7aoD34G4wGzeoVjBxzAJ2NKXG6X3eL8cXG7DjhzI3LV/PiPkYhFf2sVkHbcvAlXBcuQFOZkZcf6PvedC1ZfNh0/QKVWaCmTGrMUP+MEk448fqKfKxJZMi1lUzvMx6VX3bSG5ZQpjt9DtpsPXsbqiz1ujkgwR1a5f1oXgwoWVVcI95yOb3cS9/RPBy9rP95L7reRkzBG8hbyUkZx88yZNC/RgnF68PfgAKlIxAuyMX7V7OuXzHntSxw3FWBGIg2EiWpvAJAUi/mEpZcp+0es29rbHJ0FyuWcW0gbeUsCS0gAyQOj7/VoiWKhG1Zc6qe5cE0F+EA9bLuewGynwX0CV9IDYtoC2IAJXO/HmPF+yeXf1TI84h8l',
1046 version: '0.3',
1047 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1048 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1049 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1050 }
1051 }
1052 },
1053 '35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b': {
1054 data: '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',
1055 version: '0.3',
1056 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1057 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1058 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1059 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
1060 versions: {
1061 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
1062 header: '####',
1063 data: 'AA3YiiY3wEYTTnaKKxYsmKqTZDkmG4FoICNWtkJXiEhHzElR5vi1OgMNhm41aRVszrCemeM9kK0we+rMCyFItJ2mLcbsYQRmuuhOqzmp1fCGSoR1x09KpDNug/FndY/UjtAbs9T948zl3TWvdwR9VWOzw8XXxmJg9YTsw5uwhqQXcxdVnQI5akKClcoqz0q2NVp+OdgQnjc+FUE9WeqKY/Bl0MV0l38L07DLcoHZ8OVKPSERnMbcAbN+1C50hp9QfmniBUIoVdAIsNQ4Zuvh+6uo4cRMeWQfKw+DOVAWiIvrpUBSk7pVZWeOoKF/IcUR5Ftem63GIxwZolnhJ+HcTFcNDWkZtb+E3QRZ4A5kxtPZqI1KQwiTkS+mGI/u5zumFtJunrpbe8JgikhV3mA/WD08nZdSxmfg41BmMC8t+0zQ3Jwiirmn/F9a+TIntcwyI/4goY6T4Z/t+vKHVdv7XU+Ma0Oy6swrXB9JLfPF8S8PcM/IlyqnCKkjq1G1eBymMw==',
1064 version: '0.3',
1065 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1066 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1067 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1068 }
1069 }
1070 },
1071 '3c735070f699188a0813489b3fde68e9a7bf25f81d78e98689b81dee364eb013': {
1072 data: 'PPAaxPg4YBKa+02+PpnXDHCEEtAbyyPGrpVdLS4DBky0KrUV1J8C3lsCudQLrVNcRdgtXetkLipukMuZ7lOS+qlr1vsF0JyaU33GpMszeCNtOUlWMidZk0SnjHPPGHBXEzmZm6yVfprH79bv8YsoWASyRamubk8kZ2lYefQvl7QYNBQVb01cyprJUVTtm2MttYnfKSKmlN0n80nSpNFZuTyMov1XAlot3iicojBvSvicsYwkKDmJ5bnpuq4kzqonL2UUQ0TDTJ7erf2MkT1/UPdnE3ZRjfsoIEm07+0ORTqrVZJXjmBjSLlxvBRitAcwVs5IWTUEnMF6/bYhCMdWnF9w2oayHjEnKh2L+fA6RQjkjlfYscmv/HfxErYvFvfSRCiu66AotlL9qwBzEooaXENZfPqZVrYKRm92oZDoz8KOm2EHlttnBgjE5w7kRtdDDBIgGsU94bLObSu0UNHERADv9VitYYK5dEU9Myugf9V8aAJbwkxhzZHvYj6KsKhiQtMnaU0FVO1qib0g2tyH4+TlaUUlY3Zo7wjIn3GMVIomgN04Lt/gBp2vq88R8/erqERKdZu4XXl5nATF8w686gedHHIjpObeVyBN6PTNp9enS/rM+sQti5AOKQLx9DgVaoT46iLcg2/UOgIwt2zDdXOccXqBq7PzS+aSzya5Pgpp2H2VH527/PGfR8D4EA/tiNGhUdwPqz1AJz0td2qCWMllJ8GDgme7Bzs8UG/Gd+fWUkngTwRA/CcNAv/1f/SmS9V6RjidkAiNF1D/CGO9rWMOLMr77W3kAOEdQZzxo5tzymx7FgG0Q1xa0fUY8z57UxViBILddU0gArWyppOjAKtP0vw4eDzPFlH77a0TdXKnfB/41arRi5kWl/fX0VZmcjRQuFRS3t3m8Ta9GINaZHo/QAKK0Wjjads4THGjNBOFq/pVfqE3P8EPJZimE9A79dz5crZCiqdflTgAGUdW4razA2jqxcLbbxvXuSaJM2kecddVvayOWO6gVu/xbwbqgk3eETpO6HBbYZq5TzmAOJEZ+XBt+F+wx4EwYTVxNtzV7NDKvooBH5CDtTxfmDIE3b/FXfqIluPLXuzjUaziotJ+IARbY77w61VjjK1xPYPCF52Ovb3d1A0L1SUwfACzMYtG2Vp7rwAa4kUETedwjrZ1rw==',
1073 version: '0.3',
1074 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1075 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1076 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1077 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
1078 versions: {
1079 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
1080 header: '####',
1081 data: 'HI2+42Qv/BK066PQvkV3a+njq1IJeWZS3XmFYL5Q0G8ZChyeMUz9oCSfLW2fZrDcwTQNKk5Q1YIbK2X9PunUX5+s2eKyta7ZejiAs4A6T+AL9GEIPYnX/OjQx5bHFL1lVWCOhg8dGU73A1ryMEUZnflO17KzhktJENZvh+luEHjN0GIqCBypenDE3gs/A8aPoqba2EcJ5nfazVxwIpiPWhyF4HoJ66pjBdj9gUoIqq079MPVcs8xVdO3LfVOc0rT+pCi9+ei47s2q3rwjhC+osWCYgXdkdcf3TJvOwQPDq5JEtv4vofeHsLV3f0DrBRNb1Rl+Q5VNVJETVv5CGOgT9doysj1ktLA61LVBPKIJnmtVaa3IoNMHvTeEze6kgIsgWaH3t48uynqowx6QeveCQBH',
1082 version: '0.3',
1083 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1084 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1085 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1086 }
1087 }
1088 },
1089 '44d85d696125c6fa75e791b895359a31fdbdaec3303e286d09a484c0ea4a6558': {
1090 data: '5DKtDM4rsjjlFeJ2jznb2yT85d4lhBouKjDGFQ0qkHB1hUaMf+8j7eY0LX4n+IlFYaaol3EfWCbIMrpTDtfCUV5+VWgyA9FunbRHYDyCRZwy28+cJVtWAt7aBUninuQ87LCXDEYqwATDo3+wSW69OOIzqs4dq5bL+SAbX53biquKtb4kDlSgHGHImlpBG+tPYFLVL+fbm7MC3khgVtM7X6fBUhm+g41mAkU+0WUxft9hQJUZl3JH8tSBxhkHxexfekuaoJkFlpxAKR1Mtb16Lo2w+8/3mJ/cDxacjjui0IH2jaZG61JrqJutx2+e+M3xuDpcLeGm9VNEiEDNzeNWhiRP2gojk5liQN7Hhxdl9DpKpRY2s7uMRXeU909vvEWaAcEbF84xf9Y+hgwCGBT0n80VKkHPvGyC9Dnva4HfqIvu4wg0xF2ISEun058kaTy/+BnZu8rRPsc8Y55Q6wbNQvy0npzk82wqsHomrXNNMnoufM3wQjCFt0jIR/UowSBBvtLxIq6fF5PvnqQgwZOliLIM7GAvMvn+Pu/k8Kax73QgIRkbTRW/pOoKIAbvnk216oe1u1+AGqBqWzISgMfux9aWvx2rmk+MZG+S5xdVQzRhhgecpgYzDXCm66FbzKVZCNnCSBtge5VwChrfAGod92RiqgZBpqTe29MwW1vlVils9XBfvDCL9BxMpBYSOOHFilnSwdp8VFPFejFiEg0nJBK63IuUS8wyKtkzsumYJ8WKlLKH/xDtLBPkOnzMzj8s5GowhBfwxatbi5BZII5oEVlSgMlrPUUNf1zExDxIvrDflTMoZQuYTG9SArJ5VIbJrznaBk9LGphrQNH1t/90eQhkCFNdSbLraxxDN9+8qAv4cbbEUUVLXiXO3GN5VZuVZxsvkJ+3RjcsQgg2CldV1B1Cy3iY+sFqtnPChXDItMdZU08BkItB+pStsjaLhja75cw1Qs/I8vdJdo0czWgb6SQPU/UllTxo3CS3t94PgR3nNgXcUYafc5QzjJJ2H59PKiQGdXju7gjLVfe6R3ALysiGJRD4VRQx4fVZKhtnrFBfy+o+4+dMwu1HeW2Kdm+jwXrGWCc0j1qan2d+6G9bj8fLT0hOykuixkFOp8lvublO4JKvrSpSrCcXnE3dxQoFeHIqwI14euka1Waf7D75tXI/leiszCY1WGPyGIV1ezIzgIyRAfLH4RcxWfw+2iaLJANOOhKro4cb/9M6wsNJ91LxpZF+YpsQmUkciDLMafoCvYnmWKq5',
1091 version: '0.3',
1092 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1093 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1094 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1095 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
1096 versions: {
1097 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
1098 header: '####',
1099 data: 'UukuFiQRHdw4Yp8YoQ5gsdE9ZMOG9T7TwNbEAKMgqTiCmbQlWr7PWnD4myvH1RVFE8D/L8vUXcvfGoUkENRu/amIAPZv4vj/v41COpuahE6Ge7gOeFDr36bxncCAC9QQZYX/PiDX0OmsdrfsCHk0xIDln4yF/QTzOlygOn/G2dtfOaDB6qLs/Qn+dGuQuCIo6H2ACRT+yW684lHziFwch+4USry8IrI6L4OJDOgjHOdPNuv8SKEPYWeeMiIdvPfpWvLR+hgYVCJS8jiBHWDO7F9VbT+ed6w3b27ORcXfYUXlScedXhfxmxZ9sBkEXYVUhlgVpMOUBw24jVNrpkq5wxt4NGEhlfX6L2jdc2nj33hP7mp4Slr/6gGm7No5woXr+abCWZxgdsbj6Yybbhw=',
1100 version: '0.3',
1101 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1102 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1103 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1104 }
1105 }
1106 },
1107 '52d2d8c69839e61f07b55c3ef496177e86b9ff35d27ddf4736bbe1907b30227a': {
1108 data: 'XR0Do3w0K649LRGUi/FZZqF3s/cTvWRH/ke8qNXqOUh7xFZWd9cWnboAjFu2dRAwtBDIkdgJU5cfPJZIQdbGw8FnyvilokLgZdNqRqov5p7fQy1Fi27pQSvK5QJAiB3dYTmb6SldpuAqdBHcGp9UGecBzzOycqS9GjsXrrrBF0jKRuHJrs4nR8qkrwlQsa5JVFKbj+kgH3gttd2y4cYaOgj+c0/93co0/ao5hzgPovP5IWRf16dxWCV0p80e9ufvP4b7rpdXABR/tkQ6AgoeHF1asE+a1PPG5MS4dkn4o/+HXLBBzLVY+mMc5vsHCfuP7U74DoIVOjqWmoAmKDEBPGSj2bZELTG4guhAX9hdk1cfNRE2g7fhUXkiAdZASc46ny8Y57qc/duR0p51g0b2lStu+OLkzaGhAl2m+k6rxHGyhZE9o/bkGWEUisR9W558M0mKoAzWBoqRzcau/Z2fOGaAD/qMc7czoOMzvX76gyo6NQx9Go7l8BMXPgGedQMAOOVA1uWco1Es/WBzk+Gp9AsDIGPss1HzXZt/XjC3pvcV/Sfv5M7eyu0puNC3XiwFfZWJgoChd/QkIHicJnZlYTyrpO2nEoHPTbm2AY6UDl58K9+x58voKQnrbrdHF04GVBdtZvHiNEzzSd+4SfQaWql3KdhaAa2LzPM6cIVqREXI3UwPVpDu1XHsiC2I45mQ7/eIT0kSQm7wPlZsT5Fu6EFaHh0lHBa5MML5/EQzYqfosFvwLqxuI9coF3JyQszo5x2sdVfSkm3ChJ5iG5T41k7fa6zQbZeUHM9dLLwx+tCxF+XwoxkBJ3fYSYmmF/7xdr15brIB5Pc7dbBZMPiktn1nc11bE4bgyQOpqr8a7m1tAOT4xK6Relo9FkKubLg+hbUr8+6KPzztiamD9eAGQRopf7e7bVNt43UZIfSmCOGopkfZ0s1AVi396ZUexYJm/OgKWNR0BE8P1kXsSj7Q+swYXZM4QacF3u4sQwhKGu/Dxfj8hBecfnCQoe0oDBQwT6Ep',
1109 version: '0.3',
1110 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1111 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1112 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1113 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
1114 versions: {
1115 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
1116 header: '####',
1117 data: 'mewISOORFbu2QbxavMOFNOKpVRZTFZ5l9SG1T9Es0eDksCgUj9g1cNqRHC4lrRcp1F1DbXLrANM8Q6fK7m3Aw3yOVKog3+l3n0IeEeOacY2iPy7t4XgUqs1LoenPfqgKwvtG4BK0jnyefbPKEsT6oeh2TkfDtK5n+ofVUieCPqgyc/giAapjhxtKE3nkWVuKfcpUsaeHD8kGPY/rW3TlD+53pQFTdRfRgMGV6GveNo4WND54w+7y0WhwAqow/5vIrsZamUYOGogToklldP06raxY581IhwdogLmobs336YJ1NA4cpwLdkb/GlG1Tjj7Id1DY4mxuD9h4pxwrQJ8ogeexBlLGlHxmxCuX/AtiGeG4a1i8QC/CZKuFtQ+URRbCqtKiGmTEvNWVhlbw1MSZsbU=',
1118 version: '0.3',
1119 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1120 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1121 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1122 }
1123 }
1124 },
1125 '5c5fed5764090b8c83435acbc22db01faae889c3154d51d502a3dc532c8709da': {
1126 data: 'uRB9zloy8YqSNEu2S6QgUEznfxgCvfLxQIm7dIxQL8cRRz15WdN1bLjdJkNNr2X0LZn6J59u45pn4MKJo4Lr6p6HB4Sx9f3IjWHjSD5O04PTnddX2rjpQPM0ONFTuOTUf1ETaG3NaOY8AM0nvBBFBQ9hxupGeEVKOY4jkxKqPo4UFD6AEi4e74CMMBnGZbKNPjOLJoMn6c5Lyf2YXMc7stXC6HswINHcMq8zYOuN0qlhj6wllgW7zSQSbeQgz8Xu0RY20K1IxAyzNYq8OdVsNadcOvNFCMFE5BNvoZvKOa5nDGmYqyytXkWVsPHULamBhOUAnrU3tKDAjNWIeUNcI1hCEiVSP7ggsHGZ1PJdHPpSQZH+5/xIPtKtZRZ3J7D91abZHN8XNk0WUC37WhOnIVI+79CIS+t7t9muRH2mBL+v/VIRUWjKdBYS7tTdXPUJOEIregvGc6qX90GC5jt5aYNTj12yJ/AxQdKVP/fmE8klf0ZgRqdp8fNP9IwT8S7/8c7S8TMQPQzfuQ39m3aJiOJrHkQQBbRr+es87P2aMu1is/BTzzbIEGq74sc0GWl7aC2ocjJRogHRQ15NtzGGFuSvP7gbwEp502mJ/2DkKKbY6g0DyTJ+FDe3aTejcW4md/gTYsSTqN1FHO5lg/A2tVrmaAnFFrPvFe7OEIwMbN5Ft22GlGG4GL9L/xXtKTFURdd4uxaAr1xJ6u4m0LnXc1iNs3EQjyVCJxzpW4aubavv1mzGus7fWOB5qMgDH6Oy+BqmrLoQgidy5+6NYvvejrqE2nJgNIEeg2iSrAIly9Md1m0FL93ZlFYIqLdPNn47vvhz8pZAQsLaGyrEvNZzt+67IZ6XUhkbO4NBOt9toJkHW8eMy/go3EBWkE0ZdleXfi75pJjT5gRMPOknSsgpAtB8Y2AcjHvdP9SfrZoOtxtRHJnOyQgwfWcnx+fCxCFPdo7mR2aDRQR5vQFU3+LTwgB7QpCUMZ7EGg4fGexfCKyTfkDzNFRWdBgRV16CV4q7HIIKNYB9dn8mgTldkMjaBIsVFGd8hyvhArWqQdDbDheghNz+uQax3go94gkQ32q5uHC3Wq4uCYkZSMGtGS4xZ1gL+yqjbV3e4Mt0uDbtCucMu9Og/ftPWmw/xWPY2z6L8juU0WsClz1rulvO1zsqJQF7PF2hlvixFrXOzxcDmSRGig4yWszcesgDnu/+bG7X1yVnRjWA6PyfnHW6',
1127 version: '0.3',
1128 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1129 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1130 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1131 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
1132 versions: {
1133 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
1134 header: '####',
1135 data: 't8y1iJOn18POJGNiM7JOX59XRrvZDoiDY8SxTnmIRhuqgE6T1FZ56s1ObEMsiyzPoR5OrkQgp1GcT5zDpC1uAtwNRnKUqfe8xmbsoHreq614Nn95vDSpIBCLPqWZYLs5PxAD/M/HIpkdLYBtluFqS8jTPTGGl4Mo7BYJHVEonHN6qgPxzAB5rYZQxGwuGK7m84Hdu05wKnGfwLT49nnR7pzBoSfKgGzYU2PShki6qd36x1T8bFxZCG38lX219pNZ/Ogqu0okqxdNVH9Cib2RWwRdW3a1Z/7PyUoqDCjddEjIi5eS0zqk9JYFFdJQ+VnWlAEkOu/MR2C/Mcf7ESmSlyIfTWkTJAE8T/LY52aPcdJR4CyoIt5LUVchn750UQV26voTKoORkke8uW/aZo/LVoH34CmmNQdH6YVw8IUvqAs16OSUikgk2RFFfI7ca7OGftLJCSwjJT+0bkvLo4jvi6DrLj/OReUbIWEQUmP7cRMURw6tkEP/rpHbkYD8Q7pQR/z4I8nsh14f7/AHU+fHDXZGAczT0ge8FFFinyTVkg/2yBk7jU/zcNwnciSq7Q985bAbmQTP7ZyIErAYvPjk+Sa5VHoGq5kEGYDPTMJ0x1vZ3ev325k0+eEPzX4Pez7LewnNhkDzxx9o1lpHo0wwB8QfkGo0xdVcD5UUFmXVGwRy5Qnr8gb6E4lXKhll6dFx99n4OrMipyNd8it2LzbWVZr/UCoizEhy+3+nI9bg4QBGfULH7uWSM81jyHADRBKWbzAXdxoF+F/lJngLpLrqUliXSIHi5d2GxuJwHd4LeBIjETJ6c4oEEqvSoM+ZNKalTybpVgttN6kZgu5CLI2678nfKYqIro18VqoW507B9Dhzm+34UA/RdMd8PmIlYVgcadi+KknKZiFVlITDidO1vcCh2OVCLQuJshFCyWFZQtthWPupQu6VXOScahFiAA66fA==',
1136 version: '0.3',
1137 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1138 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1139 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1140 }
1141 }
1142 },
1143 '5d2b04a29a8af43562b1e307c416d9590ff55e370d9b542dc1e58c1e30127359': {
1144 data: 'a9CEtLuWMZGaIsOUVOpZ8I5u1X1BUdsCkAMDqZpa/xwgIlvFZop/tTGZ7xXqfLuGw8oBgME3odWfSwysYqFlLyLxvvHHFdc5eWEi4ZUUDRMsfl840zFZjXO+GgrLVpQDph7Uvrnsd4X0BUq5WyKDuLwLujZOS00DZRrrEaim5fHUMJFceA==',
1145 version: '0.3',
1146 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1147 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1148 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1149 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
1150 versions: {
1151 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
1152 header: '####',
1153 data: 'CGP/3gax94oP9EMpcFw7ZhWUzIp2DcqDW7CVRblVwQg2UpsWe1K1fvsrzyGC0DTM6yAUXLhSP4T3qyHjb8rrsQCNPr87R1a91xQgWVB+zluCbXH/ZfmQrYd5tY/OEo2e8UosOQL9qieRsDuGbRd/76iIysR/Ce4vGyfYohjKzYepZvq4x+uIwe4uKbzn5YedPqsJ92WTGK5rYIN9fGzPOQMfm8nOkhMLXocEm53Nh5cbBYCw8SGxxDBKRPn3g5z1jLCiOJ5i2KrVQUwIa8LdLPfEBN0FFJEj6Ri8NT9AWzpITZ4xovTomdIdSEvypXYHnkfBw9OWn4KPZIQ8liLtYd6oo3rkkWBZppjaLk5oBkKsxBNSy2gGnh5Eig9HPQYjvwPF7gvG/nunSm0nwkreCMQUzGUd4lLNVdp4dhYErGhsOLb8Rif6BVgxlDccXaIr4Ui5MLrS2vBiO/UmyuYFEduU+7eXuXR0uT6oib5f3cRKFaJNT8IyBiPlvVkEmG3gHZJBXW8yk8fuL2paGC6J5Qp34bkOqDW8BbM0Jf7+CcZURZcW2RpjU1UW9KWX/ga8Z5uNL2282K9C6cZWdw0yeFHsAOitp24xOIJkeyuRnhkpkbGz525htXrzXdwulVSqT4KiZDCVbgMh06k14f67HfYBoJAvLW7thG997HSWQlaxBz40vyjKD83rS1JvJZDLCKTR2VSb5skaAP1ye6CMbsYojZ3Q9/xVdVfW7jQ6nzjT7O2hqhIuIBezJCCvYdZcK2oWY3jW7S497wh/OveqniATyIk5YzIKGteIIhP2lPQ9utTInFzSwQN7LY+pDhCjNT3H8jGZuJFLq08NWTL5AnIS7DEXUITQ10+b9F/DXrM9zt0A2ELKReie/eVeHGGkgrO4ftR3S1RA/X9w4caDjG1vFxGwzFVU+a4TgxnMWwQlaKiCNhm2phgLH9Lxrv8KL6X6Pi/scV3hz+AXvLbiVGMbs1jk0VS5VHV/+Xh58kVcJFhUFl9n+ELDh5byUiOSBfYBaCvUvawkP/OGi+NZeoWckAY9dvvo+Joz8YpA0sQsUDYNNjw9PO++h55HdKOEQYHW0cBR+0PQWgtuARDEcHH8nGHdZd1+0quNJAeUWTKopX+C5cgJ4ST1iPHtnMVYPFQsnZkS7UGS8LVUJbeIYR+b/2rB7H5fzew=',
1154 version: '0.3',
1155 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1156 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1157 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1158 }
1159 }
1160 },
1161 '608adeba618077d125f0b489ef28fc7e3b1ba4fc2baeb01a3a1fc5f568578791': {
1162 data: 'Mb51dELDLMqkQbUrpOZOTFvi90inlkadvljkbKY2flQCxQzyb1OwdZhj+quCah8RjXNKUGR2UMieW0whcLLqDM4KcICsPutmHnXgw9oGuFboPKqtznujC3pvZED8+W2sBXpyq/lGWdSM8TAjoMmY3r+VR0W6tYvtpOBYiwBsz8MJfpC6zJLEwzd0ElqnpGUCIZOBMCAUZ5KO1DpHhm/o49mKmSXks9Ilh6drS1E8IWpTrGknqiV48wQjdL+o1H4/40wq93D8rgvEIQczlHz6klMSyk6yWHLMhAuTd4k2ZYFsbCOtW7ixzFN/QNo9faJZ051C5RP6srlPgXSQA4lRwm5qWBSth5GmGmelBYt93d2aYF86z/fkjE4hNTRH1wJdh233dBJfh+3nCf9bdtdBs2b5DjkRTLZ/6kAgfdngti4+e6DiHX3NMA+FK/hbK9VnVr1YQOZSDH8NExthg8oWDK2WhiXUX//I8a+Oc3pR16kZHPJwJVJmhRSnE8DRH/mYO2VqV0rSnM3I+i/4DYiftAl/inLBVTIx4DE87skkywXSmBIgwKoU5ekZNgPwU83VADTVXO2vlwgNlA31mmB9f++z6zNdC4gdPEiPn7imwKRGKl/ofmqY87/nWQGqw13hts0sUmyQW70CCnNTL4aOXVay8LjrCHEbelz4Nx9Fy6Ba3pMEelpsM2wMQzuOkjN3JlmTTVV2yydZ19xDMDf9c8lNq7PsiRepEf8xXcGJtpeWXLVkw9h59G6e1RVmAxid5tS86uwnEs6c8z4idycMpvTpMCUPG/KEqYYQnD59wZEq2Ctr6cOocdPSUQ/HE4/+qY/9/949z59B+mDPVxcRAED/v65ohop1QIekq1BtDbrolf8rhXLFMv3JWZl27mwUr8+DgSLrrI+xk3v8mbASUKrSjp4RqFRB11kLdVC71JJz1RBKBvfKjsfG5cO5nDIS5hVkBJX1hXP9pvHYjyDEgSI2h9DgtZh9xXEDwMKITqI9jpTuGWNJMas1J3Ip46u0PG2aoLU1O6DLRgfutVDTyJBfNHdlkgBxydqsl5Sxhmjy7SPwk3xmxI1D6CLbCJ5ODf6x4CekWrFmF21IWfF/73oWr8+KAa6R14L9iTwnl0ynmo5MVa5IJBdn+Q==',
1163 version: '0.3',
1164 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1165 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1166 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1167 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
1168 versions: {
1169 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
1170 header: '####',
1171 data: 'nrV954wGGDHVx7+ovlm+4b2zB7TcjxIfXBsMCBUr0LgE8G+zEd5oj3Zc2MvOz9mLaYH/Bu9d0ecN+E5qFeDyRYbVgCH/EVijYemXpXnQH8bCcx4Ek2OeguqkhFNjLubQKRC38rOcWgKDXL3fa8YEyXQpdfWE8g9X1vCshxVOXN4LR0L5bYX2QP0mmoiFOY1Bqr6cYtCAGZNDtfe43Gi53q3FVOnOUhIYy8qrPet1gcdgVbmLs5DufjMdylXd9Q9rUVZCEwzsORAGLAkk7nWNqL9BtYquz6fK5/z4BwRkEztlkIDrhjEwWGjRujbmDD1/5RgKG9Ztbw3LBMkyhabPlYpO6io5545qndV+x+N0YvhECiZdaBr77KUAWVIH3O8EIeAwyvNGKKmTbHox2h5k8nWC',
1172 version: '0.3',
1173 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1174 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1175 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1176 }
1177 }
1178 },
1179 '6a17bd6b1bd576b99b678dfdac7da04e79402fc542055197017d3e586f6e8f38': {
1180 data: 'BNaqOx4gozG6ehd386VaVAqr4Gon3oCztTSRSMdZ/HskNFQfRme+BKhMHljLFq732lVDYW13jEcx2Z3h2PQT3Bm5+v2Ke3aSSlvyIfvIiPUl7PbaaImKg19wnAaZqhxheSwVUHmBIbfhCt7UbTP3imEKl35fXcbYIOrWiea/uOy+xwcIbC9YkkRyrrk4ttFExRuZfnk8L6xfglyY9xlZak2OClqLK91l0xUfz/Ol4ylpQxWhmwiJVMkyL+S3Ild0A+CyuxmekcsgzSyx4OS7X7uc9u1SeWjB/mSAzQh+YsZis2J+hFLavUTzWUYWaKUbHcQjFQLHD3ZEoZEoB8iqY6ogeNIkrV22VVHlcBm4QDEhijApnte7OaE1kXLesCABKiS3tWwymSpLy6TMXx/Md4XSY9A+EvLLgUjkgpHq3ftMQRflNvLYlEfYJYXCoAzo36pHymVp+uIN5BR54BdNr2DbfBHKZtGUGQ5+EcnEhPpvoMnLcf59IK7C99kNJ0fLzEfBO6lvGKfG4WfO8AaVDo8sonaJCCMEdMUDKmNXlBsbZegXWotZLdIbZqN1m9OtEt6ey5PAVqR9nvHL0wHX006P2b1092Rv5fTfaltztpXDsJZNttqWP8U2vkZqYPvSBu3jdCdY4Gkjnea47TzTnPX10EdFcE2r0h1G4ap8mSgiC46j6Wuzj5IhylgL4fbmsPfNvtRQB8jlW5Btf+i13Ed79W8YnzyYbgcF02GR5AFlXBMfvZ1Ve9QETFnSDJNRLcPNNpslNVyQITBlPjfDn3NSgIVdUs0EMDsDIQrMvKHpsWuiXnt0sKrRBJ+MthJh2bD6jSSYB/f71OOWT1t+i/wDZ3gJisRR+KxZiCTt+y4zygjOiUH65BcljjTnEv+XzVci5N/C9SFyT9O0Lxb3/dNSVJLKcpQGCOz4pgM06NFQFePJ2dr8az9pjCWRwuGzhpRsBsqyOufX3QFveABvRDeaEyNWOWuCpnUMaNXy9YdfODWFQa0Snff7tDD/fG0ipAY4s0/fy7IZWd+pvgayBouKlt57JcVU6K3TMvE=',
1181 version: '0.3',
1182 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1183 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1184 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1185 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
1186 versions: {
1187 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
1188 header: '####',
1189 data: 'ihfKoU9bJ1HxBWuZ+wyKaK9n8PPx1MJMB6dppZniB5tnfUvnUf9PPA78x3moJRcJ7fVXl/rNHWv9Sqnf3wggFD1iuDFCbxXAY49qrWEdXWFyGM4cihTlWQBYZu+cMWQrdi7dZPUY/lLltKTSRKplyVUmqfG04yd1qCzmiSJtzKUaIySXkQGX6oxoeOMpw3eVaKJjrIgikmjfxE8f43HNpCPG0TYq4CNmvZENZ1z2itRtgIUSdwEaH/xK49ztqxJPrbeXxTBUKIZ/toE79okotm0AysfZdlG35PT9eC/hzttdfBPwqb7auj6J3ttc7DWkFrKWEemw0dHZYL0ut+pdodcvWLLrP1Gyo9aJwfE5heImchRbGal2BTUiyZO9zALdsqjRvMYSyHfxtBUDAggWL6OA',
1190 version: '0.3',
1191 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1192 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1193 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1194 }
1195 }
1196 },
1197 '6b147cfb119d690204cebb33ac047861a74504c87501432d914e07008ff3cc3a': {
1198 data: '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',
1199 version: '0.3',
1200 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1201 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1202 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1203 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
1204 versions: {
1205 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
1206 header: '####',
1207 data: 'dn15LeaR9HinK07oo1yVaKS5SgM9SN4jjB5psuvJWV77JPSXYngldFuC16IsKzrkMuRg7MUhdjRuxYxRnTla3FIzWyuwfF5XYHM/AlHMbp/K30yDk12+UtSAEe1r8bUg5ra2KOhZ2pGTxQi57qWKkVkKvnmxeQa/LuggfC8PmlYQpC/8acTPxoy5hiVmHsxO7yoTl5PHrIee88kgLiavSsKRMMHt/zIWoI7liVcPV3xqVBrlAoOgtATNdqfk3YF4N7Wokyx5sDDOlxCXYSoQkHfTNVxL6la+tHcE6pC6OezbwSagB67ysJ7P8ek2kTNfzG+/smdxq+iolTlAbJ//MtdBEDOAlfsc6nXXo8N3OjGNaOActaMP/EiQUD2NT5L/JOQw3zM5lJidNcP3urT3PxQ=',
1208 version: '0.3',
1209 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1210 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1211 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1212 }
1213 }
1214 },
1215 '97291f9d95cd97d089f940e5a4a674b7c33b06637337d3722010b528ab1fe34a': {
1216 data: 'JY35iFwT0aSVy9r/b2tHFmaOC/AaNieghwPqz+PzMgu82k1WdeKZzpIZWBf7ku0VXUf1pOYRwUVM7AblkFxlnNT2LZeLZojwIAneSZIBRExaLaRpZqQEdqNYUr6tVayAdgB52ObXBArwrNRMSFkZHicGjjvoOI9WS9G+dhlPaY81yW5yQhmJmu64JebF/c2HljkBj+3hXI4utRggddaDKpOerSw3PHpbJ0dPSeH+EIWG+3cWCO5Z4BVkmm/wQZG8wu7ymWdxE1Njm83XiTSLGxc2YB4Tl72WRe7ekmobFGM1BRzf6VzmBKOFzJb5SBXCi5XdGumv1GgtJEIr2N4zRJMoVDTu9qSzF41mFKbuGaldMuVI1pTsDTWAOFYq9ntuFoNWEGucWOeFZZQQTvwzdAq0LLp8/A3qEc5Xkf6Kge9kkG34kCkVcxAKhuGWjxUVWdmLSAHKNR8hgipKGhLRoUVxJ5kLFvm/7BNXFqsKdZckFzHXfQcemFoPKDcqhuGVrRhPQ2VG4oUJTJ1ZjtQsUwJPHr8LNBvD93gHJetF4DtKwercWBmlPTAx60esw8oilgJJoU/u3SnoRa/zQdJskPjRvn55C6Kbp93GGszhiUNTL+SbyxeZOyfISLj5xyVEXCJwWOynzITQfrU4ReoWUAlhk+LwnAbnJ9rEqVPkjbA9cB+gXj2iM5EDLT9yaiMlNmiPtrq/sh0w/VV70Czgzw+JMZ7efvcTP6Q7jKEEDDF+oaj/x456gjeb1ckkK5dkTVk7AXMFAwfjfIrrPMpC1CEa5h5bwJhpqVe16IU8f7Nb1pnGvd0l8VGUAAavrHXJEePqTkR+vY6I0hriFuXTaMbnCoJW70lW/FQao7SzxOdybymL1pWPs5bVoUaX+zrvBKQr763+dm9gSBhGtpngZ2lQxmO5AjfRuv2rG/SPZsFYhTE4JKJIKEdYT96FOKqgQUQrs1MLppYH4BTqgKwjMUGoTWGJkfF7LfEgbOwly/ZGLIgCD+fk0u9a9DfRB4dIy7wstU6MN48nd5zz6GqLFCrf8wtrN1yEpI1QqjVvNv5bzuugJlnT8WfU6m2ppKBmNlgZVhYc0Va/90ybcvQDLPVVBTnjYydlgE5z86VfMREn3/5+DgsXVXS3QwXuWxjYktYsg2ts0QvzCIMCk62pAx9LVM5tn93lm+RNg1y4EUiDTbF+NqYDCLu5Ea/0GXmaHLYqu9X6z5/jPUq+EgMn52L4WsRyZabiPgxCvXjpntPJdP5XeQ5i4ACOFhUwFFRAxWPWVWv6ecL29f5WoyfXBsPM5HOSa5eXVz89Uk0v58msbf1sxkOjjzSXQOB/hUrkSt5ZlMpVfWye+6uBelHCWWfivMi+S4tveDJgDbssnagE8EDDZxIYuYhYUGfbUjhnvKuChAWw0K91ZtRDESFMpRlgBAFCwxgI2KoDz5yFWNckPA2ki1+VR6Rxd2z2+ihu4uI1qtZdzSC58PHlBFjeZKFzZPABfttlZ6t+qijg88Vo8fLLxakwhb2kJ9Fs3I3zqqnLYfkvfCw0/ZbwC5fH/5Ey9WiIaPJBjW6e6to4NJcy7pEAJVKRsCpfP80D3+LBzoCFGrdMmhwymWvi7xlG8oZPYkJrvhvW46D2apRdqAKJrfLn+oX1fCtkfagH1bJ2o0a9J+ckG4yTtoxBfkxSJ0cCErkQE1xU6ADCd8+p+2Mm1Ls3p31+Ynr8CSGR7+ITZMjMysnIc9J97DrI93Trab1mOp/T9zOM09woCbopg7IYNQxRlcmpH/vZozmGWHBWGHAvl/+ey9FDwG1t9BXf8kYGlwg=',
1217 version: '0.3',
1218 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1219 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1220 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1221 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
1222 versions: {
1223 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
1224 header: '####',
1225 data: 'a4+XW+nJaw10sl9INOIl+MBO6mRdwmGZUW/BRTvcj/PlpVA0vCE7pT4JgdX3IwrF1JTk2KaGHKqzKGf8ydUiDL0p60R70BiVmQlony3kmi5XNCZ6+Efh+EGtM+4LNQ+2jojnUuF4xKRk729VMV1z7b17SiuQzcHwkecBgYxZ2Swm1SJaia4c0tk46pzsAKVrWVOuadtemhcJvHnYaQ0I2bnUEtct1wYldSI0DPkIuaI/0+xDn9jx1nk/HEu3p6cgMnS2vSN1/9jXYf1cDsrI1+yuO8lFClx34kU2mXCjDgFZGhljkgU1HJfeMufqyJ4bYPQfTL8/5NwFNNhw3HVFsrcWKcbct6bM0Puc5bFA0cSMCVx+61ONXqtkKHy9NPdvl4po3+TOmtXjooSOgQU2hg==',
1226 version: '0.3',
1227 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1228 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1229 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1230 }
1231 }
1232 },
1233 '98af9721614f0d2f03d89ea5eb8930b7f1bee6a55a8e81f0eabe964016a930e3': {
1234 data: '0ZJHKdh904kbB848o2+gi5KMfQ5p5c1FeE4PZrZHhIyDl13DnxFFu1vm1t1OI3g89YGQejU0vzT3+d80MoO46ItdAX63V7exVFkZDnkozjL3Pjo0iksDuz1nAHxHGMSoixIKK4WcnvqMWaMdMk8LTCl6EZES3aHaqjZ2ywROgNBj2exGBw==',
1235 version: '0.3',
1236 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1237 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1238 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1239 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
1240 versions: {
1241 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
1242 header: '####',
1243 data: 'iumHWw8KQNnhFThhMLBzHEJFZ7y53CqAwEn4DVn1PYVKpaMxjtBHa46XDDA3qliCbqLzPzDKllL/7HHJZcxxjyFMY/vV9p6YsZ7F9tVaF1cCQrCWdM52LDnKrmNEH4iT7VzJ96qsro1osgGwKwIucSSi1FkhWOFtOQhESWIS9TVrFo/yQj54z3x6k4juXyeLN5yDrgieypbvN3nsTOCyjIfjpaAw6ztcEOo/8R6/+mKEAej/eVs=',
1244 version: '0.3',
1245 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1246 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1247 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1248 }
1249 }
1250 },
1251 '9ea260fcadc1ae2bbb8545c32035dc55499f715d005fbec71179600b50aa907a': {
1252 data: 'WQE2bjUwhJOc4e1OTFI4xKTDRNIaJ/QS+OGszIo2GxP48UVsjMts3M5TtglFfgUmXPt2B0S4Fw5zALIs1r4o1xfqTuhvlZ62VpzgkMsE9Vl0fQsZawK6a8oKErwAoacZqkdALXGjaOYSP410tAcFIhUvsBmRWZIs02EOV0DMqCe1fYSkNg==',
1253 version: '0.3',
1254 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1255 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1256 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1257 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
1258 versions: {
1259 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
1260 header: '####',
1261 data: 'VsZfs03f+Lm4zyHzyLstuhqWX2f3fDjw56HA1EvhFAPrTK6uM7pvXvseuNGT7oL40wJQWjLuJgDZ56NrXNDfoz4BUNpcrSaJ2bUQS0ZDjmoOODrLM1hFmd/gzsdpx70M/b68BEqVbHCf0Z53TOsLXaFZmAebMvbrLMXkAIYP4wrhbLa7qNaEnj7qUaV/+q9CysfaOKpRomaj3i3F3/kohJL4NdNsZ/N7qzY9/pQHFaZT/GEPvZbiRr5tGb0oJLMG3zsHKrmsZHh3kpHScyfxqWFzm85ZRAEx6eOjXlfAZey8QgZyLVmRsVsDyIRhIePHCuMukRokohDjKwlQi2k6eVXHSaEEAo6jbK2a6LgbbQ1uPNf7ay9WtxaCcGCh9qBZJ7Ndq5g746AN5VzqyUc0swstRFOn9FjB99sAenhpqzo1z0Ddfb3reiUmNuXoETlHlA8SYfb5TCVoHfw7lgV8ikv4nXW7eEAxYeB03VWBuZPFKzlI4k3tWLHGytNThQ3ZGhcH5/Fi4dKRJgtzgWAJdwX1qgP6+Gcu3DDcrzcrIXFWVtsZtFgwvS5acy6hBha1gN/EapZoidoiIIkh',
1262 version: '0.3',
1263 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1264 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1265 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1266 }
1267 }
1268 },
1269 'a92c1ab3df0677f63da3cd1fdcec440fe3763e072e1035f8455672a97344a6bd': {
1270 data: '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',
1271 version: '0.3',
1272 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1273 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1274 accessDate: 'Thu Jun 04 12:59:02 CEST 2009',
1275 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
1276 versions: {
1277 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
1278 header: '####',
1279 data: 'EkK8xSZRZAvE63intN3FTaRKNhNqZbu/5L94kE50wy/OdmBmYk+TVYe5WmrHxrJC+9c8g9Da7vQdH7vbBWwlLpbuPtMUDUxZgBQHdADAxN3OKrTbf0ZXLVgWtm1D/OBgVQCCKiLKPjujFSs5Kp2Azjnm5W9gLnYmktVhRYY8Y7hklX6AMyF/cTw1k2HdmNZ87+YGKZCUcDhDr77a6m5hhknxUXOEXaeKlL/Yn4QudgCJdhtbkxifB2GPl9qal9DOsiFJwg169weucHUy7q64vMFEc9RZbbJTpH7g9qGXELb7VtjaKv7A2N72FOt8WdJux3nsgBrAkZd3oIPAGr2KWSg2bxbJ5MU9Wb/LyTXIJQb5z/0UtF4dlavW2MFKBGg9vIU2fMukOq1YWKwZ1TjG6GmO',
1280 version: '0.3',
1281 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1282 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1283 accessDate: 'Thu Jun 04 12:59:02 CEST 2009'
1284 }
1285 }
1286 },
1287 'aa5a54aeeb4f7926e4d0b469207812e5384a4e00acfe9248dee45e939dc58b42': {
1288 data: 'cGK0775KN6QUhzU2QD7wFYwTffs1nZ0wd2otvljnUs8q7pzmnA9XFQNkvuqjh0WseVZdqGLfUYrrh2UUhMSpKec0tKEmrNqijP/7LYiSBte0Tlg9OXzIqvdhFEtDO/WC3do4rYnfpc0pJolE+I9J249MrCbSXyQV8hDeD7IRFJ53',
1289 version: '0.3',
1290 creationDate: 'Thu Jun 04 11:27:25 CEST 2009',
1291 updateDate: 'Thu Jun 04 11:27:25 CEST 2009',
1292 accessDate: 'Thu Jun 04 12:55:14 CEST 2009',
1293 currentVersion: '64182e6e8c2c3410ee0e30050d0423af5c88c5c53600aac101fafba9debec99f',
1294 versions: {
1295 '64182e6e8c2c3410ee0e30050d0423af5c88c5c53600aac101fafba9debec99f': {
1296 header: '####',
1297 data: 'UzVgxfbPpCV4VW8nfK5AtzyKlFUQs1MXW928M0cWqPzQeA9t0+oRS60ZTvDdMjqWzM1Qs0mOhi7wdLdOoZbbT0wUgeU28IMpICZy0Jy+ezjjQxRnC8O5yPQJgg+fNrUbtn5BWMonPVWC2hb1wyEsIJyTBt7i3JsxVsPzQ18M1lyRZBwa2z0QWRZiUF6aacNf2GFXhCkycacNztQVnMlq2f7AXPAF25l9ZQIO5VViBZnbXwIyFbrmP2xJX0Xpp7Sspt3sPwWzg1BpTyjl/P8tDHA0+fe/iPhLGNk2omBko+rPlUwBymvh/t9G4PBNhuHTpEfHW1bGQ5RHGLGLJsBfpNuWALeAfioRakynNpGaCaUhxKOysTyH7BcGyDbh+QxyBkX7ITNRQg0lfNkA1PMRGnREph2g+Tclizgr0eawTstTl1qma4qYKEb2egtyABuvhi/q7ltK55VQOLO51VOY4cJQiwSXnk56FXFEaLS7Kra6zc85xJY1ZP+T9CZmmd1E/W2TMQ==',
1298 version: '0.3',
1299 creationDate: 'Thu Jun 04 11:27:25 CEST 2009',
1300 updateDate: 'Thu Jun 04 11:27:25 CEST 2009',
1301 accessDate: 'Thu Jun 04 12:55:14 CEST 2009'
1302 }
1303 }
1304 },
1305 'c0e76e60e08faa3ffa9d859ed869ba3cf3b42becc9478d45ac94cae6c004cc24': {
1306 data: 'yEGo5WUC1jnPQRqAmksQH5Ph0ChNdS58uolzBds2+KFBNZinqbzr8OQgBax4/zN+lqLJkvHbsV9/dhPzCfGHV0Q3q6VwZt6R7n8b4V0F+IYvq1sbv3THahwk7icZcrJi9TjaAKp2w9IBJ/uf+rWoZKegmZXnF8cjq10btOk5JVkVVSaKb2c/v3CLYYz74PEb4ImMVSzNxWTy44w+YOIWpL4IMaq2nWpULIkulV0UAZLOudf38cEu9Zb6T9yGZPrACSjlANW1UhtfH5KosUMhMRlbyAWDD/CTF58Smkf/u7kzyCH8E/W7BE1C89GhWjaMwQq2VAubJ9VAE2CAJG1ax23/ZXoUgk4oK7ReY+J0QbyuHnJDIN2FhRLZt08MD0TujA4xyg/Hp9S6F8cd2hV+BFVIAb2/jXCH2OqvQ4pq93DWF375P63uC7/uz3j7+jYXOmggtfd0IX+d7uSG9V7FX064dl7xJzggSwnkBXAsuSwiQjFDB+jPpTY2k/F5+UgIVEzdR4CPMmaEc+Ied16XVTr6nXzqK1zLRwmCbeCL1ZrahmZqhqJQsV0Z66wQS6pBr6dA9YSkTCzH3lgBg/YSmNeKaaPmwD1oSoqVwkzHigdUO8lwzyvuMqZZdk42KVO/QPC8ex92dvzwvSoeW7EVNzP5fSymd6pmO3d7sdWCnzEQCWP5ADfZBrH3YH1oLY9UzaBGiLLemM3TBZfBZ3u7k68y5QnCfuHtL4Y+IEcgtOUtAe/XErIaSZjjwfw8mfrPjQ95XA3841UYNCtoLMPTGR3rRSj/Jluh6MHJc7CpTOgcgbi5VKqOIrHL88Qs1tNK3wBA8u6RhIG6B0I4lfPTE7Jq+FYDyoeNf2qGqd10XnwHi0GSoCisi4NFawaric7GmVMuQOJsJK2HVFJ5W6e+IhShN4uWQmlFpyifOd+91tMrJ7uovviHkJwcg5ROVTk5yiihGByRUmFVU0W1Azb/CWiQp3QiFKSyHq+uQKUR9gPN1WpaYupSnp4+1tJclgdeMwsQeE40qFxQbBDZynqWeSFovPHXxhiu7xjkLGHlF0QJGMXaMca0RIr9XiQKSlQ6FrzpKnFzmOPh0LnUDhd8FGuMPgHhZ8L79Utablh9GtrJd1kWzSiUKpIQoZm78Sbls9wyc1LHK6eUAYwB6A==',
1307 version: '0.3',
1308 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1309 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1310 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1311 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
1312 versions: {
1313 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
1314 header: '####',
1315 data: 'k7I09dmz+LypgSeYrYH3JQGD5Mikr1YV58akOGEn2Kmi3t3n2ngvDB1+cv9hjREPUiGIi50ZQJQw5pt6eY6jOD4aCgGjBqHYNS5gfbaW9dHhjXRPu2e3yhMm+YIlAaF005zecnB67RD7POLfhRx6qjLtqktUt4mAotz3ts/nUmHW45psLPLVBlpmeTNAaSz3nXubkoyfpGrotGGEQCndB57L5Z2popMAdEhT2mVQqzzpasOQnp4PJVf+1vfrQ/9AP6ublijutHn1Oj/HsBmrwE2YQpj2wpZlGAFdghKBgtrvLMk7dsIdDuK0MIQoDmgNPwgiF5NNmG3hoNhS/WNls7uozBNMYFa+W8IzP3e442zJINdGs9zDpEVWZfC35OX4F6QKGSeoHDBkpB7aWAXfnkKz9owt+8OEVEQ=',
1316 version: '0.3',
1317 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1318 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1319 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1320 }
1321 }
1322 },
1323 'c742849667f8001483c1e6d3d388ae9d02a2e3561a1be7b1866b62a356b72b91': {
1324 data: 'sk0Rq438xMuzxfEwjPhlg1WxN7Hyrs6VW0wFLQBB3m/tNK9DsHpswq2eMRqKv1S1q/MFTyx7/Q8YVxRMkqKWIgUQRe0g/arWR3iHP09t5JMFIEqxIbCSotukZBgy5aXlG1WMnEsT+tIqrmJZzpOUy768JpkJjJxdr2dlGeCUJbO4bitAySOvpUoRlCb2/a6D5Cib4NU3fjzrW+TZyQB7WpspAfxxyg2zTU43D74OAJR/wy7K3Tp7hOl9cXmUoHvM3vp52ENvPdZmy6wAbz5d5Iu8KL1mxwGbl0pxx7dDecbMJOO/OjHwH2/me+DhyVTmv5smb37X90fwZRt61mn3A66ECsp3nq6pRZaaS+U9WRC1UAVifc6T4DWqrrma8D1BGnLeR9lQxJj7Jm4foKvnWqSeurdRNOyZ38XK5SBSZd/FEalS0UwawX/5qJhwdK2pQRvrTyDDrXRSNj3ssuB+3YX6l0lxacUO29wFjmkh2WljCkDBYPNKOVRLBLUtgQ1pWKciy8BlH4GsqdjvkcQorRgfgS5L0Ce2bHWbBsy5X2LReW6Ugst2wt7Q4xS75P1qF7202s89jQVQritexaUwbCibrZ0GFZFfwnDT+JjKiNiB0WvDBO9tdbqzCA7T62+wUOtCX40tQc6+4mBQkkU+mi6PfsInGiafKctrp1d7GMQHJWQHIJhx2LUvyqPxOa0hE2vqCSJUZmNVD1KzMYGguPtHbuHHaWXc1cNTjQuuTyXDuewBl4NnTgTki43J/lVt0VLuoLIEQx58y1rMTVDTiEufA62mmLxokLYyt6VLb+OeprhuYiU0PhkgkDjRstSnRE4B5JsvFcPdYENYJwRYbC8Ho/rnAvfBdGlYw0TGS0MFcd54JoXiE+oVVRDuYTVfm9ytGYkG45Z5uX0D3Qm+KZhGAd2gQ+NX6umxy0v7RHwqtUjSqI4U0SOiVRNdwFesQRFAzZDtr1tKNf56ACLt/yXl1GywrHljtr4BlQ0Nym3upNweQZyO19O3kaQmtbTbp1Tg+xewXr2MZ2U2QQRNrCzVeqe29eHU9133xo+97NxGi/HDZ5tr5aUTB+OXqnoIzSeqyHLIv4t6r8D29+MTfZsf4sNC7vNlpO8+GLYr/0S5md9Z/zlx/2iPeAPnNkf95gkav+6U8F3nL1Ok8MUG6drGrduKyv30CGDEwWJqcDFJqOZjs8reCst6S1ijRhwm93fqkg+nzqw8mZYeltSbTXFmpypD20Ravw2JdJUyo3umyZiyPaL9UsCFSf/ssO47C1HTN+OkRtMcTAyKEqhzvUei/JHaOvRhmMCam65+gKuoCwy/x7Si/oRrQ8lZkF8=',
1325 version: '0.3',
1326 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1327 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1328 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1329 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
1330 versions: {
1331 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
1332 header: '####',
1333 data: 'bGK0B/s932NBepXEWJJC9i15cPn1iy44m2xFxohFQ1r2Wz4dKsy1JowXHssezfU29ge34tx7PqbJM+o6ExNVkgufb0tynMeQAyPcoV7jSnxCqBUfupTWndRq6YHkG9xdsLLrrbmmRwV7fIr8Xu6PGUbCs23sDFW25tiLDtps9VqFNb8jBQ4ms56rjtDVsL/VqBBI0koojN/e9JZr0/3Wv90a1qn3Uz0hRJnryCPuoDBmcLFdlNcd0W8I/8SGJa/94V2S4QOJD0KqP1+/jYA6p054V/tRnDlFdkV5G8vm0XqI1t5cehSV/2Prq3fGj2UaAs25C2WU0xAHPKJErzy214WztzCd9vqINx+DtPEewS0QcVvnqnC4kBMhGWKUqkJBySSQ0nHvkJrBOjeratc=',
1334 version: '0.3',
1335 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1336 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1337 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1338 }
1339 }
1340 },
1341 'cdc4624c921b8d99918c3cab5264b5e6de39df30ed167f504bc0a2c612404d5d': {
1342 data: 'MVUf8enllOr1nuCWegNFBnC0YrydNpddm5VZzlT/xJY1YvqIcYnr9HKk4i55TIdA5zjcf5TqUdwBUJ+LbsaGA3CH9YBz6AqAxt0mQeTaS8ufyXDzxHthmTKcsKjPEuJ+1R288jz2D7Lc24+YDNrAySXWg2i3+mJNIFU/Sg7+rLiGpcvB1go4zlh0rsZbM7AnIcCRM5GQLVxtVn15xC4fDZ3rQDu2A3GNB0+RFB4xZlGFIidr5ZmUc+3/0eSdMWb57xRdCaxESjWQbGkDF6OpsozPVuXEqd7K/6RnHAjVsTWvLGtCGttznrCcaXquy1xwUr2LGnqLSu/+Jp7hnZhkGGrFxMFui8WyiVhpTxr1YkB8X/S8lTvsgsUg96PGgVlWK0XeW0GvWgo+v+6RyX4mChoTO5lzIUQuTivve8OH9RHY8YwUJeiY+Pg5ih4TpsGULQRZBIXrmWGdBA8euFSu/mPYuBZ6j0+wD5monR7pvrIf3kEQx2g0N8tdKmN0W8iYV80ONMWqwP2rnbBYHbHE8cljP624xO4fXWoMYlufyCmQp5Y7f7ugw7kWO1gYsMgY0e1pZ28U2RQsTFNLXuLgbeOPz8bpsm0lTFec+WwZ/yMTXFfaz+hFKc60sUADKO6ax24pnUId9+ih4J1DBT9IfUadXcqKN76nVWl7/iApOu/F9kMLK8AtxpSpTDVEZTcS2RhdyvVisx2vqDR34JSP4Ju7qaLIxOlMrc9DVTrz/yMzqwjjefS+w9IJvuwz2ikCW/m6PesRwTao4K0TONJE0aX0xQ19NfYJbNU9Xfs4IFyr8c755UeUA8dK15P7hgf3E6A+pBTj79a3B2SfKh16jOukNsdAVbZkJcc8m0ABR1azzNY/zr8MnHjpZuhhFFnqtxoQYi2si4Gln6Qh0uLwTN4557Igh2W0WcZKSAo2wqfgTx7iRkXz2J1BAbdaN1wmgLZKfljq14H+YGOiqhHndM3UV5VCez1tpA5eHDZyEtMIyalMbTvGRoQ2b0dC4idO4Ec9CoeYwjRZLS6wGG63N8RBdOK1RQeW6hbOrgJIQiGyZ7e34OAi7kSwC65f0Q7SOdg1JJVLgUPh9vfCkFyGEF5OFUNDR+C7Whosvvuijl4hKurZj1KzxoZIAl1IY7C+GiAL0FmaTqEiQVjjz0xf4UHqKw0qEwCqXosbhuwzhmV0EtfNRbWEj5yOt9MyXnIdEAgmer+uEP6OYJTtPx1M16KFl4r9BZ+2h7NdAkrBbkuhiq0VZvBifkinOwe/P6zo6mI0NVmLAWrAO8ZaldY2Ih/Px75C6g2u/zA+2U8k6283cQFt+E0b2qNdUcqR6sxz7gu5Ym6Ssf3+8x7KHrlsXoClcuuv2MO6De7GhRbf7+fC4IlMuw4YwRS0MIFg+nVMV4xyCAVn8z5jl0yngSt2wjdrLooDa2IRKIpxhSreVdsttCtiN0pq4ws+QTsg7PTUf3zAgVoIfuC7CuTr0fCEtYpZxhey7cuvhwtbdcANAc23OoedjS3o2z0vy9/dnEA93vbVmJ7cTztPOZA6kKKfhaWBMZDzoNbkLU7ebzqv5bpgY1/aKYLVJxUST34ZiWigna8nfBS8nnR6N0nKpslE4uPv1oQgSGTtl3A7e+xX8htlIzDxLIblQjZcZgdtZVRSmUW5/NLraF6Fceo+FZcgxiO7+0h5ychXL+HkT81DCbRMchmTOA==',
1343 version: '0.3',
1344 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1345 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1346 accessDate: 'Thu Jun 04 11:22:56 CEST 2009',
1347 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
1348 versions: {
1349 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
1350 header: '####',
1351 data: 'wRPWbH+Dw3y0DuWz0YDL/e5zTQukx6++cLlCY/0Fp1J2qZS6i6/CLhQrZdOLtXfEhgzkxQygcYGMCyz8wDILafKNIAoS2BcuNi9RbbA9tKXDeqINcnYdzA2NDWj1tQDoNU+/KssWdkI0VFSr+A/EpLMfa+Kqw4SMqNVbeEAUT2Nkyas+eyRVu2iLNV0bFzxzbXvHu0XK7rqL1Tj1OxY25vvA/tVRI4jlzI/rcQZrfVB/BTqzEymFel4hDLu9d4UmZn6H8gubyAU5IiK1Jf6B8nZnNhs0JKUPEYwSXPk9tAupRjQxsac2XPyUQXkemT7TgZdFuzLYQxOAtUmYHhXyigzJRDRY4KPDJwcHq5bCw4OwBNzjhCm0uCQLmRpDIauPVf6EGNs0vorkdOW758bmUjMM4fwlULIocKfhreJrGiGbXTNW80h6SljKzXdlFZAYTSdsjmACL37xkgMJI93faHuGMQ3HuVqXuuebIV8Yg7dSZdWsEus/cQPnOXvVok9qwJ1L+wJs0darskaEN9CGOEAjky9iVoRLuKepjPWrSorvEitedjErBntX0ErI9JDTCdke2jO/2e97fGlrU9++k7T8RRScpxBKmXVHnYpqiesX4KtORnGQFrV0tHgoSiD+Q9YwBj3KSRdFh2eZ0t72ejqehhuR69AZqC9KvY2b7O4PDG//emeXLXMXuVcBawZGgwpOCeu0YunjdgcASADRPVTh0x6IGP6GQ50LoiG5hhiA4z8PRqJ+twcvZ8yJr7AOOTjyMyi00nXPG0OAG5Xg1sTzXtqTwj/xVWbzUEMFt0nxMSp+EVD/Zo7+bdDY20FKz82y2DabKFGAcmjuLTmmS1RaLExvtsZcB5QihhTEwEUSI6a094udE2n1dCz5ZA408BCMi78aHFna+pg8xLEJHLcLZ2XJigkF8r98XeA4fFjWUhfYEhIjclG2pIaSBaXqRT5QA/ziMe4OBTLKTHIp7K0=',
1352 version: '0.3',
1353 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1354 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1355 accessDate: 'Thu Jun 04 11:22:56 CEST 2009'
1356 }
1357 }
1358 },
1359 'de7ce7e545acd2739d5d2d00b04f889fec7acc2229082a7a678ca050e2fdd3a0': {
1360 data: 'l5j1yk5VXiXb+81T15uzjSwhxBdsAQ/JG73GNCGulKTA64NmN5SMxDL5gNV5AApu+p9AKKOThZNER9wQgDt05svLWN248YROu7PTsBJpHZYLt2JKlRDO/SOWHAhWkmHrufDs6omk8TpxVbIibsE9Whp4CjkAneGFpvzIJcdZDyWfsaFXKs/gC6O6mxYgU6dBtvMemorXCgSEwL/B3NF6OkudADJUZTIha7mjxa2eWQo901kwD2EKSvVyokcMdok7FyR4cXfs9K0TSOOYK4eQWrqE6wnt3Ab8OSO9oAdCFIUB/WUES3dF7zshLNFG4uh3G5NbTHYBoOrUY4rYOzx6gXWKgv+AiqsUYQGIphPm7GSs85s0eb9IiLNb0rQnrkX/Qeqorg3EIe0aRnWmAWtRWb61vClo1lLIJFWXbK/6DSecAfWrQmD0ExbJZbNQ6WjtVg7fSOul/VGOrbiG0QysCJI/D6Pt5nQcKf7Ooze67CsrYOnmF5oU6BPZHuyNPsaAFZR5TOZMlB1JASkk/dS5W9vgX02+xEYzT14ZLqTlMsgX5ibw69xxdrTcqsbHcfbGVn98FZMNHPhP+XP+ED8XllDomt1oUZEXU2cZg/s5QLFTYKbQIu2j8xgaDMmpAyzIKQtenpf4G0VMVa1T9lVApqmw+ILC31kOWwlEknQhey1ZMowCbfLMw9ipozGyNvG8QOoDQCyJ0nQJ7OBI0m4BDXJXIj3kz6LDrH2KJYu63JFaxGNFhbNDoMNhTdLyD7cBUps1++CgKNxcSezY2sWR6YS7OBW2wvy/X5yKIOtWg57I4vvcFQCs04EanIuViPik2CRbTSAUIiRvi8sbnqXYNT1PpBIPiQJvIbi8NSjrpTjPlEL5MJnIdjX6mjXbiwp4qWh129MvMZzF+Bann4BlJQwwGhba/X9d0K7pyOIQ605W1PeOjgzSPXE02wcemgF/tvFXSDtO4LOfiSCC04OkMtGTwcG5yMOzU3rhu64LdDknruYjTZ3W3AJitWixDj/ZEeseUCQbaJjMX8wsBFrPqbTWaC9MsztY0qM0w4o3lD35k0D3whK7zdfb0i1rgw4TRG+UaAy4iv/jxB9orqjS4CULzPDXZygYopwxRJowF4Sm2u8uk9/NEsuJcDmfHOh25UTnMO1HGSNRZt8lnA==',
1361 version: '0.3',
1362 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1363 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1364 accessDate: 'Thu Jun 04 11:31:01 CEST 2009',
1365 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
1366 versions: {
1367 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
1368 header: '####',
1369 data: 'zC2F75+cfQZXWJ5EquBKnCHqS1TekPWp4Z1KXd4166/CY7tcxfEzPtI/6QqkSdfPYesPgea8G5vOhTzd8yL6nIL0ksE7dTGLXx38wZTXrOftuiHKuxW2HLGE02WRtwWgvgc0v4nkG4mm7LIwX5XFSygGmG3fKfPwfLaRhayD4Jsf15r/zWmU6meVCvR3VAYvHgNqIeEOhzhVN/ZMZSZ3fb64CyDa8wc9KZpmbjg6s+x+80sriotYwYTq3CwiHqQyZOZDm3P7rhhbqy3EhyH5aTfroSBWgra3HuCzXAGFFog3S1zl+a1Mr2ZlmC/RxCiMVcHVQ9CluNU4fITebcxE3VdbcgcOzdY3O7U7cWFaCahk5y/momzFVstPsPQBhXfX6p3ofUTuHh1jj2OIRcvrWgYb',
1370 version: '0.3',
1371 creationDate: 'Thu Jun 04 11:22:56 CEST 2009',
1372 updateDate: 'Thu Jun 04 11:22:56 CEST 2009',
1373 accessDate: 'Thu Jun 04 11:31:01 CEST 2009'
1374 }
1375 }
1376 }
1377 }
1378 }
1379 }
1380 };}(),
1381
1382 //-------------------------------------------------------------------------
1383
1384 'joe_clipperz_offline_copy_with_multipleRecordVersions_data': function () { return {
1385 users:{
1386 'catchAllUser': function () { return {
1387 __masterkey_test_value__: 'masterkey',
1388 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
1389 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
1390 }; }(),
1391 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': function () { return {
1392 s: '95ae437caee9bfc2a2d716291c2d4bc7b6412072df45a1403182d65ab62818ad',
1393 v: '30cb1d4c26a4b93f9303685f2f08d32a109411044a1251ae3cf82e6032d18c0f',
1394 version: '0.2',
1395 maxNumberOfRecords: '100',
1396 userDetails: '{"records":{"index":{"2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e":"0","5931d708fcdd39af284d4809135393c81210a10b0e9d56b49b2f2a3b8adc9394":"1","0bfcbd6662f3771f114295df779a4e4535e8e666842c2336da1b095ca1def657":"2","2eff872ebb19c0f8430518847dafc819c0bf7e0cb714b456d74603c250f2efbf":"3","983f262760a45171a8dbaad13a7c87b8a3dd267d1cdba7850b07e58af0460378":"4","f8141d3cd5cf93f3ade420838f98e4bd0e5206d202b45a24822afc9099827c17":"5","25bc43a5f1aa780304bec9cf0cd61502f82243053b5f72a55712525b0b8290e3":"6","5ea084cfa5ce8198528f466e160862b4f17d0a4f63d3af45518c96413d16fe69":"7","b81f9a1d9267daf4afb786e8d477c15aa3e1babc59b8ba09bceddc700116ab0e":"8","d8568a483a8f443190ba723b391960554962760cd886b2484f2698816beec530":"9","42c7a17479baf21938c87af38ccc3ceb3aec21535c644f6c90496f89008f7828":"10","63e20b19028b7dd1465cdeeed60ca75b5f5508cd01601937ae8b0d1f981057fc":"11","7cda06249cfb102884a133952770b85d5442f8049db132d66f761deb765156bf":"12","166d907e97005cbb29efd1841757f7d1a57210ddb32605ccb6841f35f72399a6":"13","350a8d666e033ec01e203e0b6df730bec53124f9ab25f7942bd9378e4b5c01f6":"14","a0d5d8796793035d1b109654c68d34b94e2aa64b5f76d50f01d9a18ab1cdfd5a":"15","91dee4945d6660e7c0db77b72fd2eed3372a46545da1c1e5600a80efd554977d":"16"},"data":"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"},"directLogins":{"index":{"03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"0","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"1","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"2","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"3","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"4","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"5","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"6","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"7","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"8","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"9","61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"10","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"11","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"12","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"13","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"14","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"15","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"16","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"17","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"18","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"19","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"20"},"data":"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"},"preferences":{"data":"XHFpIEPRLRjziGOHhPV+FN/EWsxs74xco1JuUAfNC/6frao+PCn03q/K5Znk9mN9sQ=="},"oneTimePasswords":{"data":"GEy1evbARX4ibdMDLRHCU2WMCian6ATOcGaw4HvRGCKyKt2Gox9ZCGZ1vzaM26PqovwcUJ30xvamvtj61Mp+VZB71YJ25irL3eGiqHplx6V3sf6rCx7EzJBPjykzemuRTI5AgRf7mkVhNz2qPeBtw+Xsm33I4cK70ST7ybh8EKjok5UZOgV86EKSxv97NeEsfhkumSzfRQ7zGkT9vjGfDelPUss2QL9uhjNvm/WvabX7YVHWM1qMgxsCCi+Jzyjl9kNTt0x3G66xUFNk+Mp9GgQcz24S8HRJj0S5b9F4YRhLdUwI8y0CHk4uNPaa6VmWpwLCMEcmdT64uatmCrC/CdLrVp3UasDMGPSqic/yF7R8PR4jrvee3SuIf/NtltRUQU5JT+6wwLYwdR0LEMrOHpXZMg/Hf4V0UQxdNdH4yKOe8H00bbg1DITIL5aILVu3yGFgxlrCBTPW0OL+ql8TQukEHZ4PdnRvYWKzm18x+mmPBi5enizxoO4Us+dYshXzvOoWIJ0VFcstDZxBJSvrcWySsxMtWe37DrGD0TfFGTDj3Gd5t8nPYu4JzBOaESSp9WKtKdw31uh7wynAeuGh61LqHRWS9S5ax1C4atdYHma5Qcjk6QwLtBn+MCDOnJqvAW60YW2V+bGptOz9/nQO+cUASkTQ1uOQ87z5+3CXIsDbNk9T4gEbPqdWS8/SiyHkqarIrVkFMCqncTqzaU5wZ9l2sX29QZqJSt/NYTYPyhTbKQ8gKQOVSqXPONewMdSOsP3+4m2+JPbGUcfj+cWBdQGwoHmLlg65Oa3lWLP0s7yjpzN5Tg/M0h6qhmWT3t/6pD5JbFA6fp8HYzRvo9DC7G1KhRd6uvYUTXkzOKzxRuEzUMciV+dvfY7c5yFEnk4VrM5ssMZ5+CGGgngFG6Ab6epTn6PNmW5HTS9WoEpuwqoNnAPq1Bvv0kSK03EwdrgTW73e5Bw0xTOfSMaIWMZrORwuEf9Eus3znkT0n7pEQhpStP921M4wxT1rO4EGGXHgt/4o0OXoJfF+lgHHl95ZmPJAwxxvwH+sfGlmp6PTycyPsox50GNmkEuwSLwPLEra75YEEVQSvOSM9Wua3ed9J6LkySXd89IjNA432m2qFTXzsqX65/Yi/88CcwDt+mYfSuvkh5aSLbLtNNteXv2BirNq6QRWN4P4CA84czBnZUug6HuDHsIR/Hl0X5Eip6+7tESxitT98sftTry9b5VmxHRih8maSfrGjWCqH7Gkax3i4aQE5ErKwxgGzP7PxrWWmJeJXOlSzWXM/+iGszgHcl0bqorMvWBJGdaSQT4TyOoaeyK1UWZnsJyw4KSZJP1wEGIYAWOs1lnWiT4wrqIR1jdZBRGk1fKQ9qRwLrKzPOMeNvHLBIFkbDdAVYY4ScotmNXqSs9dWLqHfg5SkE1fAg=="},"version":"0.1"}',
1397 statistics: 'm+j5iQXSMKvijTYJU5v7iNLF',
1398 userDetailsVersion: '0.3',
1399 records: {
1400 '0bfcbd6662f3771f114295df779a4e4535e8e666842c2336da1b095ca1def657': function () { return {
1401 data: 'u49WrgrQIWQsB/ly5AQAmi/RixI2rGkp0JZh9DlBxgTLOhQ35lNVa9ko39zxAXqNC9ZGD/OiQz6kVT7XAA/anrfctPOTIeXEeQrTQTwlHBZ+9c4zq1ZDNP1rm00v8sr/dYpqJmpQzEko5qdaPakxMe+gag6FGdN/FbVPBbn0uVSkpiIZSNpiWEQ0uHjHN0QqfrGTQ6Yl2UeNoe9P019XTDtfaupDZwh2+DL1i+s0UrZqa6JHyXLnsD9Ue1S4muyFtptJjasNPjzSfs+BHhQj8pIpZWEEVhH16Bb3fKlr6crRktEau9uAtEE5bZbPXTDrPi59JdMYmD5CH5ftDxz4nIPuI6Y553s5T6AejfbFIX3QzMG+isJ4SDebElDCQDNBsmavojxjegZ2GG1M/xXQ8Cw6pELlJBYPidfEJaSjb5cmo/eo32OLLiR03PpQrpzqQkzcm2Eh3XrkVx1Udg+JtrC5V5t4H+BxLpk8oTbFhXVDvQ+zdWuq3icrfb1zOd3f6b9GiXFu5tqAq42xTInciZr7pPWth9yeZ3fYI/Fyw+9F2kuowy/MbB4q1TL2VjxT9WfWmIFoLaLRNr/w9E/RsvgTc/LukGb44AjPaVFckVSw+mqpAOqvtZN21kWkJ9rQk0W7CQ9tRYRfrLhWVIu9vwPkjyX2o2t0+ES810GTPNesbbGAsxlo2CC3a1GZLebeF4x+h0v30ShC9UJLhxAMD0PGpGYjc/AOkjGxTPMKLMvyA9sKKZU7PRLQQg2vFGXWIYoK6CHFBJey6Q0nTDY7Nomi+nMlQv5f9BT7YofNW2oib9wQmyS1hwBSCB2Gavh8fd7zPjETCCURfDMfuMlqRFgySiOpl+yYSHLmlBl4S6sIsdU63uyy/4QMQn/SLGh4ASnhI1GRCwODVClachEbt6D1u1JInPQtgBXyNiuKc1s5gZ2WtVB8tPfkSfUIQuuYjK2N9aVaioaWhwSAIX771+EaYMIrVeVq+twakrkFkgL8+YHF0sOoZ8ddQivsWyfsMwDAzHgGk4hMdYzr2Mbb8ee8p9oaZBVqZi8E3EM=',
1402 version: '0.3',
1403 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1404 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1405 accessDate: 'Wed Sep 30 17:59:10 CEST 2009',
1406 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
1407 versions: {
1408 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
1409 header: '####',
1410 data: 'HnjgIcyk9xbqzbZLcIx1BLpcxwQc7hYQ1sHpaqrKVvzx/CFeGGWTmLHoy/dA1wr8/rAUPqvaEFNjZBDfTQtYNWQ9H+Y+YzJ54TmGCQY2h2HYLSCvJWRlucsHKcW1XLIwsxLzBdtZK7AkR1dPRd3s0GQDH1pUcWC7WC0thJM4a2X38lILzxXmoxdqQvawNAeVwscokb2Z4+zQUMLdRt8o9v/CTFEsU1jzrxVSXztrhBzjkUga9TUVcYA7BpOMdFmeevvfRoVmf93BL82wDDWiYIIb6NoA8SjIK6Km/cmovGikoPjUbOErvq0TaKuC6Gl/nUpqnW4kEjR0rVDh+27AuMiJR6MPdqjAYAk7pN8vvfTk4GE6TGxl5IbLbl1yZ/7HHC/CtihstANOSwpdCDpEXLK8',
1411 version: '0.3',
1412 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1413 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1414 accessDate: 'Wed Sep 30 17:59:10 CEST 2009'
1415 }
1416 }
1417 };}(),
1418 '166d907e97005cbb29efd1841757f7d1a57210ddb32605ccb6841f35f72399a6': function () { return {
1419 data: 'QxBwxxwjNGkbV5L369GEfAGPghu3xUhmQJi4r0dhbAFscS4SgvfUPuQmX/JvDfWZFBhAHGunrPxHDDHRgx7GVVI/Kv1oMexHKbPuxhRSBRQz2HQlXDAUctW1uPo2xEbDHGr3JaCiqnHltp9XMkmGSP8IYwgizYt+ZwRllKlmDbVkX0gBgM6WzOhP5zekf0E82XauOc2YUW2jZQEKBQ3azi1kKNfTzObGL6NK4awJBlB4m+R8xmKkmybcbDOnnUfo6rXxef6KLyd1Xq8wmmh2oS+I5sbG0CeAdujbhrpJNZMkXFUjKjRu7yCrCU5rUqpKGcYUFtsciFxcklhMwk5uQmjLlKQBXcOM6lmw6OHRwzE0eOMB5iPQF+gRUo5EKdRd9B+lV9QyCJlkTgQlLLQfDSdZ0xAoEe2vzJ0p2Cijg212w5kGf7vEtQrYwb6GAlfeJiYtDKSkXXx+ltpCI8RLOXdg3KZDu7iobQZ43I4MA6QELhGhc+GeRzvHnW9rBaSdxWVgba/EHAsTVq2VSt5u4Upm+WMyAQ89VJ+JMUJu2k++tID9ZzKF4Cfv/DfP+WLGEmZFmfUldl7ot91HFHi9kH5HGgqbkqKUCHTwDyJhQM+2NAed9nPVnV5EKv1YY5ABcVE7M9FGEIVaTlPCQ4Fc2aKD2tyXuhmXlLKK3uBBsSQ3gn7NI/6s1vIDTnWQA6uzUo+IpadwGwcUd3F9TfQ2yckE/FuWq5WNeLV+Y2OeQgLZSf3y0/sqSIhDOhowNMwppZU/fS6Q17iVDhGcmZn+frfNv53rZAOg2zWM8kpLjTOtNCYsToR+2lR3hQuMUw8dJuNs9WHCywj30J2t0FEuLt3091TLD5S8mufN/O7wjloLOH0FtHH7zufyH8YgKm2KNgUHMhopsjnqp3YwXhXgk3OfD55lSaiLO01pLP5kDfNXsmUDyK9SF9gn1pt+xTVJ+ndZiFxzuFvPsASiH6f4Qp6KMoyTxl6w0cIHVZ4e9qHcEWwvTfqBHH2O1KPvijTSmlcZ3gx3HB3zfI9hrY53dJsYv1Wh6mMe1KKT+2ioTlkY0vuR/aEiD/bDJY1yTQ32/TlY5wF4trd3mMeT4yIOPjsMWPLy/H2bF68BOd7QC5EACoik0EGBy13yhg==',
1420 version: '0.3',
1421 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1422 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1423 accessDate: 'Sun Aug 09 23:43:43 CEST 2009',
1424 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
1425 versions: {
1426 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
1427 header: '####',
1428 data: 'InmPOw8JYXqygmHyo1pTce9ig7lBEINjEXHBq3O3JIJxF1+kI1+I7bMwBhPJIu7dwFgrp84YGFzk/rf8i89/55c0an0H5DASo2tyE85RZNA98ZVXDEl7fg0FXvi74248V9vfjqUajSc3z/NJb6ykHLcrVLIDupwr+0UsWXIy3jYrLhpSRUWHKMSnCus44BpqmBkkDCTvHN5YQdjGwGcevC4L0g287vDO8i8rgz0P56JwiEF9yB9jtHMRmHFsG+8RIi0xPAPGJlh7pfCkNqhx/A/aGUjB3K1PVw4z7uDzrbF0YuhElZae6HbDu3ouzELUiOV0YijpuT5Mc6kq/NIvxWenrSwNx00kAGChWScG+SUTOyCPmR7jEUHcxGS8jvaHSPQ7bkr+u8BYgPwVuvHhReQp',
1429 version: '0.3',
1430 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1431 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1432 accessDate: 'Sun Aug 09 23:43:43 CEST 2009'
1433 }
1434 }
1435 };}(),
1436 '25bc43a5f1aa780304bec9cf0cd61502f82243053b5f72a55712525b0b8290e3': function () { return {
1437 data: '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',
1438 version: '0.3',
1439 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1440 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1441 accessDate: 'Thu Aug 13 22:46:33 CEST 2009',
1442 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
1443 versions: {
1444 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
1445 header: '####',
1446 data: 'f/VmR3IF/aryj9hlTaXlsE57o/x0jsH2ah+qgc6VsOg1/7xa2qtBQRhOQ8RWr9oYmjnarWqkLVrVZqP63O+0dOTmwWHoSf17dWlSZVxErV1Kmb5ojgFlkbHJX/RkcgPrav72fk/A4yJ7kb1FZjTvGNPMpJCDvSA3VT+xEukGaIig1Zt0KRA4BZasYuge2Kr97yT7mPN0d2EKeM22Ybgl3Vd+Ja+aWkTzkLLo3pRBDxFXP0PJrVHFG3hDpVqLn5/EGZguml95TVGlaqRZfzmho9VHduO/fQpDr5jelWA9ZDNkQhxyA6LlOrZjcidbyEsMYeJqVdVXa4vBnYh+WM0KJIU7XoJhur3DMD6yaGc2wAX8dwM5zyWTaseb47l+OvFkpBgstqBnIBozGqRj3ATG8e0=',
1447 version: '0.3',
1448 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1449 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1450 accessDate: 'Thu Aug 13 22:46:33 CEST 2009'
1451 }
1452 }
1453 };}(),
1454 '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e': function () { return {
1455 data: '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',
1456 version: '0.3',
1457 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1458 updateDate: 'Mon Sep 14 10:19:04 CEST 2009',
1459 accessDate: 'Wed Sep 30 18:23:38 CEST 2009',
1460 currentVersion: '6dd709033cc5be16be0ed897d0a7f8886f88f50cbaf9eedec8638fd7b72fffd0',
1461 versions: {
1462 '6dd709033cc5be16be0ed897d0a7f8886f88f50cbaf9eedec8638fd7b72fffd0': {
1463 header: '####',
1464 data: 'hhwId0LMOaldpCUM7uGnhMnjE5hqoMV5DbeA4TsGP81BXevlGklqkoQC3erIiXSatq5eG/dyqDQrzyzkrTl95CwINRWYmXHDhaoH6LftAeSpKHAzfpfRBX83MR9HyT9Ypi8Y1j00L5qEqi9Z+0w3szwPT2KY3ejCsgZAM8NaB/8y3sBbU+fc4sUZtWLbPxocEeS9H7uNBE+NSWjm3Hw5OvfU2PaAR9JcTy8B0HyL3h2g6/QBCEEnf6QiR0L2tfEo3iHrsyVYAdNO+P4nM/vFALCLEPCb/nWstS6tZu/u5q+KERluskP+EKzGgDwuvLwTHjq6n9mXs6umDWmjPmJBefHYQRCYpKMUM+CO+3MFKkZJ2GXExp8ihOVdHPh+zxQlke7rgO2doPJwzLJ9QKH6rnovixYkt02MrbTLNabsmXA7ystuXICcWlSRzds3GlghTdvbjnkgqcGxfzja6kL/ERSx3yq7rKT0cC3O+hWuV6zWd/aYUDnCVbK60gUAphUz/WWCfCMp6LwfRXFn24njkfkPfp9uOKYPMsY8w+crlPP9qBYrVTjX9oyKIC+f',
1465 version: '0.3',
1466 previousVersion: 'fd57e2d2e48e6ef8db89d8b9ad661d01bd8d49a93f726050f84779f1ce2bab11',
1467 previousVersionKey: 'sG96l6ebyht8o5i7Yt3HxAuZe85AJq4ul1cqFmjjzKe058gPKAN0QM0BEoa2xlJxIoXeIrq5A8QsHGPs0iH3OlU77RgBgHUG4TZt1QMyG+Pkow==',
1468 creationDate: 'Mon Sep 14 10:19:04 CEST 2009',
1469 updateDate: 'Mon Sep 14 10:19:04 CEST 2009',
1470 accessDate: 'Wed Sep 30 18:23:38 CEST 2009'
1471 },
1472 'fd57e2d2e48e6ef8db89d8b9ad661d01bd8d49a93f726050f84779f1ce2bab11': {
1473 header: '####',
1474 data: '50+8kvNBZ610YDniT5vM/2VKaFjO46eVWBzgz/kUgU5RmwSHw4PJlupqBRT/VM8UN8NVliS0A7IoSmIP1QWAb8n2KFi2e0V6bYnrso2gPZU4CIOW8Xxh2I8mDci9Qdo9kZSvgB37vcRw+QuYXwm+SjCKqgieGcniacVB37/lcOsGcg3I/o2Vb+ZgXbyARKS2vN8/I/XM89/0t/OUV/4+PUvI4rCHSd+ML/0801t0t9YrD9yXEnIEGl0YzHB5KQebMmhCgLWQKE4NdPN5xnPxtCXRQakGmycUkA6gPzizpBhrRTcObFeQObPD9E/T4UxICLEespPy0FRtipB13Ql35CZbc6YOJ8YbRBXBy9tzZfiP68dabGzPsQoUdhTnudqtSHTvgZgeYP6Y5X7Tl2eaAZGf',
1475 version: '0.3',
1476 previousVersion: '41e02b4415f5f802c6aedc21cfa873d1a6fd301b351ad064143609280c0be870',
1477 previousVersionKey: 'Lhb+2Ikt6oJ7RjzcfBKGcdw58j0p0m1U8vT8fVlPhz2Qgfs49PB+IFDJx/CAYfVqn0XugP6G/C/bt7W+26QIcUywQQMYGA0As7wQlAyntExBvw==',
1478 creationDate: 'Sun Jul 19 01:31:30 CEST 2009',
1479 updateDate: 'Sun Jul 19 01:31:30 CEST 2009',
1480 accessDate: 'Mon Sep 14 10:18:48 CEST 2009'
1481 },
1482 '41e02b4415f5f802c6aedc21cfa873d1a6fd301b351ad064143609280c0be870': {
1483 header: '####',
1484 data: '/sQ8oax3ehuArmnZEeX3xiqqDlFMPNgtisChk2A6Jj3jqk+MxC1Y7ioYoY922oyI0lZG23IUHsTvDr8YV2RrIcEMXPBduPl+XcnmGpL65ei3ZeqNSji9Z/i4j7w1JawQSSfnppB9EdE2OQ8x35PnWCIKKDS8pPXLAXnJmnlar5UBhJ1vaTqQY5mi5OCCDra1KTpcFlGQH2RfX0Kl2jwYzFxqUNMyf3FM4hs7cvJcm2yYvvw/c6V4QwRIiANoDjSQjtarhK8dULMJWIXIpaHUkBLBlxpINWkGpGBPyY77CdTOgA4UB5icgZZA5lfxmkHubIpv3QegAf+TKSOUeV9UWmHj64ayHgYjQ4NB7XfSUSrnMshn6q5zY17TlM/b7OEfe2RR7xUonmNgw0ga4OVzYKMT',
1485 version: '0.3',
1486 previousVersion: '5106520ab71f92eabab279abcd41289831738439fea854d122da13c2d604bdae',
1487 previousVersionKey: '4VhpG+IYuvWSUkAP+NhCcFquszJoBeuwBL3A4HkZz6cylGHu9UBjAsn5VWidptcB0jI7A487rHjVmqOdP/K3MlJqVYSNEVzdMjAfkPgZKSGrbw==',
1488 creationDate: 'Sat Jul 11 23:23:47 CEST 2009',
1489 updateDate: 'Sat Jul 11 23:23:47 CEST 2009',
1490 accessDate: 'Sun Jul 19 01:09:01 CEST 2009'
1491 },
1492 '5106520ab71f92eabab279abcd41289831738439fea854d122da13c2d604bdae': {
1493 header: '####',
1494 data: 'u/iOk4faLI60d78bNAf1i1/zxImUkdtjS5K+gQqrNRnqquQMJM+FV8qPDt9vVGgKijB/LCgl6Cfvl3Pur/do8V+X7V87fROBjD4XbmMnbG3yBBFgk9snX4upCAkoEL8XrxOY1UyoR0SiLMI/9g10PMRyLmQVCCViwl9RRjcHgI7YKekXPuVWwg9uAUV3pdOamZpyN4POWNAk4QpxVazlK6UoJZ76IAq8UUl0oHbzRNWT6d44LZzWEbsss4SgVf+7+mFMSwKxB1cVm+jgk2vcNs+txAg04EozT2cJGBsiYDqo3GrA+yHTnhdKO8tRBLBsOkmwS60k4H8REZY40xEYF2uYnZbOmBUJPUUOSH44nZ2cD+3C6YyK8GmOS/8ODd/vZ35mCZzoCnHDqqpvogsBv5ks',
1495 version: '0.3',
1496 previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7',
1497 previousVersionKey: 'CNxkOXhTK/SCSZnj+MD4ws83iHGVfl1iBIfkcAhnMeqAkft6IoQQr+r73aZZDRCLDkzGX4kT9iKCGg1qwsrs+EjoeXZTrQH1Iq4J5G3sFLb+jQ==',
1498 creationDate: 'Sat Jul 11 23:23:27 CEST 2009',
1499 updateDate: 'Sat Jul 11 23:23:27 CEST 2009',
1500 accessDate: 'Sat Jul 11 23:23:27 CEST 2009'
1501 },
1502 '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': {
1503 header: '####',
1504 data: 'PPGwtNXTyrZpCY1GKT9/u0pPsSunTuRFhrPfld89swJtAeNgz4VUTXWTT6z0fD9MxnaxsxLhpofDBn2mEYnhQ5ZptSKd7/MYrkVLRyMBQaZ7tPgaWVyFZ0vhJ1et662H5Qj73reiOYuKmU4KIqydFSupgjG0awc0ZV1qwjyEwEWgopwXvrhWoFveGSrG4XO+cbxnb8ek1sRKrUVIQV2zhE6S0QT6PCl01Jr+Zd8kW91EWV/PtZn74rJcH1oBJ34WBzBrU6ARXutBfxoYgwTsOhRxH9Z0StbMSRAsBff55cOYxwuxQQCXsOWXwoK8uE2WHAG18b3DNuTm+jluNkgfUxgWZ6B8gMlFQ4hdgQ0gfWknq4+ZH0xR5TTAOBegel8C/z1sqT+hvdutBMih4uXJLeZO',
1505 version: '0.3',
1506 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1507 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1508 accessDate: 'Sat Jul 11 23:23:12 CEST 2009'
1509 }
1510 }
1511 };}(),
1512 '2eff872ebb19c0f8430518847dafc819c0bf7e0cb714b456d74603c250f2efbf': function () { return {
1513 data: 'OjA3UmHDbGw95QFBZ0LMQVUgqwpWy+BM7a4eZ4FY6mb/B+fCl31PadGg6+Xp5E4zk7V4GEwnxl39aCQzmNQOsxWszVZ/7eAIFK+mm0EwmpC26hIrrEZ+8yHW21Oj/K9FBpfPZ42768cWh+K+dLQw0833n5b6UTmrOswJtzQiMyCoZ8cidw==',
1514 version: '0.3',
1515 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1516 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1517 accessDate: 'Wed Sep 30 17:59:16 CEST 2009',
1518 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
1519 versions: {
1520 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
1521 header: '####',
1522 data: '9FchrEXmKOmFxcCcGHhOQRhDf+OWFABlBt+Y7FoQWvmjILdmlZeCNEK8tBrVQDQH+SuJ0s3EHfaW2dQ3TRoe35E9P16lJiGclRj59e5f6tngE0wD4gLyRQnF9TZJTFIM3dYlwjhAewdonyh0uEnAtdZfNaeCF5xVjDKzfcUVyxXIJLa1+wdJde6ycsgTaPvsaJZ0YU+ZfCSRAiL2ACnVcjWjT7hFMQMGnCFQOMJz3OsA6+UWvhvXebdDWqVg4j1h9Y/FDllCYtvIg35ARlaJERioe7+PZiN+jki/XmoEDzd19BkK/AKB2DLC8dPEj9uu7p5r4WAxuA6iRbXDVO8HlkoywstDAKtUj0XmAfHoX2OJkHQjfYyuqabkFCQO0227Pk3vFTFnv6dXecBMLbevAVoL3EKvHpJWICL+mqpIGNJUqgDCGJEB4rob2xBNRLyExgkEmbCKoN9ikFO/JXhDT2JOSR0fmvfcEFor7exicL4HX8zgaokA3oXwZptc2Q7wTtKJ5ipen0E/2uv2rjCgTAK6vFHxgW5Fk3AGG+a2YpDedekRAWNEJdVucimepL8LPEe/GOgf2kGZqb3L',
1523 version: '0.3',
1524 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1525 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1526 accessDate: 'Wed Sep 30 17:59:16 CEST 2009'
1527 }
1528 }
1529 };}(),
1530 '350a8d666e033ec01e203e0b6df730bec53124f9ab25f7942bd9378e4b5c01f6': function () { return {
1531 data: '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',
1532 version: '0.3',
1533 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1534 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1535 accessDate: 'Mon Aug 10 00:39:08 CEST 2009',
1536 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
1537 versions: {
1538 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
1539 header: '####',
1540 data: '8TVTh0Tz2AUS6OmJ43Gp1a5ZYHhryqoDcESx/EfyefERs+AWtMg/57XKIEi1GPCA+jllOVmaJ3rnRaEN0VDiT2lST6PReON+IFR7WtZKpPOMit+cF+7WHXM9RbYsJnf00yyzRzF5xKPk/OiP0QwNOnhRrn0UUzJ0akSJS6WLJrIDF/WENBu0szn6I5g4m9v3nUIjJcpsM99BOHS7iQJmakUUQuIp5MPbALEUHmTWLcjmK+BVOctdfE1uPor1GAwgJTQ7epQX6PSPKsyPJEHgf1C5OvCN8/X0IzXdoXdTdyBCh1RaSiI+5Qjp+XHa/RK7oRjVy5aMcpKT8v3bDBlTMa1RmALqJCMDW0lVgjtNrDlQ8mxDOF+gTrDOsLiBv3oHG1H5035E6cU4TRu2xLDqpGKzJ2uPSkVwvc40o9+Qk+Zi6iAx0b+0OLF+Yy1KoXP1ltznmufLBng50lZSueYLrCfEmBfr6e+gc4VZItfGrd5sTT7IilRs7gn5+gL5Xhe5sQ==',
1541 version: '0.3',
1542 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1543 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1544 accessDate: 'Mon Aug 10 00:39:08 CEST 2009'
1545 }
1546 }
1547 };}(),
1548 '42c7a17479baf21938c87af38ccc3ceb3aec21535c644f6c90496f89008f7828': function () { return {
1549 data: '5P3FrjzLuEW/pVXRA+eGyKmcmD45HXgsMFS2S5SVnKDSA5mH7FLnCPsR6BGClUNZQlB3iU9vG8IK6iIY1v0m0m9CTM1Ubk3dnDOTSrCi4BTH0vknRvBNZK7vJaChSjH6QgYrRzp85hdNPEIqjZzL+An66dFmWzphjAhCwh33s3QHA/gLlqLaxexPqcTORsyrbSzZKlpRBAF7Hb0gDHKs7YAPUBt+dlW7ZYrxBtNIGYZeh0twjza02AnOhOypsIgJrchYXzJ+wXhU7PPPPwcRKrUjPPlCzG/0+l7E6DREf72yUzIEV6IVyM3Bo9Aii10gRpxeU7XwuONfQExBjxJ3QsK1+IK8k67WzAYYUO5gu+jV3M4NivCpoYK18DrU88teIRgoGry1y/x3gzrHKZOuu8w31/UrcGw1e7lliYxYbEg3eje/znRYKCjFSVZ4ZHHKqXshGPLkip+dAXiKmmdqmn8hLQPrbxTGAPTrVXdM/WyU1NMYtJJOzsEDNTKMxIfBXnb1fRVjOPDtEpuU4Okf/FiQ3fOWkjFWh7IiyFoeKIVG58t7juvwiwERaw4gfJNWtdMAiTvh/o1o6qRAtnmH90+OWc/V0no/fr2xN/NWSBQqv3e6/dj56V8b6wmvu6O7geXF9+n46LfzMDlHoBqS/8tGy7qDnZo29TaGbPoXUkvteX7689FdOYFd66WmSAuoNddvrqogWBCMJSwiuaFpv2JAzFtWNmQAk/nN81TFjnTeiK1rl0drxwPR94Z8MiiiogzMUIkbmkGciUtMfWpUgDNPryx9gXRCCZQZXLh6EfspgahFykUXG6BwviD7jRa/1TFg4xRp9VWuul2djQRUMEQnZQ4q7hu8ZBpBvIcgvC4CxqOfcQrYMAD180UbdxQ2xJEPA3DCDQpZNWzLgJ0m6FrOx87x4/1Jyd0LaaS52SxtQCwqnusNut4dmPFKHTiPGXSuDADrlxeL/enOAXt+j7fjE5SXy4bVIGqeDv2mT8yPUam+b8tb5SNr+CD0HsUB2hsunUxjXVwcJ8Z0JBrwvvVtQAu17rEv3EcfuxFLYB/HwqUdjeCfu14/RvblCxBaX6+lAeJ4rCA8dJWbl/ckr6GkbQmGnLno8uxPrq4j7E7Ia+itowZSeJ/eLlyV+owhbILoVjwNeTqi6pkiH4ejM/+e2n4r9wB7duOiFPKnpEt/SqF1YWUZfzLoDikdzoGIERePNKzlSEa1m0IvXDxJtADiXcEzGrRXS6mnbIt+yG0xX4EsCmDt',
1550 version: '0.3',
1551 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1552 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1553 accessDate: 'Thu Aug 13 23:06:32 CEST 2009',
1554 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
1555 versions: {
1556 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
1557 header: '####',
1558 data: 'cMMqKK7G+t292j0PUNh4gtooVZqEkAoY9B/vKa6FEJWXCp2IfLOSH9sU5xKnlX10NGYV4xZwgidPI8USmCM2WUIcv+ffm+6OYmEQKC1TdptcyAh32+dF2VS01V1Hb/HmtQiHT7nh1IUaV6qn34rTICtLKIfei+AoGEjQm8kwKNzNxeX5SnQfafKCmKHH8ag6SxKPggv+ucO/ECz++n30nGpjwG/tWCyMd291HfAQkseloFTPedEgEmfRfGrNmsq2iwtwKLddZJ4xvY56H8Ppxo483KZj85AuE/g8vS5Qc961YtFjA9xbE/BSchXYobLH9DAoKYtiREyfNCqHYh1cxhqE0Tk1f0+9IvGcsB9d6fahhTfQERnUAd+f+C+hsx7rMfmub2z1TTjt1CnvCEI=',
1559 version: '0.3',
1560 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1561 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1562 accessDate: 'Thu Aug 13 23:06:32 CEST 2009'
1563 }
1564 }
1565 };}(),
1566 '5931d708fcdd39af284d4809135393c81210a10b0e9d56b49b2f2a3b8adc9394': function () { return {
1567 data: 'Yr0K3VCx9pWKSjRuk0JTO8kyYKqqYBb2xz0nP4h/WSx3is3bSy/jb5dWJhI2WKNdpK42eP0jfboITWX/4Wdg7HZoLv/usE8ld3MGKfxxzUNZDIkW25y7Chq08wFxvv4O0fHM6QyFmHQx2KRQ67e++pm3Fuc5CBl4Cgnqe9GPtMnAVJdaei/eDK2icOJ6EldBb0NGIaX2TWE84efJPVNIZjQ2OXZmLse0baim7TtS4HXljZSBNHob2v1KJ/sKh8xvw6dY8zQBAalo17Vxhb7Gd9/Vd2A03GNixS7WZAYP+ybd3lZFMMBuNXTG5bVRaMZv/hnjw+CLak+tOyNRG+ara7GivBAXjgfd0oN9qBvvM7aSm3iFV1xQkxBXhv0/GceSZNE/uPdJkUCQutikv0kpsDxWBHvPI85+8mBmzgF+aT0aKRTTnQfYSBLvPspopEv7PxhwIdjDBJPrfkAMUFuTSnZ+hriDMHoYM62Kh5anX3jYXIPmrRRuH1NN39FihR4uBNacZPEiFKmFQu2js6ruCNzaLkUFQIhu2hzdnQt1kOIG2nngruI7SEt/b3YwHIh41udtve7qKWrGaO8IjIaR8jgCtxvavH6NaRWIr6Vx4cgvqiyMAZUewzsCgY49BOWWYBR1FwcXzk0itWH0ZzGc8htlbVJ50I58Iu6Nfv2IGQvHY87arTAbx+sUNxou6Ht03KkqaONFEr1/VkAaxTNsTcuWFArAKaC25oY1EkriGUC9frwvJyHIRBSHyIzpbbtO2/mnBG7gJZUxAtEDZ3Bb3AqP6v/3k3N03pP0Y5HL199iLeKTz3pK7sgohrr8IVM1XvcsaVyTBZ3di1E4UZVbyxbrMIyR/+NMu1ZqlwGI0wjq/emTvtDEI2/l4WMxMIfQLCwdSjDYi4/HVZJvcyGNugS2gUf9hwavz+BUnV1iSI1JuxQihby5LY4Em4Hr1st7hqElfZLgq64iCVvBSzOidM1SE3lm2l2/Xx0SvLKmVxt32vO7brNSrBB1fQyq/BSOwlp6TbhnPKbh8aF+MIjexwPLU0wfs8rj+5X9j5djBKVtlCqDFtlvng043oC83lvOdbyAeppNXcloRWH8gB0+orKD0VCMMt3NTCJ6xlrDeIWqKjn67ucXub1LB35B4mJDbUT4zYWi+YWAp7QdFbZbWJUa04BzZOY9ggtbdrznLzQOXnek1gqEwrNSytvVPaWoqz25KuMpb7niKwQNe4d20f9GUMyjFcwjwlfyfwv8B8FujQ/3bCi+v4R01UirsVxmRd5ESOYi9C945ErgQZX41x18n7a4Es35Bnl743w4ZdVQw8/BpwRZ0pKe0275eDw5CJv4gFdsnTVvAhP1SqG53sREsIVE2STr0/B9cANQMjFI270JKKVG5ckYTueak3QlcqW4DXQE0wkcU59wODSBiiItFDKtZAk1pKll0s2jnuWlW/WP4yWddry6uMtTnj+j3uLNcV9O0Vp2+v9rRAEdHCymEPkEbR01Nz7FE6xRXnxnfn2xQP0N5KVZvzXMf3evbN0bEGnV9kH/gIHkiMr1CgYJeQDGcxZgKtlxqD75OV7XUSIAd9b3+j2aDmjf7a3cZrvGjkSHNBVTyPSwsIw8/09Es295fGLKRu5ZfwgZD8xjUfErluT3QAkx242RkhayNPn3yRNAGzmBZ3t70N8dgVG096lZ790eDDT1fUdusaIxAGlPebT1zZWS',
1568 version: '0.3',
1569 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1570 updateDate: 'Fri Jul 10 23:26:41 CEST 2009',
1571 accessDate: 'Wed Sep 30 17:58:49 CEST 2009',
1572 currentVersion: 'e26bf4c9ae24bc10a265f594b0d75426fc1664ff8143c52d98592cf1c68baf5f',
1573 versions: {
1574 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
1575 header: '####',
1576 data: 'Q3Z7AjwPFzFuRm7BJSRnd8Y1/tEqXiLdCxG2JCurixClv8uvQPQkCECmE7mn0OqMRzlMStD9UojsRK+cxsaNbQn3OstaOgm1OuZe1WLg/oSM/UfcQqfBRmCtHwKX2zjRTSzCjNamwV4n/l1/92/JOBeydVWe9pNe/WvjjfNYRRhTWViNnOaOAipfLR3uSbehgUlQ1NX1y4nrC/yEDge+73BtJNJhb9FOkKGG9ySf7vax0fEo6jVVfyV8KKFmXLL+ea0D7CoiyR91eeTKZ3bGzU1MD3KGXfPorpCoaoRK7OKrHGHGfAmNK2yAGhJ7rFnTbkna02tMSbdwHaEXVyLHejub5L4LUaqTSnAGdmSpiVEpkNbD+K2mLW8loZcMUetxFqDh5ta7/IEnPMicmpSOAVlYTW2ytpLppvU6fFKAtGdJ71GaLwQzgfKE8ZJOueJ5WBx990K0MjSXZcsqEzFzGjiyXpIBMYwFDuRwTyoxowgtlL4W8DTtrxW/XA2j1esrMXS3Bf2g6ujdSPzlve/8nimW18OkRAgPuL4seEySvs6GKgF4CyR/TsIsche2kWJ7XM3eO7Bh/Wxu6WmNBjUUVbjvOTF8pPyDkAfEIhXhTliHf6lDkW7zQs36BrGEPfOC9MKjSlX7v6jgwX9gy1ToSiht5OB77G5luThsGQhEBkydw1QGZvcKkblrzaGFznM10RXbuVyfw9HnMQQO9h3aBIgq/yynJAc+uBUtfPsGIfXbotTZ+bN/y9mNl1gng/gyy0732IS46Qikov/7KRpOv5RrosTCYaU+WrAn1ehbMzd2xFlNcKRpQSGQkVundl3A2BqYtRElJCd32FUPSfxo6gZZosI8s0+GBiRjIVihPpglE5uXk5vjbsCEpahm3XEMEpqGdyXct/blQqEsa5o2NrvIlNVCbsDIKYZ/S31b1BjVO/auWGILqzbG8RA0IGZEJhyRTx60dJEHZSayGlunkgU=',
1577 version: '0.3',
1578 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1579 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1580 accessDate: 'Fri Jul 10 23:24:14 CEST 2009'
1581 },
1582 'e26bf4c9ae24bc10a265f594b0d75426fc1664ff8143c52d98592cf1c68baf5f': {
1583 header: '####',
1584 data: 'ITaQ5yMCeVUO2140QTcV0Fy8ucHd3zRohhgU0F9AdvWxwVm3yjZrwjZWmnOS82bZ3y/ZSrz+HGhuxuk7+yYOXR/Gp8I45UTrxFzeqJNJdWurpH6SbBGtd2CH7wHM4Bi7fUBGR9B/JmUbrTO7iT71N5MqZ2nRxr2vvCBXMcOPlFg7SSMDw6eFqDAAn6iMyaQSJvntLvM+WmOXB0S3OgUdhudUihK+Eb5tHPAy2hZKpqjavjxdGUiBEJoegUwBiv6SbCjTCDZWNXeFviw9wBJoIhSUegokGr0lNGQqMq1BpNHQ58m+VvIF2+qhwGq3UGd6qfyb75DwXQus+XezIQNOPFwPYW5uARY91KBgyIzB3Qj7ATpDVqPiW8lMs3wHXg7h6em0/FEFWonzVnoAx2HWfU278op1XQTgSTLn2DxFfM0vFeHRfb7tSwSNG9RNb2hi/cKaz5GJEQ83MO9MwGznSFHwGfn5fFW6ZZLf2cn0l1Y4VO2JjGDwy2HD0z+K7LdH+lefW/CyMmOKERnltHnMIDpEOB+jwhBj81wbU8bO9C8vc47myNtXu5hROIB7SDcV29Ufg4kXU48gXlaPuyiS4TYiM3kjC/F+6+iWkJbyFtKirRibGBIKvitkBIYkSJeD81b9IN3Y032bpZkS4uT1oELFxi1ZPWeqayEYSV6ZezqprT+t1PLvtLokKkVerbGhC0FXKkTQg27YHUNOZ3qJCXeSFEXEIWKRrHAlFvavvdIFZDUrly3nRW2H+hEbSVlD9UC6nzfgJbjh0AMS3qSgZrbf/asya3QqjM30r1gF+yn7yceyY2rEdVZnNc0x2siie4rXCa6CbBuf/OA560g0O24H51dSsrxVcgIzwvFMXWZlTuHzU9tKjGqO9sLITGy2Ap1FiLRJ+58PXtBYSixB/ADrEJFQLzbOFjALRqo6CtVzo+FUVEh744+dNPpsVLQ2dERKbrdSUxfedCyanpuW1js=',
1585 version: '0.3',
1586 previousVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
1587 previousVersionKey: 'PD0gxj542sNjh49y13zXStCGpXNRRLeJpGJIal1KoFm7HlR/BbXNo8mJPFvGT7Ye2u/FQG2L7OH5RFD8QSZrDkyG2kthr1vTosT3TkDerCLeyQ==',
1588 creationDate: 'Fri Jul 10 23:26:41 CEST 2009',
1589 updateDate: 'Fri Jul 10 23:26:41 CEST 2009',
1590 accessDate: 'Wed Sep 30 17:58:49 CEST 2009'
1591 }
1592 }
1593 };}(),
1594 '5ea084cfa5ce8198528f466e160862b4f17d0a4f63d3af45518c96413d16fe69': function () { return {
1595 data: '47feWxZIAZlVAXvXRvAZkVgOzfklaI/tJVT/5/TXfM38kA3UIkm2L4kpfybLlJolAL+ia+3NbeDI2qqftV8nMU9VSQONuu0UGybzCYNBRm7jK+GrI4dLQs4j/slm9oDPSlNxH4DuM5Td8pae6UUdZN9nPFF3eOQTm8sqv05plhw7bElInA==',
1596 version: '0.3',
1597 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1598 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1599 accessDate: 'Wed Sep 30 17:59:27 CEST 2009',
1600 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
1601 versions: {
1602 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
1603 header: '####',
1604 data: 'TJGyQDdjUyqLTS3hlbfYNbwaQ1/LvuAtNwE/8ccsxWKK07eHHshnFBN2j3D01X9nGgWKHnC3C5UZ/RIbJmmqx+Dp4xYSF0Qbrxp4WMtx6BUib0zwXOiopeZ+XaVyvcaz3OASav+Ayp1VEVoXiM70caQ125Ljmp17EYCWUrgk4gSKIy92d33Ia9GBT03x+uuVZ69y4sctTK6UsEEtrKpU3s6XzvQO/xZKtR5c1RglgRjjy+9DlFgt0+naBlpYkofS50lYsn5TjuAw+2+sc6wA3e7euzWOCHBmQjvnP3gx9nxgv34mxyuyj6ej4gSKyayee7tAKM98//2+MVJlQszfD0DAr+EdwT7EtJsjEz7jTAXmGAWSEh7yWkcWcaq2nuJhHDzocidXTuXX273ki7WxTXE2X0pZB97133iY1GKGwY1Wm+xjN+1Kkxt/UElkp9mk997BdT6ZTb8G5iLawtp4XWkRcNExFP2x66YHEhl2vzkxvwXIre/mBILJzfj29iXks59rmhxglo49J48roMZ8vMV2mMqGUFQjbchT59btyBHJSFiNpO7eqTExGdgUlE9/UIEBXSPLw1He5uANApPnuf4dPOPDJb0loYTCI+n7iMYdVJto/0s/wE1FsHQC5QfHMBlXncyIoq9PH9+aje28HRQFJlCtqs3cNr4sVbcg8h6UKi+5Wn9PD6xyYmOKeMdLKhrC65ugYMTAK/OaJnnEioWFklO1OOzSeY+4naKq8v4J89Catw7/t91+jmZeakudvQ37PXpFkbgyetL4m7rbBPb24noT6tyKcxX2xlPZwDavsRVdWKJsBXBewqsTpshIjuAE5qUPHNBfqAPzhNc1jvPjgTMYyiAo5ibVJe4C9N0N1AbR1Zqsy+ifwbSTB/9SHVSWEPjDmV+XdolPCWSifSGDhUdq7kk+nJ4Nt4dD+OcfGZlSPNH/976KttkrvezGrz0il5ssd6f+DVJU7QAwWsNax/lODSaRytwzg+5RxfO0K/tP3VQpi84RYwiJZ3T/hZqD6+9fcLJ2w3avPFyzJsGtwE5FrFOXbBHh0jHs59cBkuAfD0DNYbKB6e3M4byde8kM3MH7rEop2fDAdPclP/yClV51PMoNcMtduTc+xv7Ywf+tvBbfXs4k+UAc5sE++Ed3d1fooDwSSIB5xmHQZhlbcwmOlObnrOk=',
1605 version: '0.3',
1606 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1607 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1608 accessDate: 'Wed Sep 30 17:59:27 CEST 2009'
1609 }
1610 }
1611 };}(),
1612 '63e20b19028b7dd1465cdeeed60ca75b5f5508cd01601937ae8b0d1f981057fc': function () { return {
1613 data: 'lhtfrtBUKfNoG3TCgqmbvvdfpFUUGIk3NvD197Rqb0kxJWllLFbCvOJxQfplhuIhIEciS8fIdFDPnhXJxCT6QwMf3VxKc5HM7EpN0Pm3Kmui2lKPsBpduSu1GVy5N8Q3/FE41IZ8Jz+Ht0+z9wZxjSg4ptBAlh1HHiJEsDTN5gixN0J2/g==',
1614 version: '0.3',
1615 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1616 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1617 accessDate: 'Thu Aug 13 23:06:22 CEST 2009',
1618 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
1619 versions: {
1620 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
1621 header: '####',
1622 data: 'e5Tfxy8NhcOTKqnnyhaONWkAYgCwgEh7DMlhOpZHwIFIKp+NUAvD52nNwkpJk1jKyoU5M69MsIGpN/HWFa+Gz/pybmR1iTLUxLE5AtB+Cu6LgiPunH4OrLIl9wbWKiQEs8XGG1Qr3Q/JamLPHitPJi7R4vs9mzoaAGoM2+Q8FSEw99vEwLb1QwhjvtkaYMsOemRCRTLWkZvLgzp94D0QVMqZfpDBhoK/j9lFYVT00EuUEQI3eP0=',
1623 version: '0.3',
1624 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1625 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1626 accessDate: 'Thu Aug 13 23:06:22 CEST 2009'
1627 }
1628 }
1629 };}(),
1630 '7cda06249cfb102884a133952770b85d5442f8049db132d66f761deb765156bf': function () { return {
1631 data: 'Q79Uv28nlmk8O5i46/0qkpbJangQTW+U8zhkme5OsgEYpFyc0dtb3YR4CooaH2f55QVSVdny4kzcBm0/JQyrmcItgEIXpbaFeZ7U/ZIZUYAZMvK10JPw0b1EVDfOuychdeOEf4GHbV9sU599v/yiobKTo5FkJYnX7bVOtYuvM0ASBf690GkszmGzHRsdD28QYNUaWLbdufy1X1ovckyDupPGmSz/Sl7SJrJLU/K4+QqKDpg3G9DJbNR+UnAIDWrl1Bt7KJzeHHdCiQ2hw290iHkncnc9h4HsxSEYXavHaSfbKviyV9arPQxRP5B4fPAqO66XwHGoCMzA/SDNfkutXxSInY2iUMfHm7B3k/6zjH79mYvwIP71YY3vGoCrZRTKE4FoKzpDhxNLUn2XYUXFNDKzwSycGSeROWnyE2njcLbMnHhqd/aneNIsDSPCAr2b4GdNdpUPyUp5idfnJ+WyX/F5v/ijrt2XHaK5Jhla7kfGyO1GcWf0e+b+3g5CUXhUgyZ7zz0v2TPG1wCtqwhj44/Q4LORD4zeatSED8nLJkjj+0x7sD6aXvDSKZIphe1/kgpWzeDlUrPJZoM6MxNjvj5OWLdwEDP/h67T7FAeHsVJyEx93GNTsWLjsNAnQEOoTs9r+ru1m17EvtGl+oWq3+qRqpg97HG5+QK0jnz77evslTpotnoSKULq7yXZBycmzmzc6TFuTVrD8FYq2E7hzZ5fQO+D1J+7MB+abPuoR3uKZDdJo+7o1nIvT0fOj5fOhZeDqLokvkhERwdivLR3EKjqnvzHT/bym6psXEA/5ktJASfowR/vyOAhVdXtzMyqakdcFiIQVYmcpE2KUpHybZtCa/52wHU0LyE9xjxIZ0M/XQzbASoVfpqbrQCW/fLI7rKLL/TdlofkxeWDHbt3dPPPNw4opjg+56pPY9hHOk2apE7bWGxcqrg/g+CwCy/7wdhahIHIjyS4rI2kqQ9IFTZse5qrVMeKHpfEQydm7tg5fX18Geh9coGpzGqoKF5VOyEk0DNk1fLvb1p1rItxw46qfK1unjAIB6ftIRHDgvDG2h5uuHnviQjHVg89Yp/+C/cCFSCfIBl78k4QzbHiPtz0x++1HujcMLqYP1+yLtOP5orV8yu8lBspaK0XVJRbob7JvR6wkg2Z4JIW0cGEyUKCOA==',
1632 version: '0.3',
1633 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1634 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1635 accessDate: 'Sun Aug 09 23:42:55 CEST 2009',
1636 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
1637 versions: {
1638 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
1639 header: '####',
1640 data: '84khhUlnVlkWRw4txUcWD5WAGoOmHVY+HxNSlssYiGWOJErHmz3ASdkRCWq4epGjOOxC1sEUezDOOTyDSkCFs3HApOl5k80WLXSCXcjcXPoCiQSX6czufZUfR/OGCmYgeThAbKjnN//GauOEOCdB0AvXYMv1tnK9xTXoDRmOS9PxN6eUPDQdxJ9mKsFBBRRu+LEhANE7jjhu7IqMRmMxt662uo/52rt85GGChYk6qprzbmf1dRViZ4mIccXD6RpYjHsqxS02V9pC5l8u4i08DWRTbghu8fm3FRTgvr/xOZTRFZrGL57Vxps2/D4klKQ8io63uAjxSC//yeU7LHCXm84f9Uh99q+wYNwVcCQ6Fyrz91K9aa8hwHgXq5WJZa50vduwKpeLNZchEbGqLCS9eVT6',
1641 version: '0.3',
1642 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1643 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1644 accessDate: 'Sun Aug 09 23:42:55 CEST 2009'
1645 }
1646 }
1647 };}(),
1648 '91dee4945d6660e7c0db77b72fd2eed3372a46545da1c1e5600a80efd554977d': function () { return {
1649 data: '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',
1650 version: '0.3',
1651 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1652 updateDate: 'Sat Sep 26 22:06:53 CEST 2009',
1653 accessDate: 'Wed Sep 30 17:59:38 CEST 2009',
1654 currentVersion: '4b78e26a7c5ba770c11ca1f799f47112100c20565802ecdb8b0d736c1fee31af',
1655 versions: {
1656 '44aea76475425dbda56abc538b83cd270d00d8fdee6ac0575019bfcf4c719a5c': {
1657 header: '####',
1658 data: '9ZWZoxsnhlLjlSulSykBQr+WpToHUzdQ5Q3tcB/l9SePIhgQuHFP4PkA6dZGtLKazPj7EkJ0Slu3Y9TclBjggZVaA0hPpbxPm20hjS2RgFCboIWWOp8ib+xjy796TKGVGMz1RG5di8YUuSH2cc+YoWy9KI8+jJjiT28qT84fdazGag6ZamzQErDsPzMdCvxwF7W1Hd3QEA7AEU3dxvKC1LFuW4tsISrtoza/yBl3g+Vr4Ojcix3c3RnEZrhCQXxX6i9k2ASSlZytDg5dj4KAV4ZM6LZAt7hQS5Ff6IkF+5opTyM3Ahfg/t1FcAAyST74SOVI/+a/CcbQ7uGIFDYCfFWxkYwpo6fw/ezWKcqs88naHp2YVvsyfDI5OWoLCa3Kfhz1hvihX9tMFNoFi/9G',
1659 version: '0.3',
1660 previousVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
1661 previousVersionKey: 'nR7icOODtT2RF4o9EMxZTH4+qZAigTLp62lvjx+t9KZvpz0+JbFnmkbsp/X3tqswLKeOyQ2wCkBIKIuvc5ot6IJNx2QTVf+Nyibw4JGWiU8qoQ==',
1662 creationDate: 'Fri Sep 25 12:16:12 CEST 2009',
1663 updateDate: 'Fri Sep 25 12:16:12 CEST 2009',
1664 accessDate: 'Fri Sep 25 12:17:17 CEST 2009'
1665 },
1666 '4b78e26a7c5ba770c11ca1f799f47112100c20565802ecdb8b0d736c1fee31af': {
1667 header: '####',
1668 data: 'i2axYBOEjs54cYL/YuYRbYVWTi9AVokVcgYboJ4A8il9yQOqev59Veb9+/B4yI5IjRHsz1wISAKmcLvMaE3ON79P6hLvGmf61aDEeyRzWnfcGTBJ3Tf5o2SBsOeVjPIHYAQF3gcSHk/vyFAKq9FUMcytgqMs36V6euMMYT3p2n3diF/wMti0nnNaA3dEGHDCZO8KAm/VWMySWH1zMkjkQ7R/Fu8KMKMnsNBJcjX0wFarVZWbuo9xJODg6vEsz5+WakY8UN6YhG//JsyFJA1F/0eynpWhAtKalhyh0JlCBo2y57iDIIT3acCxg05UMog/GpyxMiak3/iz7LEzMcVqkU7M8PGpUpHE4JM8fyl0IvOgHULKS4jcoPCQKmRAUuFbbouKwCE6sEnv2TjD9FxM',
1669 version: '0.3',
1670 previousVersion: '57b997d24ed1a438f7174e0c821b0c7197b5d3e1d0240f0956543934687a9763',
1671 previousVersionKey: '8zvslkM62Woa4lFVxpxDCHteoFi8nAK0eC+/C70zuOkqmyKe/2Mu8YN1/hhd7TvJBW5JjzFElYm5cNv7KITHSmCe9ocwa23Bz/Txl/Yk84KC3Q==',
1672 creationDate: 'Sat Sep 26 22:06:53 CEST 2009',
1673 updateDate: 'Sat Sep 26 22:06:53 CEST 2009',
1674 accessDate: 'Wed Sep 30 17:59:38 CEST 2009'
1675 },
1676 '57b997d24ed1a438f7174e0c821b0c7197b5d3e1d0240f0956543934687a9763': {
1677 header: '####',
1678 data: 'dDjbpH7b47K/OR3x8DFAr8317ojvn2XU9UeW9XCXNDI8ilFYvhDh2YdKiaHnoFe9c5nwqHH78g+V/U8xmbv9ojvuAw8EAqhOlen2W3QSi4oh3eAWXGJMc7QHMDhP38l2a6NG/fLCYE20aKof0thHYAZtCA9xh3Xj8P0URjPvzPEuPxSgxxtku6wrpuUJVmE9L8iM6GMxdtBg9ohnhknnwUQl4eWYEIWmANTkVOG+85DscW8AWzSCnGlBxSn2B0nYiYcVIbv3pIh3UwUK/VOnCg3J3zqFx5pL4T2pMBFhXMSH4Wg9KglSLPb2N1aR3+1l2W1mRWy2TmqBRmis6SKz8VhXlU73wPiL1xpdSXVXGdNTIkDLkP9MYugdF7vu/u2+DgPmbFZXNcEWaZP0UwWS',
1679 version: '0.3',
1680 previousVersion: '44aea76475425dbda56abc538b83cd270d00d8fdee6ac0575019bfcf4c719a5c',
1681 previousVersionKey: 'Dq/81arpQSERdDNvvERMt5uVHxOzjUBKZ3bxe/CRZI6zdf06G19iT5L5Z7I0ZKUoKEoJNRTiB5Lh7PjDNibtY4oYRmmKXpUEPbiJKp351W23NA==',
1682 creationDate: 'Fri Sep 25 12:17:31 CEST 2009',
1683 updateDate: 'Fri Sep 25 12:17:31 CEST 2009',
1684 accessDate: 'Sat Sep 26 22:06:28 CEST 2009'
1685 },
1686 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
1687 header: '####',
1688 data: 'osJ+5cwMZ/4Gq8WSNeRGwEJ/On/jDfUapgeyDYyGzkIznGaBIs74iT7TCv/i/EfJjqJQWKT5CAMtGngGjyrSC2wlhTB29VrCagyhYVZe85FHHLqxShwXVXMlCTPqxnJ+tUWAme94Lq54W8U+/zsFBqRhxteWYcfsAT1eGxMZbHTGU74OLLYCemh4jcvV55PGg7u55MTwzUebPlJvrFOg2KIqsqUYWuRzY9TjEWTb582rihGBJmj6SrPYcBN7e5j19mKtestLFMOw05oEEFNTPWaN50GD/8IuwHc2wZyk+VNxV3NDRwwqnGiKIkQTs/ddmKe4Ny6efvBXH8a4eDvDxlDCa5UHbYAT77RTg9jFS/pNeoHp7ZATy26/P5C0WqI3YfKfvuf8H1yRMzhDTtU9',
1689 version: '0.3',
1690 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1691 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1692 accessDate: 'Fri Sep 25 12:15:47 CEST 2009'
1693 }
1694 }
1695 };}(),
1696 '983f262760a45171a8dbaad13a7c87b8a3dd267d1cdba7850b07e58af0460378': function () { return {
1697 data: 'NUhdggGXc0aw9EgLWE1zCX4yTNZo5rxAvXy1e/i4IFQfromU3ARkbjBkVOui/VLrCmiExe81XqujgJHOqVp9HrgGuNxeo8ODqbD2p+/1YfxCzconrCggYf2eSvsIXuBuYJc5bGVdG/Mcp0DPedM5Gw8MvU4ix3EwVvIaoUdRi3RJYlsO7W0fPQjcWTt3rhLI0lkGTFvEbaK3b5Q0xv5mBup3w+SISIqDAvbmzNhc2DO9BzbcW158sv/+hBe9IHEtj5MoX/gY6pBdg9Dlnblql0jn/Mrfd6SR+1FAv5mS+NLqt6NHejs+8n1xnx3fOv1Tp2JoR+WbHBhL9wOlbMUjbzhM6XXB292Mb+KsqAzDdtNe/3sc1krIaSxYS6GwhPhesZOY3L84iUhAay60qdB1AQa1PDGPM+lkFEI3uqUZu32uWqnuudFAOTsgKcWVSTktk8AMD43zGbBhYKu+9cW2Ye8U1lL7E3+iI8fm8HnRiuWxGB8zKoqUZQ+FDnwiSFSsBYlCa7iLH7F1Cz1AjhCec8QsdlIA3TvbiKzzLCTmGZhezEJP8JiGifV8CDmWnrsRxgBcGj2CXAzksn0tuMGyBA1WwzK2DVtKI9utb9TV8CASn2uyzrr+OB5D7KPD0fuRDHSK2SEVPFkP7xXyLEZkFWy9W3I5bYyt7j9eUhHX+uk3WdT1onYAzogr3AhVIcMQSAeoyrxds81WaIyy3hEs8h+QzWVKhc021Xw7S1z1j5v413RLBSolwYaXrR0WjcA9VDnn+vOxsurR4y+Eca9T0+Fjt5Apzs5+nSarvi5rQbr6ggJVQ66qRv3SPIs/c5niiIVEK83xrY1fsEnjcJf836P10Ho35URQzqMlggICI/uBc7zgzPdkMBIvySqrCk1gzZi9PcHZoyNZO0i49mpGWnqDk2V24R27T9FwGkvRunOGw4nFS59NE3ixYz5SWZgIAayPBNJ5V2sSM3hUJAqXUl2vDlyXlqhhW9n5j+7nXhlwgibQ0Rk65QchlAXbmwm6QrSOX617DYhcBH12aUQMB8cQgURWmyysHV3pqvuLANvhjV1u9wkxfzuOdDJJCE4in8W2VUCTcdDtWg2L+RDAjvNGHFeLNmYD94JWdbtYRAGnH6oQWE8G+z1fgdnY6u8GNx8WsIH1thxHcle9UA==',
1698 version: '0.3',
1699 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1700 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1701 accessDate: 'Sat Aug 08 16:29:34 CEST 2009',
1702 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
1703 versions: {
1704 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
1705 header: '####',
1706 data: 'K1a+K0TdDtLXo6e4ayBuwGN6XSjub5Xgy5ogA6HWVqe7tiSoi4Lo7qMloK4TF29YPB2KpHOyxodkXL0YpqztESCrBK+F1Np/t/uThl7iXEFNSXSIz4l/Eo54UX/PZEmKZ+4nMiuYFgMq1rV3VLQmciexJkic9rABwnGMreJfKyDt2fEDxdVUwZXnA/l1PPPGFVSJmkNRjW/WLRByOMwJxHDK1ElbIFHdkFRzg916aPTTjcV+KpUkSligoNlxi9CgmfeBweLuDRJL75Osw3ha9WjQXrjTlr7o4sSVud3gbivYmJGgbOTzgge3K0A6ztS9+8dvvQleR9NETiWDDhJ1+3Y00jXc9jgOEyAQklD1dQ2dew23fvIVXSofVpr5lp88X6gc0OnD90BbxrTxjL0QYIMlklgTq40vNck=',
1707 version: '0.3',
1708 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1709 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1710 accessDate: 'Sat Aug 08 16:29:34 CEST 2009'
1711 }
1712 }
1713 };}(),
1714 'a0d5d8796793035d1b109654c68d34b94e2aa64b5f76d50f01d9a18ab1cdfd5a': function () { return {
1715 data: 'dIOpF0FJxZCaFDj1XeU1L9/CcnHDffBgeOxN30sAH+++Dv0+skIYibSLkbc5SFOFKkZtKGeXFq1fZW1Uynj3ogRJ3Qqb8+4eyBiwViLXTFefYv/g0LcHqUYBrRwYpsATZg5VcZpIvXzwIT0N5dtQoh8IskMovV8QgBICHDAJImB64c8bDjVpSn9GWMSiSqsSOu+j1IG/C2/Qxxt5smKD6iINfJS8Y36iovV9vRocW1crj6mHatJxut/EhWbKrXA7U148q2/08EZPfAS3q+Onv0VUaKxgB2+nhsUSYjP3tvVlc4LS17Q9CnbA+eNYz/DfsaMtnYKTcSh/91ViA8Kv1AGzEbWIMo6On8shuf691bzKBdRG9Fcpm5Hhb+DziJ0Go7W99yu4n6exHAxJerXpcA9t5fpsTH4T3lGhbWI5HRWoU0jDqwdE2J5jyZaUVf78CjfgESRdJuOKIuV4QX7xxwRJP9vcDHgyhr1LcscVi96XQHnii/tl+BAUYdwgvv2vtTmuoR0ydtweQbDjgLXtk/zmyYmP4dTIYbU/Qec1m4E96jZdTalWU9K8AtnopuqfLdTlFG5mGtHrRpRpmu2o7b7P0v5V/WpUpPWzk75sv2AsFD7oiTHuZ5GKUfDs8pbp3LcMNk3nSour1NyiDWFB022hwbEk66aQaNxJfCKOWwWimc4TfxhVG0imjtdlp3MdcWcAY+tJMWklDm/q5QkuHy+JxfNzHFRI63+c5+/KSFHVUfZNoIRNdDIlnTiX8zKojU2X0QRzxEc/LYkIpon5OGRnJy9Rb/HotYbovBC8yS6610ttGohDp9v+zVO1uST2COV8j8p5iBJT+YVgQvLGXg/Y6ZQw1X8nGeQClBZnPZVhHcnTtQV3tyBdsc/ZkttJ5tLW+FF9hAt48IBnI1um28Fhh4y55rznF2W4U1PyJvsmVk9eMK6ccHCXFNvzCN6XUDY862pm4atKSbIMQVuT9nOC4G2cSl2/Pte2W/s9A0RqeU3kpZg6inXYNknhTAufQc8MBHuNPkMJGTOjOA/MUKHM73+b5Iaz3pBXKiw0qlgkfsGoRZ4LVI3oU10geEqNoYeeseDU1o/UDDC1wobRxy6mrob/EstC3zoIMvM651k2h0Pj5KbjE0+I4d2mmObIN3R/OF+hdeVAtZYwuv9aa18nTlYCx7Wo7mGwzPhFVThaZT1jgNfHVFa7lxvcdi3zo5ihhPUXjC11RrcKcdINMxdvQpa/xfwV5VNagXN0D7aXaxVQj+HTlttXx2v7ElkhpLpTA632ggWBdL+HZNdWMPjE9pZO3KhU0Zg7x77wfrj3tN2QC3uDUSOJOCp4qM4=',
1716 version: '0.3',
1717 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1718 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1719 accessDate: 'Thu Aug 13 22:43:56 CEST 2009',
1720 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
1721 versions: {
1722 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
1723 header: '####',
1724 data: 'vWUk4EzThQjfNp/Ji11ZI/fO3n2sp8iUr2Fahuz7Cl7uOCNnXXFoHlbbvZNgZsrVVmK3+YV5WxblVxQYlH2IRwdXsvkfzV7S8aqJ4V11tgst31kZ03vQ+pfPV+26Nhv32sLWLK6t/h+Ap701KpPsng6rrWd9YgSRzN0gQt80aHZtxVknZcpAUmh1thx/VaehNWEwLPFOvcGr6H0Ku7U6v/GNFyBmkgPYMh2Bo0VIhns0s20mgA9L6TxwLcMYikU19WqxX9GO1n11ii3WAWA10gfFjAwYagnQiwpl5REU73I5raYI9XU0XjouhRtkMMBtCJjeIDb3GCQQQZwTcVFXeokjtAlP4JHdMy5Hrl0LvjpDI77OU/rDHKPc5TqZngvFk06TjoQ7pg2cm7c8y34=',
1725 version: '0.3',
1726 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1727 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1728 accessDate: 'Thu Aug 13 22:43:56 CEST 2009'
1729 }
1730 }
1731 };}(),
1732 'b81f9a1d9267daf4afb786e8d477c15aa3e1babc59b8ba09bceddc700116ab0e': function () { return {
1733 data: 'bJdzIqpYsh6++iVT/jTS6bj5SgXkW5alx19H2laFERykhmkA0hxjOTaz2Sizlcsg+NKEQIASIjrVrLxcoIVnCFeJjDv4FOEACpMxNEzAiWTppWx4h6hepKT+h8gtkF4k6QvvVXHBXxRahQT2tqsbJWmOgmxdIBEeNETZb0u7gD7TjI8ATetaQ+TnhKlNbObUd/LsuJsZuWwpeZllEtNTrwNOrlHQJAUe3u+xI9O0lVBvH+/KHX4L7QyY98O/aI5wosDWPUZyv811PKOCMCsL/+2qBrH/D00YA+gCPy24riBrrK6RJWC0BdpSAUhPZA3OJSm1miqHNC7/JCUfH/alVMaoTzrI+A76LouteQmwZrXE/taTPY8zLD+TCgMOGhgxErVcw6278PQSfuERIJuXlCiXX1z011JrRE1k6JX6Ual8gwENvYlbXE2/iv/xzXK3WtI5vD+x0kRqa9LAClyhSqY4o5QXlEBJ663j9PxH/+vC25tluAtupL0nnm4sEtFmVMiZ3S3cRRZ6ZzquPD6rQjzdPpAJe0S8anC4Pf7F86Z+Ag3lbsrmV9Y5uDhx1T9pyWaydL6NzyJBw1gjgobSOw1wNMAzn+kGLqH9dP2c+Jv9zp60vR5Ljdf73jPxWcVTQxHZzXuWfb0MpYTwRDmpjqEsIKkyaYu1e7YHYaD9RNro7Aek00n4DOkPJ+lQHdeGLioNYraYwhQq7Y0HAKFsUYxv3o8vI6X8YXk6GgbhLXjBIyly9oyVMbGMShCuDE2dt+skM5Y1Wd1AcENJ+YzQrRwc0QWrYoABy/MlZbhgh4LpuQG6WajXw2kgS1Rme1tMviR+qqtnthsdWClKp0y7GZEA5ycBKABBX4RDrwIudiitswMkvBCrSLAxT3KYGxjlPwhGShf+zGiJ2vS6mMh2KS5rrcKaFtYsOSfBoNDpPaK9w9QS2W1EtwuUY4zZbUO6V1K/URx5PkZrSAcIRLw2CjLad9CbyhOZ7H1mW6ovHYXHwDPAVU4wYEqO0213w50QyBOM',
1734 version: '0.3',
1735 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1736 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1737 accessDate: 'Sun Jul 19 01:09:10 CEST 2009',
1738 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
1739 versions: {
1740 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
1741 header: '####',
1742 data: 'fUzxKwUtvtyjL1kIN6jfxjZq9CWEH9nlvSbND8x9sn7cAhmyuvmYR99cl3e8GJ23uzxHn9uKn5hTG0uUHXBMrqIpCw/QHzu4FDXWS9RrR3iGJba4DIBJPY20VpFJzWr9xbtnC8R/TDt0FXryE/V2ibiiF7dXNucbhlO+dPmyDXQpNDQf9QRRpPILCyfd01DSUVlvr+91DWgtGk19ZTAGB3Cl9WuUtRHUnBH9JhKLEohzou5p/1KcfEFwMZ2SOyiZPwwBP1NqE5fqHXqzPNzvvQL6bDxH8czkAfMlw3URJfhnlSuSKa/o15bdwMLyFaNrTjod3Erw7uvPxpyFg8Sw2yCOM4xJ1Bn88vttklNQF1ut5SkAwDYi0wUbbyP6CnE0ItVvc3MKZx+0r5RHzasJpQY=',
1743 version: '0.3',
1744 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1745 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1746 accessDate: 'Sun Jul 19 01:09:10 CEST 2009'
1747 }
1748 }
1749 };}(),
1750 'd8568a483a8f443190ba723b391960554962760cd886b2484f2698816beec530': function () { return {
1751 data: 'PKAlMlebOZaZDdwgP/Y5cZBzXYLpBdppooxzQn7kzWNg3ut1o+M+bpfjadwdM07MTtU9PpdanlG4GfDPf1uPn/XYN4msUo2V68J/tliU7M0q2t2PKqA2YUDl3UIxMlffhvyYBpwsdary+4t41pKkPjFt3/WSthLyn+E44BbjAKRbpp5w1y//GscTXDlQzdDGoSNdSjpu8hx8Zs4tqf/9UnlwH5kh6Wzq7+Uf+eqiC7S4fPfZ7G0OZ7+N2oKHiV7EBRSX4s7vcrs5t1S+v9HUhk6SkZ7mMZBjSg1x8sB3ZZB2sLAx+QCJPyKv9+/uZLrSMe8uFHBI2H0dx73mWXE/dHK8IjG9mZs2riA+KYutHT4jV6ja5JZeLWWuZhKzooJoSk4A7cbd2zxvkyaqLkscgVBWYWf212EvGZN0ardI1fW1+RTE8QchyX6ty1AyjbU2T15HKwLvdlL0v5aPscZPQJwptOMCrjYOwkbMTvxe8YRKZb1Z1VzyCn0m7ODxz0iXV2H6pj2hierKuqeOuK3HWV4rk584ctE2KBIHh7WJnkqRYKCCQ1s90T8SNkqQiEow4Bz509seQ8ZRROy9F8GSCOeIQS9DVbQkRjgEOMo8DFSTNT1HzBiGhcaQkweh7+V7oAx21v7F+UYEIIvHlSvKXTEA6rK+eHunF1EHRvoGGTD61btaaqpfn/Z53DKd0AMGK4Uh3eSGkqKM5IW0mgebs52//xQI/BUrEimvSu5u2UYLh6V9sa/kT9yNv2BfnRckGuNvaNvQBrw5LFOfK59UXeO9h6DcWs4AErrj9afu29xHFI/h+HdaixEzsmrboBqEn0g3EghL+de7N8z4CGGQ/CzhIKmAlR5f/u0YC0xebVNLSKUzTi1m3nOhreywKCO4C0kzwbduEX/bJ34SXuYOpkjS4W+Y1mdd6tnsAPsY1Ku22pjPQz8/aKRlDvIUKi7R+6Sk6Q1pIpcwh3hvEkN1OSBea1BUho4udaulPolefLv/kqNwQZeReztukD7sfgpZr3GEocBwnui+cCLj6WpVu2qlZpxGvnitmfJbaEEw2HM3RgzibGtsybeXwWK3orcEnPqquApWtnTXP8rhP9TBW8svHA1NjCgSrvDbjmSUPsRAHkV/zlXhH+JJZMv7tg4BYNuukJuiBFn/EewEIA==',
1752 version: '0.3',
1753 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1754 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1755 accessDate: 'Thu Aug 13 22:35:14 CEST 2009',
1756 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
1757 versions: {
1758 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
1759 header: '####',
1760 data: 'wuvj0q69S3FdDA0x+DniTe4no4vW6EF/xMiRD5GoDdNYxx6Npyxf6h/FiIjujncc7GK5W+p09Bqh4mHdsyBAwe/Y9c5mshB9VpPgsF9YctR6iLnOs7TGOWUJ/ScgskhagSGZme+huFkFjEe57yx2FiiswUW2XVI1SPtzHNx+sAGoL+XcB8B568zTyU50IpJfXlXR+10OTRMekaTUyNmNF+hT4FnRXQKY4XL6NKSvSH/7gafKf960kQhJ1HWI62OFYER04ANTFLiOdhfZE7YcEIG9W3G4UFPRI7NyZRewah+ETOLSrTdbhItY0kb+FrMrhNSrHLBjg2t3xmuaptDV7BoPYtTfOaD5zgwPgUCj7KnnbamgQiABGjKJnl9GMC3bej4KpKqlgMrHqUqu9AGVCtUc',
1761 version: '0.3',
1762 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1763 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1764 accessDate: 'Thu Aug 13 22:35:14 CEST 2009'
1765 }
1766 }
1767 };}(),
1768 'f8141d3cd5cf93f3ade420838f98e4bd0e5206d202b45a24822afc9099827c17': function () { return {
1769 data: '6xoQmnyFcq066ExiktwoyXTDnu5+d7+7PwMtvUVX8AjU/1jJJpG0tN4FnVWaKIngm4cdyh9Em3F9iZ2wDJgQ4+IlqVAal5pFgA3gvsw8awqsOkQoibFcmlatSO4H3vExZ9P4vHFherBMIqo9u3zwqUClgAFEyw0UlVIJ6VIsE1qSQFksBlnxV3sKu9kjigYVWd/KodpNqiOiX3CEgQGmX8bHTh77VWXNFkYGRaGhZvXN7gx9qLSZwSLn2fzgxzBbjOlX9Wj5tQQ5pxev5pJd19pPAmbzJZcdZVFtaiWh5A8wwROX44P4X6qfcNWZt/rx8DRdtLGKlJy0GWTQMZXVeKqmE15I02EYeOPPbPvE81psZfCu+zToehQa86l270wbLKu8Cv+8Bfx8XJBLsYLL9asv6XzAoLMG2lWX/TkAPavJb8Doqpi+SEeK1YmYg7YE1hyIEjDrsHoUY1hVxruYfygahBDEoa4pyjQovhq5d0e1Arnzfo+LD0jcFuxFj6zcLjoTx8ugs0X4A0PeP5BG7VYuGYx/mBIWsu+0ksjGlkmC4EIHJpHbSeMUqfTxoMALmdg1Y8oGnHfCKhlr7ztjOBo+nE95iMQI+L8Hwnjto0hcotY/ualKzwDXf/BvlxlNov+Z9DWvMe6q+8yqyiVZE9HD7O7goienh51Pa+wV6K5jdnzCUTrK5ygk6rfbA6tLdjc1kAzCU9oJguLSwtM4z7WMel2V48kOMD7FaWZHPCatweKPaanV2WCeYhtc9X6OvIJWvv5O9j7fNd7xFByZNORQYaHFN+5xONOVJ6T28TtDn/VdVc8u71kfAYWLEG0Au+b1GY9doAxHwNN5hcP1uGHEsc5uR93qgiQLa+zZbUc8to1OylcLZY+yWdyiyUEXM01nZH6ZYuDdRUSiS6WkM8KPYLwy3NpX1Q3ZEC3uM1yi8589scPl4JhCd2XBdn5+iu231Uzu4O/fLTmN/8kNNV00x9Xa1Rj+0+Srht2WDgJVcTBoODikoh4733txmOl03KFCQd/HrRIS1DE1hrGAQNexh0Om7/WO+rzaSPmzFdyskqF1bXek0f3V1YROWxKIfHF8jz/wvqVgsGEtxgtCmXqyT3dRZlKUxNXn/ajgbulsensAQxUEpeB3OeVxNPl0SExb96oLSvMrLJO02E7hZLkB116ATnqN/GVtzHJzQLT0c1HPu9UuGQPv3D7qWpx1qMABuhaHbpyY3OcN6DOZTHuOzdVETIkYlPoja0TMyt6iHrlOM3dFtVDUos+TJyVSWjBSHVV3b7tbpGFulSan5J2BWbCNcSCMSfJFOX/U/JlovKAodr0Li85K6nej2XI4N8rVtV9ru4Ktq57/z6REvoBaIS2YXUOm9s2YhOA54CByVWvKXj0Pez6U7YVJvsviYtdp0IxJE6OrebzpVx1skZUFPTbcmuD5/GwOv6PmgciOJMY/nMQ3K+7F3A9AZgPFihLLPOh2NpNhoj5Zy6IlK3ObptD6I41HHlN3BsADzV2buAbcTDyYYZJ9VkBI2ZkkFhrcB1WM+qrkODiPxumXYGnGSHvbuZq0m5k8Kw+WUblmedHyMCLNEiwH2YQsaRd8s050wE4BcKnNU6wPn8HExn5b7CFjMJReiST08BMcszUTT677QQOcsbGvNPq1iYIrv0f2rrNHKhg2Kq42+jvHYxndfuxnTUjecCGtiGpuLdh/iehozSjuZfV7fZWhJsYOz/HAj639sJy+BMg7+gQv/yrujd1c0n8FixDryiogKLfxnnfWIUW90rRqcjRW5tn4mUfhf3eEP83PmKvafvRCyauY9Ho=',
1770 version: '0.3',
1771 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1772 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1773 accessDate: 'Wed Sep 30 17:57:12 CEST 2009',
1774 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
1775 versions: {
1776 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
1777 header: '####',
1778 data: 'IQcdAD6W2pehgomwdoNVtFe+Aq4PAiHM8lngNDSesbTPs7dzFL8DR9iR0VdPUfnpL2ddaWB1dkOI83hQ/vFZUeAHswU/6Gmg7KQPpciVsbNMAHkxidDQMncMvU79oi0QRUvgWCrVbpuNd0J9Ir1vZVU2UT8LNXi4RibORSLhFo1GIyy6Kss6GOvDDWnUzBV6VYqzcv/nrLDlL908CnbmQhCaoGd5j/TjC9Hx1UaJ/xfqOwPP0jgw5b8+ArB8tICkpLbEEXSzKG64hGyY5DToAo5FS7QvZBXhzhm1qc0VM0RCUcvU2+sCm5yvT/qV3LRPDHKcoqle2PzlumsxyuiAlI5y9UaT+6GBbTrJ+FeU1zm8fVAyg3Q+FZWN8A/YBj1qb38z8E1D+38f0hGv21QfYg==',
1779 version: '0.3',
1780 creationDate: 'Sun Jun 07 11:22:08 CEST 2009',
1781 updateDate: 'Sun Jun 07 11:22:08 CEST 2009',
1782 accessDate: 'Wed Sep 30 17:57:12 CEST 2009'
1783 }
1784 }
1785 };}()
1786 }
1787 };}()
1788 }
1789 };}(),
1790
1791 'test_test_with_otps': function () { return {
1792 users:{
1793 'catchAllUser': {
1794 __masterkey_test_value__: 'masterkey',
1795 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
1796 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
1797 },
1798 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
1799 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
1800 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
1801 version: '0.2',
1802 maxNumberOfRecords: '100',
1803 userDetails: '{"records":{"index":{"3f5cad41321c89a0570c310f8e994a13c39c83842660c540960586fa9f2d2fc0":"0"},"data":"cllv5EtmluxBR3AWjet3jfZsJZDUXFddl1hIO4285PJOUymk5VP8nxLGSkYxkrbwIKHxxSERdwhcSVeuz+QJLFzx4hP/wngSNJT3edxh9pwM+fUs8nJunyK1LNS1JatoaWOIobTV1DbotfvxGUQI5QIxvKA="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"1FTEyUjZ/MS1Kp91l3j00WNnOel6EFQhAYyAhcr90ozYwu6UDqlKNKyp5f2ndVZS36ReoxXbzIUYUJoaQegdvic/aVfyU/drjqVA/Ta2S5ICR050ewTUBs5BebBQT2WAMzKhmhQoKvMNCJFpNhLhJ7sbevyAHX4lZbpBUz92hTQ9jtpTi2pZ7IBUFI3JPV71H0reIs8FFA+Ugx3UPVVq77famGm5mh4I0rjY68zVvqNvfB5APM9OKR+AM3jkSHUa1QEzCEObMndR8WfKEyXlYoEhnhr1UEra8v5INHpSacU8210="},"version":"0.1"}',
1804 statistics: 'tmRcqihMK0YvsnFoMKH5F/rN',
1805 userDetailsVersion: '0.3',
1806 records: {
1807 '3f5cad41321c89a0570c310f8e994a13c39c83842660c540960586fa9f2d2fc0': {
1808 data: 'nlihNmY5UjnGFxilT5LoDRvdp5WoHausCTiulBY9/Fm82ZJCEZ0mwH96WzsnQ6zMvrZPFHAr1zGAQPr82/MOr7xTVILjbEP6MKq9rOyEDRhY/3CVQgJVWLPfwiL9ihw9jKkd7ea3eU/RSj7V0UQB1zXzEXFqw0FwQcpSuCOl5hkYPecydA==',
1809 version: '0.3',
1810 creationDate: 'Thu Oct 01 16:21:50 PDT 2009',
1811 updateDate: 'Tue Feb 09 08:57:03 PST 2010',
1812 accessDate: 'Tue Feb 09 08:57:03 PST 2010',
1813 currentVersion: 'ac353e86f69528d21dad0b17d00bbfb3e56c954e2ba71d0d091c903880ba1479',
1814 versions: {
1815 'c84928db21b880a53e7ba1e51eebc4acc4b2bffe66f30368b8b7070973f5912a': {
1816 header: '####',
1817 data: '0xBSvvZ3EJhc/PmW+8PtpaLSAOmGo4i0sG9Uwe9RGbzDILvna447spjscE3IxIucj1EuBagtc2hvIT/tgkA5IIp4fq2dSvk3RF8h5+hXPy877tEZkiQFpigyUHd27smpYDSYc0Bzv0DWx+eR72TFIjwbU/CXxKR3qqyzma+q1pqIf1GiaZWlM+Qv4xmKEkJnRd6NdOyTwuAQoZ9q0O9pHtkDQ5eKQlwvuZuL+8Tdhn/Mvr5HzIset+4wo5HNvmkLNAtonChJpWWnj6Gc8LTI+ImSjM5PVku/O/pJKuCYtMovzzEoNuFWrtdn9XESKF3yjtpKzuDxsNPrfX5Mz0iBZCefbWEtmqeABn3o5IgkpW/rhSmsyu8UcCoq91O+Yb9+8qlcsJyjcLECd+wgkpN926vcg/LMTWUW6Oq8x1a6mM8Bw1u9kT0eZGgKvu0CZpv3bpgVAWbfGW3aTM/0moWjHa3amJaL0DPjF8Pe9ujUDlqVEiPHznzfS+aVB+M3DtjfNEMysab77imICRs39cm6N/XAz+CNnSuP+W4WPfbZZ+3xWU4BgS7YXd/AM5rlI9sXNQQgzVmQttNo',
1818 version: '0.3',
1819 creationDate: 'Thu Oct 01 16:21:50 PDT 2009',
1820 updateDate: 'Thu Oct 01 16:21:50 PDT 2009',
1821 accessDate: 'Tue Feb 09 08:56:46 PST 2010'
1822 },
1823 'ac353e86f69528d21dad0b17d00bbfb3e56c954e2ba71d0d091c903880ba1479': {
1824 header: '####',
1825 data: 'DGvb5Ur86eYxzJrqITEX5XqtGQT3QiaR66B2vw5F+6fo6cxWwCztnoEFyLUPzZGWqYMIIwA2rKaNBW0PxO1ehu7kyyQ/Tj42g64JiI4sVtb47W5/En2blTtkPe1FjpBiVW9ZaTDo4ia2wMzrBxTpUJ/NCT/Hn/xAyhZrafL+SN8U94F/FX6n5x98fV9KwrtjPpqeDEtfwheiEzws4qoPy1arXgnaECxOFnri7KpjwE8WVzwbU/WFOGPewKY4bLcba4pp1KjjObhVcYyj3K+GkSHeXyBDQqZi1grKvGOGvoZkFr7CDndseaXZ8og3A+NpqPcOzbqNst97gsky2RWc7bD2MfyAJ+QHzw5uDFCoKnAv5VH1HxwkShLb2QswQFf9/AGT3IDFi6ssvELk8xSMTgICV9jUwcTwkjkBa1Zpf4GTr6qrzen4YzNeK6XxgAqueKFbJoC8p0l1dBGBoH5zP0bkh3QENEFk67FT3aXUtInP7ZDX9Fnbe6qPkoztgmG7TukNUs2pk1Z/iJTVrUdLTVtwFI56LaTfRT8Ica+yFJc+1zoKeEg9LKcnbgfPY6WK58o1vXlhYb8j',
1826 version: '0.3',
1827 previousVersion: 'c84928db21b880a53e7ba1e51eebc4acc4b2bffe66f30368b8b7070973f5912a',
1828 previousVersionKey: 'vy7sCLt6q3xaMngGjJxVLcYe60vW0LHXDVZGo7QWZCIOjK26Yn9JvpeAi4rKJ0/ggGGyYJncqHVr68u/VHuwJRUmlRb7JRk5k9gJOyuroyx5wg==',
1829 creationDate: 'Tue Feb 09 08:57:03 PST 2010',
1830 updateDate: 'Tue Feb 09 08:57:03 PST 2010',
1831 accessDate: 'Tue Feb 09 08:57:03 PST 2010'
1832 }
1833 }
1834 }
1835 }
1836 }
1837 },
1838 'onetimePasswords': {
1839 //OTP: 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg',
1840 '7074103e8ce35f813dbfb9c90665bd66ba3f5b1c9e4fa7a3d8aee679b7a38102': {// reference
1841 'reference': "c3664af5744319c6d3b874895f803df19cb0492acf27cb51912110d023ba9b38",
1842 'user': "9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8",
1843 'status': 'ACTIVE', //1: 'ACTIVE', 2: 'REQUESTED', 3: 'USED', 4: 'DISABLED'
1844 'creation_date': "2010-02-09 17:57:14",
1845 'request_date': "4001-01-01 09:00:00",
1846 'usage_date': "4001-01-01 09:00:00",
1847 // 'key': "7074103e8ce35f813dbfb9c90665bd66ba3f5b1c9e4fa7a3d8aee679b7a38102",
1848 "key_checksum": "53739910c97d74c80c6028eb3293ffbc652def811d9aa11725fefa3139dfcf29",
1849 "data": "aN3rPl5rusBWXveUpjKqZNFLRPWJgH2Zs8HYQIaS65QObQFWFTZ8lRpBXFoPlvSOHcHQpEavZUuq31Y/2Y9sI/scvmZjQ8UEaT2GY9NiWJVswGq1W3AX8zs32jOgf1L5iBVxK54mfig2vXFoL8lG0JGGY1zHZXlkCvFPWuvwuCcH+uRE0oP3it0FvNFBV4+TiiGnGYgD9LPAVevzr/Doq5UXjn9VplVU+upeDTWY+7rlOdIOnZG/A9P9/dQtsyMb5c5zABD2FNpQQ40JDfG/nHt5WvfuWmPwUisW1181oBAd5BwF9LgVHdrhcSh8OuUL7rdbKTPTlWT826I6JNrFMzYGMY+NV6gllDvc6eCNrgI98ABhL1AoZNpAXXuCy4uQhEYmj+O71C/eXEDw+crMAXiCn6SZrbTM8GT5TQ5yF2NcxhudopO4qoILjnwEHZZ+i37kRDFg6oCBccCD67oHTPexUkSqnKIIYLli5CdmE7UdvX6LuVG/VYJKevOUgMf0UzHDPgvtlp3gsSo09TfNPOtoeAiogL6cAHb1seZwv+6E8Pz7WqkkOTsBQYeHIfPE0OnQPDtUjVRA5MTTX5zt6rCCNDKNbqfkPu8V4am26ykaWOSTXZYIcfnywkG0TfPzdAyQvyxdUyl/r1b36bclQFiXcRzkz9zS9xx14Il3QjYXRbIFWcwm/mEFltBFPdATKo5Zh+wcTLiFh56YEUVa9/h6oN8281X6zxH4DOw=",
1850 'version': "0.3"
1851 }
1852 }
1853 };}(),
1854
1855 //-------------------------------------------------------------------------
1856
1857 'otp_user_test': function () { return {
1858 users:{
1859 'catchAllUser': {
1860 __masterkey_test_value__: 'masterkey',
1861 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
1862 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
1863 },
1864 //username: 'otp_user', passphrase: 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg'
1865 '0faed660854b02a5eaa7140f58d9dfee875361b353609f638efdd013b95458c9': {
1866 s: '61994a953b7c053abca196ecbdb76547c9936654a434972d3d1de84e927077e4',
1867 v: '9250fc0a479f36b9aff3fc0c37e88169cfaecd25c2c6d59ea2f58271c2106265',
1868 version: '0.2',
1869 maxNumberOfRecords: '100',
1870 userDetails: '{"records":{"index":{"a1bf4f4c924a10ff0e52bd9f9e7efce8b09e97a5b0389b1342b4a62226be4cc1":"0"},"data":"Yw3NlPSpFc3YQl9pMh2tvcVWHVwISUBoFGqlJBwxtuLb6vpyEg9AJs1LDjtLd+4Zh3rkBD8Hnxgc6R+DpNBrVAq/hENoMVtAtFm9FznEQO4YOe0jKGJei/jTRrG3vf4pWG92jUHd8JDZ482AzArp5leaQXC7Pg=="},"directLogins":{"index":{},"data":"a52Xx78tyoffHRu5J99fr3sH"},"preferences":{"data":"AFqk+zN3X8UzmWw7HI+p/BvL"},"oneTimePasswords":{"data":"9iwi/ScBH0o7SVZz5nLvu792"},"version":"0.1"}',
1871 statistics: '68Nb/l04isS9JcTQf9bmwq5/',
1872 userDetailsVersion: '0.3',
1873 records: {
1874 'a1bf4f4c924a10ff0e52bd9f9e7efce8b09e97a5b0389b1342b4a62226be4cc1': {
1875 data: 'hNdplOo1+O6pW7HQ6ReYx5CBDzWL3oopwf/7dMH0RVMYHu1LbMRZDRZTpjnLX33UoCkthF4Br3xkLwg5gDMuR3unx7Eyyf35yZj3rcLr+ckj/z3rV2rlBgVahwV5xh1E3nVXiZueKG4qUqQisnrJWj3Cl88c0KlXtsMew2s93l8OuJJS0g==',
1876 version: '0.3',
1877 creationDate: 'Thu Feb 25 14:11:54 PST 2010',
1878 updateDate: 'Thu Feb 25 14:11:54 PST 2010',
1879 accessDate: 'Thu Feb 25 14:11:54 PST 2010',
1880 currentVersion: '7b0399826323da5fe938d8f17e2e03192b84af2e95e6d6dae0c8717a34cf4a72',
1881 versions: {
1882 '7b0399826323da5fe938d8f17e2e03192b84af2e95e6d6dae0c8717a34cf4a72': {
1883 header: '####',
1884 data: 'QZgYCpbzVvTd4KNRZW25SMXSyv0PWt7oje3nokC7TWSi/bdxcS8vQyosyFWWa9r4lDpO8/y7FYaa4O8b0ksX3MCOiQeQNI1a5+Bod9sZHWGnILwUnm8jVnuLcOrG/a69/ElLXdObwTXBvYDgHul1gIGWaV7cxYZmYFU1TlgPm0lklPrWqvteurZ8EzdBa9wrUOdKEfEWncn83Mn0KGXnm8xARYu51X4HSWrzKO5fpYqk5o223esndY4X/nLG416HAdPTCOwigMcqHV41asoc0pZRacQbqEhK56xAVKmTnquMt3oZVc/oRuW16ZajXl3A0I1U6ZASOBIZzSDaPW2vKYyEzLT2jxL3fq/GDgs8V5Ctlk8/b0Z4KjB/00NaikyLaVnEvPy4gBbzPHWNEOXjdAGynL/Ez73mNIgBEEUSviN5D2usydJYHF2mTFqldAy3',
1885 version: '0.3',
1886 creationDate: 'Thu Feb 25 14:11:54 PST 2010',
1887 updateDate: 'Thu Feb 25 14:11:54 PST 2010',
1888 accessDate: 'Thu Feb 25 14:11:54 PST 2010'
1889 }
1890 }
1891 }
1892 }
1893 }
1894 }
1895 };}(),
1896
1897 //-------------------------------------------------------------------------
1898/*
1899 'tt/tt_data': function () { return {
1900 users:{
1901 'catchAllUser': {
1902 __masterkey_test_value__: 'masterkey',
1903 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
1904 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
1905 },
1906 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
1907 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
1908 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
1909 version: '0.2',
1910 maxNumberOfRecords: '100',
1911 userDetails: '{"records":{"index":{"77ecea1a9917ede00627788a28c6e90acdf7e5c12864cf236d1f41e718af7528":"1"},"data":"WrCX6cVPslFMYTvGWv7PVwWicAlBqB1I3QX0TNfxM6jrPrObeV4hRrRezUn1rLbQgXYFiuZdQ9mN8n51wNFcQvAXi0TcqmhIu23t6LI360ITPIwq9vNNEndt66ma6W1ANYcx6w+4uKga4ci5NA5vRwXN+s9M2G78HKApu3tvg1aayXmcr7FhoQ=="},"directLogins":{"index":{},"data":"h0MTipBOXYKi5HWM7eAEMw60"},"preferences":{"data":"Ws8wpQlRPwzQCt5hRWrKUUz3"},"oneTimePasswords":{"data":"eclAiKZ8snvT4Rwe7fCyUYXl"},"version":"0.1"}',
1912 statistics: 'tfQF+BrjAQUWyiXWOMkWApmq',
1913 userDetailsVersion: '0.3',
1914 records: {
1915 '77ecea1a9917ede00627788a28c6e90acdf7e5c12864cf236d1f41e718af7528': {
1916 data: '1DGumxvp+09fSbLxed0wnGW5kh31ORuA7xhVOA==',
1917 version: '0.3',
1918 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
1919 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
1920 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
1921 currentVersion: null
1922 / * versions: {
1923 '': {
1924 header: '####',
1925 data: '',
1926 version: '0.2',
1927 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
1928 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
1929 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
1930 }
1931 }
1932* /
1933 }
1934 }
1935 }
1936 }
1937 },
1938*/
1939 //-------------------------------------------------------------------------
1940 __syntaxFix__: "syntax fix"
1941} \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js
new file mode 100644
index 0000000..1cb92c0
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js
@@ -0,0 +1,172 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29MochiKit.Base.update(testData, {
30
31 //-------------------------------------------------------------------------
32
33 'OLD_joe_clipperz_offline_copy_data': {
34 users:{
35 'catchAllUser': {
36 __masterkey_test_value__: 'masterkey',
37 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
38 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
39 },
40 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
41 s: '097ca38b1792023d6c1ffca50606b6040c6b27a7667e355ba9e54e6d47d8bf23',
42 v: '34b9f3ab193bb12dc93c791637b8d80364564b9a39ed7130cd168d52876914e4',
43 version: '0.2',
44 maxNumberOfRecords: '100',
45 userDetails: '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',
46 statistics: 'iFI3fKfuUd5Tqj/iRCJnIk7isZ2FOYPr/yNfICm2U35oUeTJ/RA+l+kbWiYrecpIEgk=',
47 userDetailsVersion: '0.2',
48 records: {
49 /* 01 */ '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
50 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
51 version: '0.2',
52 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
53 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
54 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
55 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
56 versions: {
57 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
58 header: '####',
59 data: '.....',
60 version: '0.2',
61 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
62 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
63 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
64 }
65 }
66 },
67 /* 02 */ '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
68 data: '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',
69 version: '0.2',
70 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
71 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
72 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
73 },
74 /* 03 */ '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
75 data: 'B7RNc32W4K53PWYWQ4aUkqSLV2O4bwExYXVPFT+50MHxrhYt4/yh2idYXAooF1ImaIlvyUsIbI4EnIoBQ33ed2wxuSA9HVC4+wTrE05EfjYOw66yJO6R6TbIazOs0Fob5PJCFEW6evmb6WWf5KsHwifOo+ACMHK799yZ1dxfaIEjRBmLCtnc8sTNvo8i6McAf7WCffA1vXbyVPEhxJjmrfIDqvkWsNR7jDV5xIA021WicOS0FxOnzU3FecU7EF/UPcYjTKfe8IKw4nDXSKIIgXqCdzNYsyZkw2OnMDVJoSwNdfiog3H4zFy2m9KZqPjwnHHj5BE8rdx0JuZoSnTFLR05p4KdWfOU4BrjehAWXZdudYqsovtDm9uMLgUfx4DV/JKVmGAZ49GWM1Tx7pY5PBbJRTO3674FGWYHTPEMiIpDk+zt1sYIR2YBbJTq4fFOIPsgmOfvYdTkSvdHLk0fbxoK12w+atgmXAiNgE6T7DlYT0IMZlEesw0Spchxoo7lTBUPXC93bl/JugyhoRLUof4dxFvsIvd18Gnop+h7aCVW1S3lqZ36TG/N+hlM4U54FkpHjJi2fN8M8EKF0N8n399m58RNfsX2FriUVHozdb5gpgUXnQnVaAUrtv177lz0sRO+9KqbhJ16dCDzMFLcarBvXGqWkj+ZfkpNIaoyl8KTeHTQTbSS2IwLTvs69fbMW6Mub3VD81CXyY3MXyF4hT0U3CFVD4jQg+xODNnqqrkl/LebWy/XP/HOoNTxjygEu1JcS7zCptRagNoucXVkWinyKGjR9fSEltsrXG2pm4w2qsovRB3vfYp7kx2m5I9qc11K+JKhgPUmpm0S4BnPdfpRMXq0w8kxu08Mwm1Debhrzrgjw1/s1ZtcpoFgJv4EWLboWbo+CKWYdq0AGl+b5UHREPnGOM9o9bOg3uvaOEKZyMq8wxECBjdas4wjRbMY83PcBfzCbOU+POrcbalmtwn4/ILkHPsUcaOHYcnKwkxSYIDRxQc69mHw1+vilSHUQ5dZYSWIRvV3yPe9eqZPWJsWrOyhPLCf18BoNdfbgHFL7b2KN9xLMz0tdHxVozH2TnwAavcNqAE0hVIgtyEDoT4rI7FVMSu5mCIN2KOxgXB8XREZokT1BQ8+rz6JraS3JYQNz+7Bd6iB6OaTStsFoaBkj50MszNdwhRViOCCUk4bUr45XRtyh4ZEXj/I4pyJUkhR5H8/qKKD',
76 version: '0.2',
77 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
78 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
79 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
80 },
81 /* 04 */ '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
82 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
83 version: '0.2',
84 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
85 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
86 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
87 },
88 /* 05 */ '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
89 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
90 version: '0.2',
91 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
92 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
93 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
94 },
95 /* 06 */ '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
96 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
97 version: '0.2',
98 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
99 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
100 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
101 },
102 /* 07 */ '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
103 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
104 version: '0.2',
105 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
106 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
107 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
108 },
109 /* 08 */ '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
110 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
111 version: '0.2',
112 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
113 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
114 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
115 },
116 /* 09 */ 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
117 data: 'YXBq1ZlFhoosb2Krnk0Tk8+LKyecTeZ3UdJujrryEgvMnhGJvSVVtN3uph9gts10Kw+tF5wvdAtBFdMUpvcP3mOlbnX7+HCz+JsJcLLVvuGBU9ciwok5kRKQuvWffmP7qFLuqO2VJUj2ozjcpVssStZOrfDXWrJwYfkd9IMnOJVmCwjFeXpPlkOeHNyhjPlfZhWWlTga6xLdEXaVeZyjDegzhlhh9U3e1CLupLTwdxXtNCPRXp8gU7e/I9HP/qdnj5BzgDxaKx29v/AUcgOt3jq5oWwePXZL9nVOp6rh/UqduM88tyxEbnBQxcGj9KxTVsIh6ywzQZgnPtfrPaqX4Fvb1P9cGN80/F+/JXVgL3fvrcxJDGxZj6VYFTA+cHM6sV+F4/7wMLUVlCcn78BB6/k3DC4mYUv+8LSxfZf22bWCcSyubPTRhmCm2/sgdOloDUKT4AjfZivlpJjkYNDtNmZn/rUpMr3uLiHeWDDNB+eGqk3lAFhihBPXqDJ3o+8c9jrznedMxQPkgYD0V9ryDauY2RYjQIhmXqQlnGxpGOO2lFDGYtkwsBplPy6LDkudzJVAqp5trBR8Ty87k65hbhinGCra/DgPqIxjaN5pvZbXkOLoaIoLnE9RRGdAwfUTMIg/maNRoDKaHO0hJ3ksCflu71H9tzPjGM7BBjWjQgUvwDJOgnEPyZv+noOiHfNIq3u8CfI8e867gnEbdtd3oPYex1aBYIQ1ELAxI8szUtSeMDHOouXrZKwy04xVdC90KHnVWl49scE2QfgqV4hqzFjtuQgZOqQ50bI+duWDm7YYTwKVlo5QKy40faW6dPIfDPRsxY6M3gcL2OPBm+WMopUC/o/AFSpxPaut1DOr3mXBip0Ejam9xmJhMOUwIJDoE2U+8S2s+UJjRunLb680vqbddF24aWxpLL1Fg+hlRZ/Jz1ZajonH9ktQhoQaTl+w/4uHhMZjKH7/FaRqge2WMMwVjOd7VXNByBPia6W7VbmDk8LFCeCsC1DchcDaMj/JmoGXucqzDO/sOIby2YCBsV72ReqTNtu6SLZe4G61DWA7j+6NiOSmAutYox6VsoRsKaJYkyBgmq5hWDZmWOJ/cC1pQa9EMoXzcaEPicmXx5YE4xF15VWpI8cKTM/StLtLcqTs78Z0fQAicz8YhhNdVCGp/zcjJRPyL6XCDhpvMxcIOnU7',
118 version: '0.2',
119 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
120 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
121 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
122 },
123 /* 10 */ 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
124 data: '7x7+2tk+I8+OchrmpfLJhDR2crUWfHDo/E8TdmVxbMH9fsnqG4azJG/xVbWROw8N0v8ahhBY3BJG9de9L6PH9B+wECx9zRx/udStcStKRpJLCcjWxVVMt/ipJ+/QqFKWZptqs7VkiT4jZw0V3I4Tl7Wt82/PWZ/euyzYOau+YtiflSedG7+7aEEbhDblntf7NbSXCTIXVnAZw/xuyMjxmioJNNe4sA+fls8KZSYYAzpvxl9+h+esPm978SN/+IuG3mDzCHS+V0tmEhr4v2yfWsZ5axAZFjQSu6TaLNvdFmvgF2olddkizXBsov12WlMSQDSEhs/xkv5ZXVLK3JOCDJldW80eLs0vGOSOJZL3r7NO1gRiwnX5K8PM3YowFIFkWNavRy/B4RneSNCo8XqEg8lBBiJbTtExxMByLKjifcKP7xAD2VeByJ0XDo5If+J4fGiYjo9XU/Bkc2POnJQt+SnNN5iAw493AtGDdPMO37RFRCAeU3W0vR1unsaD9Xn+ClPj1jNCXWZDtvwWnoke8XCeDeTIAzh3wXMCs7ZRqfAHwA1UWOqIq4DP0RJaWeIXCWYSRYAWLnteX1EzHixkvh4MMKmA09bbH/SS5gB6P/V7BBiwxKgstU3tyBbA2bW8aUG1zNthaOtbVqj9YbyogEMN5f3r4I0eMAZDKkbD6med1bHm6P0Zlr0MIYFIgiLkZvEjfoVkuQmFpM1N/PAlEeVDD97VZG9bGN006wdIsR2TEStymt4aBTIyZ+AKDKiGAARYPyYBTswPIAzKBfUipJ7milktKHHmj6LdsDMrwIf5ZQLqvAm2v7xMMBLWTJI+ieGi/R1UgvKAzyGQwzQFB2x+ljNQHsC3wnTLm7/y87CE0FB39FZVC2NJETmWUmAmltL9CPs1Wr6tkin6e2CzSvf5EGsKWBMDkHZD08vjLd30+BxbfS8cuWS3BpTzZ481qjqsF5hDtyRgHQ2eXXggc9imQCvNdG13yNOCcN2KUMPWvPhik6pV7HIMPI2ncPegtCVYwfDFHCn2AV+K1j0G1JIPzRxPlXBX/XNK9kyyK7R3xO7vC3VQyMzPGp8Br5vmoP2356lLLvR5JT7j/uXwZTP1H2/cZSLOii44OXiSNQ8OKp8SIzcWpAd+IuQ7zp2TKOSTl8IEbnorNnJdOG1FbT9kF3FlWkjT6LmQM6Y6pwsYPWinjth72RpTTMBAg6XXr7jveONdFOhoQBjD+VDkF5mv9MqANwv+1HSxwd3SI2OuTsoUcaHzpvquixf6BF2mctDX70i1Nx0gsnBzwsAa3hMQ924fEUyt2XQbJi+3HJ+C5qakgfZ2ERq/MaUL3aSUEL2ViuBly7ObM9/E9NQKyRySXGXb6e1ZdFlajhWLw/N4UpZQVXuQOX/0i95lWQsGbc8aeEn5kh5+Mwruxh8cIBVywiet34O5smc0bdoSWgXdaHZZ2OhJpP26gcDmsYQQPhUUpkhdipRTuNMoWDpy7T2Z36otFZYSRY7tUF7Wmh4zcXxgm8nBbxD3m63ll5MQXIfsR6KL+Ai+81U19VEd224+SdtHd8LP2kbQTRzNvDI2HJdw3GRsdkhyVRFR2NCdoseUfLGqOVxNt/XiWha8r70JOBpe+otSStF5pM92FHHsLqPIEakPqaEXL6IYJa1C9kLjMTjmQNig/biF1X3vQAne1maUvuAGx+6sdUU+GNIpw+AdjilUoRLsFwIMiwLxQLc4dY/97AEdbaC4pNYFW80ch0Joq54IYdmZwv4A08mD7yDGuWxBSyJV4Ylo9nI5ZofpW4Bw2HaG6L3Qx+207Y54WbYjZvmPUdLjItjQWgbJVPfvYi18zaqfbHFulrhKk4MM12oc0OBqt9nl6HHNKHhoHULDMR3B09B4luV1uziY0JudV7ePlCaLd3BDF/y1ujXFPJm3GLkjsaXY/rargrHuiIgKz1FJPuEXKq9admZmS0YgsGkRAgP3RwxpwJoCBuvV1XsFAYJNnz07VjaGvtTazGg5tlfITyF3tZ9m+GAeWR7dObhBOIxR60JddSz/61Zy95BfUOgpuhXYaVuZNFVxYTWcsDFy6Rn4TJN36FfZ6SaNiDQmWK0nhXiphNAzFTDvOBCZdXj0hwSNibD93fMrnphbjmpRfuhLk9MVLupB0FcuW6gGcJENbLKHaJYzRk1LTqXkZ70BCNoSt0HHUgaxj6S0gYVgWa5iqB4HS2vB2gr3B4iEezUWYG5gZsbCcC/H0bvPsSiNpelHrApPgrhGatR5ZwyLt9tnpVTxq6Uw1DkgVdEYrVBUftA9WB02R/cPD0T4K3VqyEaixODGpRWj3RcmUlHT9LwTlVmX9zABKxyIe6Zaq1Chk6mfDPgBzgai4yoUlLQulgayxG3GFc8oZRAm/kOjsY2E+/OpVPtKGzPGR7i4dSK+c+/GTJZykDu6w5FGznNo8YYKB6fvSi0nsTdUSBxBcYgFs81Lkvh/iBf3ZgA4XT9tvHls8VDOKHS7Uz5B7yr13pzVUDJLPQnlbDusmiAKgoloq89ASV2XdmUB50RxeKk1yuMfSVNqXSRxHB7xcQAsnJKaPTvkc1Dikv0K8g6uFSOlN6PXqOJU5SEwkDVsG7OBAWw9aiRC+IKwquOvzejh1Cbu11yMYlPpPtSydMoOEwAKoeoT0XdGVDXP2ySOYpVuW3i8wceWQLg2BYHIlWUzX0CIN0HZbvw5v+ptTzDXT+tp3AtlRzmGKXRVBvdtyUn/38abZ/Qwm5Uzw2jtXc0ol7ce9SMpJb83wpJbQGVTrDUrevFw+vh2x093yS7xNRJS+XNKnfZVG8WahWTdD2VRilgQ/GNILKjAT22XC0kW/+MxBReazixYCMU/vp7fJ2/2i3Th2X6ZlvzVeR+0jd1lp+Y/8//iLFpNn/WCkIKZQk1gVlVlzlY889hORm/SJd2J08ODQ4qCJS4ncYzu/xxikyjd2q+9wb38UHIIOx+qlop36QXaCraduzD5ZO2GHKZBWlJG0nBWxli6BMc6CIQdTKAAm3xnDP0wsIUPhey4u2+HoqC+znZeXTDVwl9n1oxzXsgpHsUlRCHG2pUGF/nGGe/r6/PQ3viSz5I5XUPWy0yOoy6I+NYQCanjcYtFvbcNTDrFmIkQPpf2kFslGlfINGgRlLTIjoYcSx/Xp11FGGwG/1tOKuUzDUAY2dMmFiGGkkxlHL71Z6BFAWj547krybEyCujhtNDCex8htVlI6GH4RxoVyBmw6cO+LV6TO63ieZWrFJGyQ0hd0ikh4A77NZi4+0rEsa1nC4DBm47z3CiLsXH+IlPi3MiBKUVb0MGHcLSvDokCZ4iFsdaMx3Cvkne0Ym8v0i8ImhWa8oJzmC7VQBSCs3gxCs9bENWShhlPs8JJId2vpn5LzsYp913gtD4PthRUGUAa+9cPzQ6V4qQgpzkX0KmV8VRbElDlR1Q4FRC4Cu7ULf8YTSof/Ko2I0iJlH/EmtM+BQO+zf0MohRvDPzEkKeHFhgbUSjcYls/NWU5oK5dOdbP8Sg2AryTySVmMiJd0Eefu6YnjJaLS3++mM1tOHKucCStqhehFL/Jo63qcHbe1jGvAdbKHk6WVHn4DX3DbT3U1awpfEVHRxNG0/IWu/6G2RDx++pi5KcmBIp40gkd4Exv/k2BK/gFs1HXBt8OXS858W0yWDsAl6z9zbzg1JfUvmrfhFLMNN5jls0AITqvo3rHaA4gVUjswUJmsJdElncyRHkTYuE0lbr9Fv5ELkQePYfhyGwKKJpRYdtNZ2f54rAMy5r/Pei1pn0ag6m5jcYzzM8NVIrJSYwsHsghphpkJw7Fxtme8hgAMoD6lL4lGjC786IG9jsnmXnmV+Y491DDjCnOMTy/NTWm1RD+9vjXYxVaO46+0iYtIjk/e6cmFUEz/eGzphzglVXnAlBs569glfbuZrNriiGzd66Wq4lETelMy7sm3UUwL9n3RvGalQCuwxVLZf2oQdNRLnH1k8sKYJk1DtFNW8R3gTRyFQBx1FKYz5rtCKaobLQf7xn+Bnn4uBMtpVoxfsWnK7se3UIKutJuWH2PoetRft7fAcYzLSy9Oyy2fV2gR9OV+9p0HJAIPIKUMC8nVdLXXaggwns4cigSgOLN08gWpTlD39IZmBY8iA+l+bkJcDSFqD+T6hYTNxSXkSLy9Xve18tvYJqG4JvfBt7JwSdA+QwfiS9jIQdIWUs5cBl/ShX9IRmlhsZPF9sow5JAnGJNZhPBF0j9UJfDcgyw98E8wVuNHly5J2CneK1vigbZTM25KMnjevyN3PnfsFSkPjTw4wmMEJpGdMnzzVqA7etpitypyNbgjX0fsAWOgEIRQ5Sog498t6nF1SwWVy7R+0CdpZhh0GpyoNf2TFUklYRec+xRLbAZc5Bkj6Tm9Z/ex9Ssjhi23uL0XG1SCJbHrhox4F8LgLQD22wcnXoSTU4mPAY942u5o2nvB6CTQS8Mj5n+YipQ99UxDhii5UrliGHSdEgjugfHiSoxpkjhNxJSWErYOgWi/qadZqsB/FHLFfMDrhkKxjpcSZwzZO6fAtKiDM5teK6TWaGWwEutd/W/q0Px1vYWxnxHn1ryXx9O3ORe5JJ5FymN4SWkTBIC8eeWTUxQ3TSs2NoGPmN6SnpGFLZH2VLygpg56tE9nXJifXElP8TcIPGPvFGNZFLwtxcdoVbLZaS1IUTpExPGBQ6NUPH24cnWE3RoQrQQHaFcdE1+IRC3TKf+ajINV2LBMhdYI0yE5l5F9hI4GhHNsd/xzROx4NFqkSdVW6T0jFl4NhAUB0iSX2zwJ+yvaor69uzWIFW81n8T5iSPG7Q1naFLL6AOt56wLDUOkioi5CVYlt5lFEl0UtmFnM4j+/Nj+FCCo6jPil847/ZlAicGKXktmDG2nVGILKLe0MZAKdcni/RwBJnl6qSs5x6u2Z46HYi63t4c2RXlljJkHvrn9PuAIG4xSC041F9gaxEshFqg0+nZ5dNiza+DoWgltTHkJehK2UQLMAbRwyvURSz0zSwrUTuT1lBCoSR8/rP3M8PghvUQ6sHpcw1TJ7NwG5y9oS1UVKiU5xC9gHlsMyxfSEaySkhdD5tVOCeGmOzKCD+vx8C577HZaNskKN6KxB3o+DvF6KOAjrtWvZ7C7r1JF7COugUoBSGrp/CeXtvswFvxNc8bqGqEqEZehhl+4TnKrQ+M9LOyWYnkHqbAVt91tIaeNCZZT3wyP4ooZU+JbOogK50kn9LMeT3r7aqbYLY0T1KQH1eezt8tuaeHaKaMX8P7gpW3ucwTINqDlTHL+/wm42D5UfP+/8/jmD+OfHdi8riILye/fDH+BMbk2/syWF94/ZbxjSEWuNtKBEQZJS2PlxQvlqr5pwCcIOFfTE6afEzCjC8968aBhqXMmONQjiYTj+CGZAfivZQV/60o9ckLAXAJoFBiBNf85l7M8DBfmRyabNCQMldus0zvBX6tptH8EuGL4wRPC5vReeigzpcaP8zbjOmvv8bOY6ZgDZTTfXiqOeSwCVUABEUfErNIzGizNu7iYCrbrPqSErrSC/8EmCqyqVbQ9qcN1VSJSAOJ4Vo4udeib5Zvu2zG5St9HWO/blRkKM9qn9s9i6ONSvn1bM8sp20cvAM3+/JVLD5nlCEqVe7oQ+uBCGLpgFJNj6lHiOqSjOm2OSvIbXq53l3IETF/r49OAKYQP8FkVpxrXmQS9Du9Fbp1u50BY9eSmzJuWOE8rOZhNbpaKIpMhdA7HYRmq7hX0bzDUHfKt9hbcrS89fzGikdlyTFmD2soGEbAwgjb4nFkYpzROVAjOhpfz3loAgZO5qpiXym/ee9gus0+OO6PM1xPkWUrTA8mnKvfiFO/ZJx3rn5g5+M/llzj41Cc7Ds0GtbWpUPhLzY7icmtNBamZf/uSUiSHXi6GCZ26llyX7bayCIVUpjg6ijelZQU3rkq42lVPByq8zmxECK8HjAyff6StsBAdIIexA9DN9psACVvybb8iYd09R1wPPFz3o5Gl5tSNV4f2brsPa5VAUyQdQ8YezWXIwZ9u3Q9vrls20FFfN697M+/Y9meu3hX3lVx93LTTsDCLVipaTJyq65n6lbOWZMQb5dgxtoBEKL3ZuxfeSTLiVgbzF3KqxyKNw8MwiyqcVO5mgZGwK9mHFFbSnUiPfHxBfBdqYzH07OksNb9/MvNYK+ebVj5yrEwT/EjNP5/3Bhe5cRUE3m7Y0WgS0TuYZiPgNYCak7ynZXOrYkNjLpH3Wc5GC4RnHXvwpBtD4yJaiIVt0lxYPvfik8FaRjQymubWA09j78ac9d5bKq40ERYLE9oTOoot26jEKoNSX7xqGQCU8VwAOQhC1HfKfdJ88uFMENnB2WLFGqHhZq444eS3Swc1OwBn5zSxUXLNZon9pinWObX8O8ULY1N5TTY8Qh9bLLfLjntCqXFXH8/6wcdnuOrBH0It6LLqrUm/TehuqXXL1c9Q1cYBLYrYjT0FJmbKrcyqG4peOxfCqEiryLLLcdSOECA4vDSvlo6eJ1sk1mXgF64ZEIIH7dZWlOl/eL0L6fGs/vrbvJBBArkVftkOiumIsXMwqaNtZYwMzX811NZpFMOhInwTmh8mbaaCpL+0ioizEE1/is5M9eA3808sF3Miv7d2RtI3sGWbdb9K/cVrOhV4Oy4MkdVxrZpeYuzshod3DRB3/Es72Z1ImrZh+div/GnWpo9Q9M9U/pLVuLnKVCPnXhu5dkF9nVse5NrcBlt7qQvvr/4CC0uctQ94nbjNZobcEXGSYZ8dx7Oftr7fKzT9cxhh93Zm/mxz48dys3JD1JB2V/OZfPoiiMIEW7r/0aXQSjDhp/v7QeIL9nLT/NiNUi5puti/t9q/GDK+pj6UNQak56M2//iLQ0y+3ov9Fod/LJAAVnCgMAFFUX0AJ3nkRPT6Rz/dEtbKdmnVqUER6UzDvhcDfDV+OiMmSgVFZ43d9JkuDPTu5Zuk2J12kgxddjbbSf8Z5TqkaDPlz7OMCdEht6wyTt7QEX88sUaiFrRLgvGxm3BYv6FZ0FGWfKqEgqjnsFJkmIYPYl2jrAC20G9LE5T/niONA8V2wT6S7Ha0xXNWUk6xaWP64SVOFvRvG8mx9fstjLCMhRYGmpol5az6XSgZ9Xd+JzhkoAWc+xmYMrT30kw8LztcWEz1HeK+cktGYS7vB32fG+oM8MMz6bVtkouHiGVE+YlELr4GjUHrnWgNKqtrkL5btt8ceZqI9RjE9aUqN3KgJgAt8YselJLfqFHNu5kh0XQBbD8CIplN6nzaXTcK5qsboyNRAEC7kjzp0iG3vHqNSPvGlfqCKYCZNW9mPpFaTFPQoEhttDp9+W9cCSTeObdPTKe4n0a4CkLNsZ7mZlFHN+7BhJcPa5E/e8P14xJ0E5200RKjkv/+jXxMEvlay0xypHam6Bw15RJDW6vW2O1ZvBZUDtlrpxXf2YpfhFP55WGVbfiVcsQfQTzJkzmgBleS0lmuO7k3s/11XcCfpFSe2aLGA52ClXXvFzSeKFnrZ6gsa4vfX/8bnLQwZDB2btftzgoHvKRTQ9tw/fdicNck/qJDplSW192y/66bqpm/qKFqt8nrx1FfivIXZnqR+YpcvJuZWkp+uT06Jy5oDOHqjmKrQkQoWmQlXyzTHJSIYjK0pfwAV3X09uMYI7+tsR98K6yXNUmYYR7CC7n5m44eu0Gr3fBienuuXFTdbrQvaVHQsY+ekPWByR+rfhVKxoK7cYOJM14faQlpMfrrOtPSJ7yABcCyFRmcaluNQxUIx/ueC07TpbP1oIVhRrBpFPfmUuh8EhWsMqJOrZXvJ12pPrNvSWaqZ7sgs06NNob5iM0YsNPDMYtk7he0ZxwD2Pjh/u7w7X1CyGRJ8iFEn3xihuJzCkn9UU5toSt2jYA98IW32VopPuhqqpBk6sv+Rfs0HvSltGSF1QpbmAEAOrpv/jHlIrT9KhEXXVnQn5uYIMM447o0VAODIDP0UxGmUkRBCZs9YD/aMSaaqjhFjkIXCRIx44G1hMiyJMY1hXV1AVpQQPc61qQqltlXCJShzeDU+eIqeOXKLKEvHpSbSdyC0m7BSjet/2s6Mdwp/JuIft4oUCMF/DoGYGxEo6mi3OYUM+xBpep7iFAY1pb/DzdqHUn9NxwPi6C0OMxU+jaw2733LILmAcE0jFSJyQ4KpeCGubNWjMMg1iVPWtohYbRUuL8Hypq0d9QD2iJ2a6OLnU33HnolnO7VQKSIrBKMMeJZlPfptnytn3CW78xswDIGTsSLYFcbsNL2dj4f0ZU3nUhPy0XKqfEB3DgDpiwH1tdWrpWEaHgIEZWs7HIwSDb69K2kCDTnVGnb6hXSL/k4NvW2qHyTeMPYyqSbK4xwDX37UJMZbA4p62j4mDYa06tADbLsjr0PcLs1hkwanvZEcFz7fo/5Mf6n79QlBsjRyy6GdHwbUF8REbpQUY2j/lF38bz9cz2qwm0OpmpkX8eu4DGxsMZ05ycUk4WdZZv5zCpOV2oiDAvTnxQQY/j3A1wxjklolnjWWLRELaXae1z1KcHzlT+kro0eUIoqSHIbbnhysYb3TYLtllIFR5d7BzJxEirjoyogpnkNBnEXfxzqu1RjvNB1NM4fLOnnd0RmIjW6o7ncj0VY+wWsVVpIiybGvd7eFPftTii+zHU/eOfLOiVLEWwAcN8qQL4GpWC3fKNXBO7cW88YxMhE2SA+aef4WLYlg0y3S/tdoo4V03iSqgbvUwrI6sfcT8biJD8XG95/7MxD8iLzI1Lmj1lg0crieRctFoHel8fnZfOZyN3PkIlQUQGe4q5YG2nMWShtbJUqUs9QF4MuvNB1Xqel9mqzXzfkYArZ33+W6gBn8uMRTiH/uNsdAts3i5CCiScNs6CGXmD/IkX0G17EuHiHi31W2xHq921SRy6VLSM7MuiUmP8HWisDV9Qih8QYA+QI6nKbFtISIDgdLKR4nIjbXbW7FXcr6lu3ujvrAsK+o+O3rWEPhzFwzFRFk/VdwP2BJ+dthGHsj4XxxiZOFYGP3TahTy861IL3ZPbKPLFT5YVx5R+b6z+zaAdEXbE97xP74BJPfTaXR2X3k/rczKgt3GAdwYTHaJ4PMoiJyQ12J5nztQRo7rZdZBMmMqSJcZH1oyPGDCgBJ3nzXbS5F9FLqIbjaA6Sih5PQ6e63j3OucsXZmYU9nA6qQ7fG+x496RsvmvxND0CX+8ryZTbhXDuQoMBPEtY7wXQZegWQRkkrBmnErKEnmxDokiMuyh51z3dJOSYIyHYOfYFR5DAOE+ikEB/IWVva2WuOv+R670WwBRP5e4TqcGgZBk4ppa3YI8/jEqgVP8urL6JBdT0GGwcMwPPxdbvwFPUA8NQq77D01w79w5gJiv2ZXt74iZS7i5TS6yLvw0G/CSP/PaJ291m1Jh4/qSNpBoTEFOrUBhuTAzrn0MsAuuvnPwOnynwh850gqhXmtDml+6JwE84aHwSx5D34jKCUZ+TAtddczIQyxMg1qu7g7WhZe+WCvrzYgW8ZLR6dk7lS3/vXP7mMU6X46xKEb5YmakuT/FTW3xASywnE5+NMAtOWTxLEY60/NiqCVeqI8BPL+9Et5Lyw6di1DlF9Aa4VCqaOGLo6e6/9NlnI/QnFy0kEVxQmOVsRgf9k9P9VAHXMWy4vM05O6LQ/EAptQgFEkRvG4ZKQVcPPM68jSWMqoDdTqwPvELiVAT8K5ZC/OAVqOBqNbMKCzCK92quPV8iiBUnj+07IR44v65BjTWJOUR3f4tm5h4OvRdf2I6rW0RErwXeVLwI58ADfNh1ZyqMua8E4MTB3p7776us8lzYYSmdWCE9GZqY/vQUb6D5F0jO/W5U8ux0Pxqa3ORckrp99RN2vAqviwqMM67CNyyIJqO25kxpVxm4pvCf0h3KX6mzblooM4VFZEMpBREU5FaXTvNDIP00oFCwB+zpENLXLxfaNAuVemH7lbPiA==',
125 version: '0.2',
126 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
127 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
128 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
129 },
130 /* 11 */ 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
131 data: 'Ate/x8b4UWG3C+gZ7IzIfZrHSlh3eSANVYtd034pXi4V73+rc5OynELEiMxDgvcr+4r5YGNPKvTB83KzOBznmZsEJhNpCd2Ezyk1i3FEo+Wur/6EYBBvDfHSQNrRfYVcNlx6+i1d6a6lDYxOcxfEPuL2141KsCRxCId4FWvDU1Om48ekFNyeOl5ND+k4GLymYIjG7HC6VQZOwUQgzlTfZpjeJ1q3pdPWSEtX8a0b5pgmHVB9X56u+vjfYFcs2ieh3UcR4Vg8fIJQOth/pE2XoZfbALyT3pnEcW8vQrrmFcavt9bDGGzlEkGB9JEIyMzUqVndV9Sw5OsCMgOEpMKvELRnlyieUvcsYSL1s/m8GohguMrXDiRV/nCUhZbH/j/8jXEX4kfiaIT5uvPBymTyMTGGLoPBT7mOWLuV6NoU6ND0QwSEXNMpZDJDBhl37hR4kD3GgjCv9gjasADAmHPZF386LNxnOIMTfrOIwK3sXkfhEU9EKdC+QT+W85o6HQrWXsqNesxU2cs2uW7rmadUBoQdyYTtWH3cBWcwKH56vzlOG33JG1+DGH6MFEd4vn1I0aoluPuBom9ERgLXEoqw1tx4OAx8UCcev8dnZF1YcGhcUXyORjgjd6CTfMDz+f5YMkulGwPRcm1D7uof0a2ryV6+c5WuccUX+Pe/Vj3WOQXts7pdukLp+idnlpdSw4roJWU++1i7727MIWGUFcKMH6qyH2yZ1nxLNour/u6FYlxRvNkB+vCr+hko7iBlTw2GMVWUMgnFS0A+lQ1tGawAM9h8lpb75GCbiWNXdnbTx/GdQzKMJJXKGpOeuWOXlJSEJHjWzVwbP21ql1OaFLr9ihUJdLzSsjICW7pGH/iuhuIlx84N57ctV2BTAYJtPLG+f3rv709lOD/5pgdXTLijjX473Ymq0TgGBSI9am0Pwz7SB2k1LVkBVfAVxR6p8Vb0h3S1LUojoJS5dfGV7TtTu67CemoRNISdOVL9kxCoue1QMsd7GTnY3sy/P4eFHovCtU0suUYjHRojUz5B6xPlL92Jbdtq6fGv+V+p/HnKFXkf3BgPnSm2zexCAEgT8yuJ86UIIWIEhYN1UtzJVJ6BykCCGbZrCSEHyfCcRLreYYpNcMPWpLOLTMFpLiHtW6+x6/tVB07K2NDpYZUY4Ekym4bRrLUXtDjjcltL8qUPQf/uBU6tfpGrdZB5OAWnsxzR0x+4ycyz84Pq81NMUVKnvhUWrygtatZhFYhNWYCz4NRfqwnwSRQxTr/2NliO22BhGc6fjZWdXdqmyw1+UXVp692nsV2FCldz8+k6LMA0AKBuQXcK5v4mYQOWmSKlH/CpkPkOEIPrQVmgjMv1/qWaEIvRJUYpPsnFUD5a12NlBBxBvHpcXemHZZvdgnBnOyAjIbhxCAsQnw2Rc6SzF1z4yviZ8PSeh5+zavbI9rgO3UtsPBO+R+5kky3KxtnLSV9m6m6Lb1QmpwDKQ2ddTDXFLBasyE0WdrCDBTDpCLDRsLWdODzyeCH0yWx8tfKfKRI5dzBQz4xJ9swkC3LAr7XubkCw8RMzCUAC/WKMRIsoyXMP2Il38fSG1aO6kKyUvY6ai8a8IDx3Do5TQMgS53N4tQNls8ZcglYDydcXhxsH7ztEjis/2omJbwadtTRYv7fu5jbZAC21XcGhfbgPp8h3Zal0SwuN6s+Uyz8LSwnZgrN0N6d2cNE39628kZkAwI7piZG7VV0XocrGnIu+6oe0QmJsxiAMvaheh0K9Dkf98rS2OF3LDwosaSzxUBD06BD1C2BkleM9',
132 version: '0.2',
133 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
134 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
135 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
136 },
137 /* 12 */ 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
138 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
139 version: '0.2',
140 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
141 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
142 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
143 },
144 /* 13 */ 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
145 data: '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',
146 version: '0.2',
147 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
148 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
149 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
150 },
151 /* 14 */ 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
152 data: '3sIazRfi2ps3Mh69YkIYFFyDRXU8cTRuBjCevCJHyJOfxLPOcJfUX+QuWv50QMRchAG1RYTwqTOFd4G4ixzmt9HjHlJSpFXva8TvNfUaoggUWWTzNraRxB0gJex3JGfQd4Nlve+wdISrn5vUJSWBYcFEFo9504TcDAkVjwFYrLhBDFv53d3B5WuanLzpRuB8lIj5r5ZBYszraRDeSjEKQ0OtTojxnkZOB7dDi2IYdorhxhOeBmi3ucAXeDLZbaZdPAXmo6CNEYxAr0z9/aCrvLxZEfNoBvBMOnHT20wljSGsjf6QG/KEm352ix/uGSrJNbRMMX9tVloeSmEkwxkAn4ZQwIVq/0IS970MkL+jOH/RFhO6UT6x5OPo+Yyf3EKmRWKKeZbv95C5WNRcfLjeNVo5Zihq4fAUEfwHtNTaEEpLoUdCbzgZqBKcbLk8jo44lznz41T4R9QM5ofRAexywqVlEzagztakcrgyAMGumqquuKscJmqxEyxZLwNWD706DCUkiG2a1m/umxNvVkCNE6VBxbZ1+SPrcsRVfdtAx3eee056xo+KYKLdf84j3DR27H/p3QYm25sdLhUU0QtUTDTP2aKUxEcsLy5MIZV7256AlRS23upmvtb+VfJCsT+FwedLNCzu4SEk8Iz5AHFJ2VZ0g/2A7DH7DiuaxSqEn6iSqVZRnTrhWsW/lTZ61Swji+wvzk+5RnY8wBFZeudUX6ERy9n0e4n8EkGXCObwSnyIe+Dxs32MQFXb7b6NUJEfbq4GxHUjJ6fzRuTqQysRKlQ+qj9Hl5+HvGhyliDpe+PQ3V6kFE52qVArAYzlR2sZJmxKPIgU6wPPuCMcg+97own4gSO6PWrnlSZs87ptZdZ1iiYPDajQjyLI9WV/IN3APbiRufdEjjmCkoxB1zwSHzyW50Wdl1pEW19/0j+KSFDeigXXVg0LAko4uuJIPTLR8L8gOrcNZvIqHB85XnsbO49+SUwcykXSlZSq3il7D/9FuGJK0ecKdEMf/UetsSaX7x3L92fzSIjqgFSHrCPrqLVWdI5Sema4vhx3aes+hF9oohC9jqb6vS/b/vXfVf2vs2hPelqk7UIRzPmaeapzF0RyjGoAljBIrPFmyAmXcpQ/NlJSI7UjMjoFWsOXshJiy+0/luVkzfoFSordVm2ZhR9zkVKKDHlrFXXkw1upVnf1xFV9Z4SEVAZKgWRr2vLbmD5tITmR7qxzNTXrikqujVvOeFCHkAW1c5IcOk/VjPO36CNL2EZbpRHc6z25gST8NYn+Ypee6FGliHGFbzJxTwHa67fRncf9H1Iunzl+x3J3/0973z5fILk4OtMq3MKUFjdj2r+hqwU893+Yaza7l06Jm+dODTXhPA0T+JL4gaWHE4Ci9SsX85uvpZR++Tfx3CB7uXvOKGATmVYkAMndNCOBCbHz1/zz/Fg4Awu4aAPap/DqWsoVXajuYBSBNpaxpFWeioX65PPEPgn+HHmtjn2c647vwdv3iBopTJJlipoW94vkTJe4tpO1e7DA5EPnzdxJoRyXGbipfCRlfblcurQP+hXZHobfqmzMuyEPp4t7b5oiYpwzNnM4/sh9NxTpj/a4urjnIwg8yzLNvdletAuME0oQu4DkcWpPKhyDpelAPtdhDka2YID/WhUfg+gHKpIjKU271eoUwhScCcW1cBY41htaSNftJq96r77piMYo6EAAuf4X++MIT5LiwsYs/qzjOrmQm5pdSeAmR9f1fkqsIAv/TDhgAgIC0zAmvUJfkxIEHOMn4y5i5qZqlDS/Nvd/ZWl0lMjPSJaxd1pm3echWZ8/+gPKMib5sSO2eYYOMq/DR6k2ILThbHJp1G6gqcyD/LymNO7BrCIDfGEgp+fCBFXYBjC6+Otkukcvxs1uJsirwWbYLaoC25iYChdhwmoOys8=',
153 version: '0.2',
154 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
155 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
156 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
157 },
158 /* 15 */ 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
159 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
160 version: '0.2',
161 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
162 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
163 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
164 }
165 }
166 }
167 }
168 },
169
170 //-------------------------------------------------------------------------
171 'syntaxFix': ""
172});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html
new file mode 100644
index 0000000..f77bcb6
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html
@@ -0,0 +1,106 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.DataModel.User - test</title>
32
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
47
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
54
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
60
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
63
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
65
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
79 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
80 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
81 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
82 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
83
84 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
85<script>
86 Clipperz_IEisBroken = false;
87</script>
88
89<!--[if IE]><script>
90Clipperz_IEisBroken = true;
91Clipperz_normalizedNewLine = '\x0d\x0a';
92</script><![endif]-->
93
94</head>
95<body>
96
97<pre id="test">
98<script>
99 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
100</script>
101<script type="text/javascript" src="User.data.js"></script>
102<script type="text/javascript" src="User.data.old.js"></script>
103<script type="text/javascript" src="User.test.js"></script>
104</pre>
105</body>
106</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js
new file mode 100644
index 0000000..4e7a21f
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js
@@ -0,0 +1,2082 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 //-------------------------------------------------------------------------
34
35 'invertIndex_test': function (someTestArgs) {
36 var testIndex;
37 var invertedIndex;
38
39 testIndex = {
40 'key1': 'value1',
41 'key2': 'value2',
42 'key3': 'value3',
43 'key4': 'value4',
44 'key5': 'value5'
45 };
46
47 invertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(testIndex);
48
49 SimpleTest.is(MochiKit.Base.keys(invertedIndex).length, MochiKit.Base.keys(testIndex).length, "the inverted index has the same number of elements as the original index");
50 SimpleTest.is(invertedIndex['value1'], 'key1', "the first element has been correctly inverted");
51 SimpleTest.is(invertedIndex['value2'], 'key2', "the second element has been correctly inverted");
52 SimpleTest.is(invertedIndex['value3'], 'key3', "the third element has been correctly inverted");
53 SimpleTest.is(invertedIndex['value4'], 'key4', "the forth element has been correctly inverted");
54 SimpleTest.is(invertedIndex['value5'], 'key5', "the fifth element has been correctly inverted");
55 return MochiKit.Async.succeed('done');
56 },
57
58 //-------------------------------------------------------------------------
59
60 'joe_clipperz_offline_copy_test': function(someTestArgs) {
61 var deferredResult;
62 var proxy;
63 var user;
64
65 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
66 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
67
68 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_test", someTestArgs);
69 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
70 deferredResult.addMethod(user, 'login');
71 deferredResult.addMethod(user, 'getRecords');
72 deferredResult.addCallback(function (someRecords) {
73 is(someRecords.length, 20,"joe_clipperz_offline_copy_test - joe has 20 records");
74 });
75
76 deferredResult.addMethod(user, 'getRecords');
77 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
78 deferredResult.addCallback(Clipperz.Async.collectAll);
79 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
80 deferredResult.addCallback(function (someSortedLabels) {
81 SimpleTest.is(someSortedLabels.length, 20, "We got all the labels");
82 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
83 SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct");
84 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
85 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
86 SimpleTest.is(someSortedLabels[4], "Example Attack", "The fifth label is correct");
87 SimpleTest.is(someSortedLabels[5], "Expedia.com", "The sixth label is correct");
88 SimpleTest.is(someSortedLabels[6], "Google Account", "The seventh label is correct");
89 SimpleTest.is(someSortedLabels[7], "Home burglar alarm", "The eighth label is correct");
90 SimpleTest.is(someSortedLabels[8], "Jaiku", "The ninth label is correct");
91 SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct");
92 SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct");
93 SimpleTest.is(someSortedLabels[11], "Microsoft Office CD Key","The 12th label is correct");
94 SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct");
95 SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct");
96 SimpleTest.is(someSortedLabels[14], "SAP - Login", "The 15th label is correct");
97 SimpleTest.is(someSortedLabels[15], "The New York Times", "The 16th label is correct");
98 SimpleTest.is(someSortedLabels[16], "Web password", "The 17th label is correct");
99 SimpleTest.is(someSortedLabels[17], "Web password", "The 18th label is correct");
100 SimpleTest.is(someSortedLabels[18], "Yahoo! Account", "The 19th label is correct");
101 SimpleTest.is(someSortedLabels[19], "del.icio.us", "The 20th label is correct");
102 });
103 deferredResult.callback();
104
105 return deferredResult;
106 },
107
108 //-------------------------------------------------------------------------
109
110 'joe_clipperz_offline_copy_getDirectLogins_test': function(someTestArgs) {
111 var deferredResult;
112 var proxy;
113 var user;
114
115 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
116 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
117
118 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_getDirectLogins_test", someTestArgs);
119 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
120 deferredResult.addMethod(user, 'login');
121 deferredResult.addMethod(user, 'getDirectLogins');
122 deferredResult.addCallback(function (someDirectLogins) {
123 SimpleTest.is(someDirectLogins.length, 22,"joe has 22 direct logins");
124 });
125
126 deferredResult.addMethod(user, 'getDirectLogins');
127 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
128 deferredResult.addCallback(Clipperz.Async.collectAll);
129 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
130 deferredResult.addCallback(function (someSortedLabels) {
131 SimpleTest.is(someSortedLabels.length, 22, "We got all the labels");
132 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
133 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct");
134 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
135 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
136 SimpleTest.is(someSortedLabels[4], "Example Attack", "The 5th label is correct");
137 SimpleTest.is(someSortedLabels[5], "Expedia.com", "The 6th label is correct");
138 SimpleTest.is(someSortedLabels[6], "Flickr", "The 7th label is correct");
139 SimpleTest.is(someSortedLabels[7], "Google Account", "The 8th label is correct");
140 SimpleTest.is(someSortedLabels[8], "Google Calendar", "The 9th label is correct");
141 SimpleTest.is(someSortedLabels[9], "Google Docs", "The 10th label is correct");
142 SimpleTest.is(someSortedLabels[10], "Google Mail", "The 11th label is correct");
143 SimpleTest.is(someSortedLabels[11], "Jaiku", "The 12th label is correct");
144 SimpleTest.is(someSortedLabels[12], "LinkedIn", "The 13th label is correct");
145 SimpleTest.is(someSortedLabels[13], "Lufthansa", "The 14th label is correct");
146 SimpleTest.is(someSortedLabels[14], "My Yahoo!", "The 15th label is correct");
147 SimpleTest.is(someSortedLabels[15], "MyBlogLog", "The 16th label is correct");
148 SimpleTest.is(someSortedLabels[16], "MySpace", "The 17th label is correct");
149 SimpleTest.is(someSortedLabels[17], "SAP - Login", "The 18th label is correct");
150 SimpleTest.is(someSortedLabels[18], "SAP - Login", "The 19th label is correct");
151 SimpleTest.is(someSortedLabels[19], "The New York Times","The 20th label is correct");
152 SimpleTest.is(someSortedLabels[20], "Yahoo! Groups", "The 21st label is correct");
153 SimpleTest.is(someSortedLabels[21], "Yahoo! Mail", "The 22nd label is correct");
154 });
155
156 deferredResult.callback();
157
158 return deferredResult;
159 },
160
161 //-------------------------------------------------------------------------
162
163 'getCredentials_test': function (someTestArgs) {
164 var deferredResult;
165 var user;
166
167 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
168
169 deferredResult = new Clipperz.Async.Deferred("getCredentials_test", someTestArgs);
170 deferredResult.addMethod(user, 'getCredentials');
171 deferredResult.addCallback(function(aResult) {
172 SimpleTest.is(aResult.username, 'joe', "the username of the credentaials is correct");
173 SimpleTest.is(aResult.password, 'clipperz', "the password of the credentaials is correct");
174 })
175 deferredResult.callback();
176
177 return deferredResult;
178 },
179
180 //-------------------------------------------------------------------------
181
182 'loginWithOfflineData_test': function (someTestArgs) {
183 var deferredResult;
184 var user;
185 var proxy;
186
187 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
188 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
189
190 deferredResult = new Clipperz.Async.Deferred("loginWithOfflineData_test", someTestArgs);
191 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
192 deferredResult.addMethod(user, 'login');
193 deferredResult.addCallback(function(aResult) {
194 SimpleTest.is(aResult.result, 'done', "successfully logged in");
195 })
196 deferredResult.callback();
197
198 return deferredResult;
199 },
200
201 //-------------------------------------------------------------------------
202
203 'getRecords_fromOfflineData_OLD_test': function (someTestArgs) {
204 var deferredResult;
205 var user;
206 var proxy;
207
208 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
209 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
210
211 deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs);
212 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']);
213 deferredResult.addMethod(user, 'login');
214 deferredResult.addCallback(function(aResult) {
215 SimpleTest.is(aResult.result, 'done', "successfully logged in");
216 });
217 deferredResult.addMethod(user, 'getRecords');
218 deferredResult.addCallback(function(someRecords) {
219 SimpleTest.is(someRecords.length, 15, "the OLD test user has just 15 records");
220 });
221 deferredResult.addMethod(user, 'getRecords');
222 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
223 deferredResult.addCallback(Clipperz.Async.collectAll);
224 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
225 deferredResult.addCallback(function (someSortedLabels) {
226 SimpleTest.is(someSortedLabels.length, 15, "We got all the labels");
227 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
228 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct");
229 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
230 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
231 SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct");
232 SimpleTest.is(someSortedLabels[5], "Google Account","The sixth label is correct");
233 SimpleTest.is(someSortedLabels[6], "Home burglar alarm","The seventh label is correct");
234 });
235/*
236*/
237 deferredResult.callback();
238
239 return deferredResult;
240 },
241
242 //-------------------------------------------------------------------------
243
244 'getDirectLogins_fromOfflineData_OLD_test': function (someTestArgs) {
245 var deferredResult;
246 var user;
247 var proxy;
248
249 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
250 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
251
252 deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs);
253 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']);
254 deferredResult.addMethod(user, 'login');
255 deferredResult.addCallback(function(aResult) {
256 SimpleTest.is(aResult.result, 'done', "successfully logged in");
257 });
258 deferredResult.addMethod(user, 'getDirectLogins');
259 deferredResult.addCallback(function(someDirectLogins) {
260 SimpleTest.is(someDirectLogins.length, 17, "the OLD test user has 17 direct logins");
261 });
262 deferredResult.addMethod(user, 'getDirectLogins');
263 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
264 deferredResult.addCallback(Clipperz.Async.collectAll);
265 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
266 deferredResult.addCallback(function (someSortedLabels) {
267 SimpleTest.is(someSortedLabels.length, 17, "We got all the labels");
268 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
269 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct");
270 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
271 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
272 SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct");
273 SimpleTest.is(someSortedLabels[5], "Flickr", "The sixth label is correct");
274 SimpleTest.is(someSortedLabels[6], "Google Calendar", "The seventh label is correct");
275 SimpleTest.is(someSortedLabels[7], "Google Docs", "The 8th label is correct");
276 SimpleTest.is(someSortedLabels[8], "Google Mail", "The 9th label is correct");
277 SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct");
278 SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct");
279 SimpleTest.is(someSortedLabels[11], "My Yahoo!", "The 12th label is correct");
280 SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct");
281 SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct");
282 SimpleTest.is(someSortedLabels[14], "The New York Times","The 15th label is correct");
283 SimpleTest.is(someSortedLabels[15], "Yahoo! Groups", "The 16th label is correct");
284 SimpleTest.is(someSortedLabels[16], "Yahoo! Mail", "The 17th label is correct");
285 });
286
287 deferredResult.callback();
288
289 return deferredResult;
290 },
291
292 //-------------------------------------------------------------------------
293
294 'sortRecords_test': function (someTestArgs) {
295 var deferredResult;
296 var proxy;
297 var user;
298 var caseInsensitiveCompare;
299
300 caseInsensitiveCompare = function (aValue, bValue) {
301 return MochiKit.Base.compare(aValue.toLowerCase(), bValue.toLowerCase());
302 };
303
304 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
305 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
306
307 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs);
308 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
309 deferredResult.addMethod(user, 'login');
310
311 deferredResult.addMethod(user, 'getRecords');
312 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
313 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label());
314 });
315 deferredResult.addCallback(MochiKit.Base.itemgetter('0'));
316 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
317 deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'");
318
319 deferredResult.addMethod(user, 'getRecords');
320 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
321 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label());
322 });
323 deferredResult.addCallback(MochiKit.Base.itemgetter('5'));
324 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
325 deferredResult.addTest("Expedia.com", "Sorting the records themselves (by labels), the sixth element is 'Expedia.com'");
326
327 deferredResult.addMethod(user, 'getRecords');
328 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
329 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label());
330 });
331 deferredResult.addCallback(MochiKit.Base.itemgetter('19'));
332 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
333 deferredResult.addTest("del.icio.us", "Sorting the records themselves (by labels), the 20th element is 'del.icio.us'");
334
335
336
337 deferredResult.addMethod(user, 'getRecords');
338 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
339 return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label());
340 });
341 deferredResult.addCallback(MochiKit.Base.itemgetter('3'));
342 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
343 deferredResult.addTest("del.icio.us", "Sorting with case insensitive mode (by labels), the fourth record is 'del.ico.us'");
344
345 deferredResult.addMethod(user, 'getRecords');
346 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
347 return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label());
348 });
349 deferredResult.addCallback(MochiKit.Base.itemgetter('19'));
350 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
351 deferredResult.addTest("Yahoo! Account", "Sorting with case insensitive mode (by labels), the 20th record is 'Yahoo! Account'");
352
353 deferredResult.callback();
354
355 return deferredResult;
356 },
357
358 //-------------------------------------------------------------------------
359
360 'accessToSingleRecord_test': function (someTestArgs) {
361 var deferredResult;
362 var proxy;
363 var user;
364
365 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
366 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
367
368 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs);
369 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
370 deferredResult.addMethod(user, 'login');
371 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
372 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
373 deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'");
374 deferredResult.callback();
375
376 return deferredResult;
377 },
378
379 //-------------------------------------------------------------------------
380
381 'accessToSingleRecordContent_test': function (someTestArgs) {
382 var deferredResult;
383 var proxy;
384 var user;
385
386 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
387 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
388
389 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs);
390 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
391 deferredResult.addMethod(user, 'login');
392 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
393 deferredResult.addCallback(MochiKit.Base.methodcaller('fields'));
394 deferredResult.addCallback(function (someRecordFields) {
395 SimpleTest.is(MochiKit.Base.keys(someRecordFields).length, 2, "The number of fields of the Amazon.com record matches");
396 return someRecordFields;
397 });
398 deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2'));
399 deferredResult.collectResults({
400 'label':MochiKit.Base.methodcaller('label'),
401 'value':MochiKit.Base.methodcaller('value')
402 })
403 deferredResult.addCallback(function (someValues) {
404 SimpleTest.is(someValues['label'], 'email', "the first field label matches");
405 SimpleTest.is(someValues['value'], 'joe@clipperz.com',"the first field value matches");
406 });
407 deferredResult.callback();
408
409 return deferredResult;
410 },
411
412 //-------------------------------------------------------------------------
413
414 'modifyRecordLabelAndCheckForPendingChanges_test': function (someTestArgs) {
415 var deferredResult;
416 var proxy;
417 var user;
418
419 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
420 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
421
422 deferredResult = new Clipperz.Async.Deferred("modifyRecordAndCheckForPendingChanges_test", someTestArgs);
423 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
424 deferredResult.addMethod(user, 'login');
425
426 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
427 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
428 deferredResult.addTest("Amazon.com", "This is the record the test was expecting");
429
430 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
431 deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "New label"));
432
433 deferredResult.addMethod(user, 'hasPendingChanges');
434 deferredResult.addTest(true, "setting a label on one of the user's record, trigger the 'hasPendingChanges' flag");
435
436 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
437 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
438 deferredResult.addTest("New label", "once set the new label value, I can still get back its value");
439
440 deferredResult.addMethod(user, 'revertChanges');
441 deferredResult.addMethod(user, 'hasPendingChanges');
442 deferredResult.addTest(false, "reverting changes should return to the original state");
443
444 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
445 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
446 deferredResult.addTest("Amazon.com", "The label of the record is restored to its initial value");
447
448 deferredResult.callback();
449
450 return deferredResult;
451 },
452
453 //-------------------------------------------------------------------------
454
455 'modifyRecordFieldsAndCheckForPendingChanges_test': function (someTestArgs) {
456 var deferredResult;
457 var proxy;
458 var user;
459
460 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
461 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
462
463 deferredResult = new Clipperz.Async.Deferred("modifyRecordFieldsAndCheckForPendingChanges_test", someTestArgs);
464 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
465 deferredResult.addMethod(user, 'login');
466
467 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
468 deferredResult.addCallback(MochiKit.Base.methodcaller('fields'));
469 deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2'));
470 deferredResult.addCallback(MochiKit.Base.methodcaller('value'));
471 deferredResult.addTest("joe@clipperz.com", "The value of the record field is correct");
472
473 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
474 deferredResult.addCallback(MochiKit.Base.methodcaller('fields'));
475 deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2'));
476 deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', 'joe@example.com'));
477
478 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
479 deferredResult.addCallback(MochiKit.Base.methodcaller('fields'));
480 deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2'));
481 deferredResult.addCallback(MochiKit.Base.methodcaller('value'));
482 deferredResult.addTest("joe@example.com", "The record field correctly returns the newly updated value");
483
484 deferredResult.addMethod(user, 'hasPendingChanges');
485 deferredResult.addTest(true, "changing the value of a record's field trigger the 'hasPendingChanges' flag");
486
487 deferredResult.addMethod(user, 'revertChanges');
488 deferredResult.addMethod(user, 'hasPendingChanges');
489 deferredResult.addTest(false, "reverting changes should return to the original state");
490
491 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
492 deferredResult.addCallback(MochiKit.Base.methodcaller('fields'));
493 deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2'));
494 deferredResult.addCallback(MochiKit.Base.methodcaller('value'));
495 deferredResult.addTest("joe@clipperz.com", "The original value of the record field is returned after reverting the changes");
496
497 deferredResult.callback();
498
499 return deferredResult;
500 },
501
502 //-------------------------------------------------------------------------
503
504 'modifyRecordNoteAndCheckForPendingChanges_test': function (someTestArgs) {
505 var deferredResult;
506 var proxy;
507 var user;
508
509 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
510 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
511
512 deferredResult = new Clipperz.Async.Deferred("modifyRecordNoteAndCheckForPendingChanges_test", someTestArgs);
513 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
514 deferredResult.addMethod(user, 'login');
515
516 deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d');
517 deferredResult.addCallback(MochiKit.Base.methodcaller('notes'));
518 deferredResult.addTest("aproofofconcept\n<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "The value of the record note is correct");
519
520 deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d');
521 deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "A new note text"));
522
523 deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d');
524 deferredResult.addCallback(MochiKit.Base.methodcaller('notes'));
525 deferredResult.addTest("A new note text", "The value of the record note has been updated");
526
527 deferredResult.addMethod(user, 'hasPendingChanges');
528 deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag");
529
530 deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d');
531 deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges'));
532 deferredResult.addTest(true, "also the record should flat its pending changes on the note field");
533
534 deferredResult.addMethod(user, 'revertChanges');
535 deferredResult.addMethod(user, 'hasPendingChanges');
536 deferredResult.addTest(false, "reverting changes should return to the original state");
537
538 deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d');
539 deferredResult.addCallback(MochiKit.Base.methodcaller('notes'));
540 deferredResult.addTest("aproofofconcept\n<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "The value of the record note is restored to its initial value");
541 deferredResult.callback();
542
543 return deferredResult;
544 },
545
546 //-------------------------------------------------------------------------
547
548 'loadUser_withoutPreferences_andTryToAccessThem_test': function (someTestArgs) {
549 var deferredResult;
550 var proxy;
551 var user;
552
553 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
554 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
555
556 deferredResult = new Clipperz.Async.Deferred("loadUser_withoutPreferences_andTryToAccessThem_test", someTestArgs);
557 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
558 deferredResult.addMethod(user, 'login');
559
560 deferredResult.collectResults({
561 'preferences': [
562 MochiKit.Base.method(user, 'getHeaderIndex', 'preferences'),
563 MochiKit.Base.methodcaller('getDecryptedData')
564 ],
565 'oneTimePasswords': [
566 MochiKit.Base.method(user, 'getHeaderIndex', 'oneTimePasswords'),
567 MochiKit.Base.methodcaller('getDecryptedData')
568 ]
569 });
570 deferredResult.addCallback(function (someValues) {
571 SimpleTest.is(Clipperz.Base.serializeJSON(someValues['preferences']), '{}', "The preferences are empty");
572 });
573
574 deferredResult.callback();
575
576 return deferredResult;
577 },
578
579 //-------------------------------------------------------------------------
580
581 'modifyRecordTitleAndCheckForPendingChanges_test': function (someTestArgs) {
582 var deferredResult;
583 var proxy;
584 var user;
585
586 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
587 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
588
589 deferredResult = new Clipperz.Async.Deferred("modifyRecordTitleAndCheckForPendingChanges_test", someTestArgs);
590 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
591 deferredResult.addMethod(user, 'login');
592
593 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
594 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
595 deferredResult.addTest("Card 1", "The value of the record note is correct");
596
597 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
598 deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Edited card 1"));
599
600 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
601 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
602 deferredResult.addTest("Edited card 1", "The value of the record label has been updated");
603
604 deferredResult.addMethod(user, 'hasPendingChanges');
605 deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag");
606
607 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
608 deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges'));
609 // deferredResult.addTest(true, "also the record should flag its pending changes on the label - 1");
610 deferredResult.addTest(false, "changing just the label (or any other attribute stored on the header) should not trigger the 'hasPendingChanges' flag");
611
612 deferredResult.addMethod(user, 'revertChanges');
613 deferredResult.addMethod(user, 'hasPendingChanges');
614 deferredResult.addTest(false, "reverting changes should return to the original state");
615
616 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
617 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
618 deferredResult.addTest("Card 1", "The value of the record label is restored to its initial value");
619 deferredResult.callback();
620
621 return deferredResult;
622 },
623
624 //-------------------------------------------------------------------------
625
626 'modifyRecordTitleAndCheckForPendingChanges_take2_test': function (someTestArgs) {
627 var deferredResult;
628 var proxy;
629 var user;
630
631 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
632 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
633
634 deferredResult = new Clipperz.Async.Deferred("modifyRecordTitleAndCheckForPendingChanges_take2_test", someTestArgs);
635 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
636 deferredResult.addMethod(user, 'login');
637
638 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
639 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
640 deferredResult.addTest("Card 1", "The value of the record note is correct");
641
642 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
643 deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Edited card 1"));
644
645 deferredResult.addMethod(user, 'hasPendingChanges');
646 deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag");
647
648 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
649 deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges'));
650 // deferredResult.addTest(true, "also the record should flag its pending changes on the label - 2");
651 deferredResult.addTest(false, "only the label has changed, and this should not trigger the 'hasPendingChanges' flag on the record as it is stored in the header");
652
653 // deferredResult.addCallback(Clipperz.log, "=======================================================");
654 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
655 deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Card 1"));
656
657 deferredResult.addMethod(user, 'hasPendingChanges');
658 deferredResult.addTest(false, "Setting the old value back should void all pending changes");
659
660 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
661 deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges'));
662 deferredResult.addTest(false, "also the record should not flag any pending changes, as the original value has been restored");
663
664 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
665 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
666 deferredResult.addTest("Card 1", "The value of the record label is restored to its initial value");
667 deferredResult.callback();
668
669 return deferredResult;
670 },
671
672 //-------------------------------------------------------------------------
673
674 'modifyRecordNoteAndThanResetOriginalValue_test': function (someTestArgs) {
675 var deferredResult;
676 var proxy;
677 var user;
678
679 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
680 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
681
682 deferredResult = new Clipperz.Async.Deferred("modifyRecordNoteAndThanResetOriginalValue_test", someTestArgs);
683 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
684 deferredResult.addMethod(user, 'login');
685
686 deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d');
687 deferredResult.addCallback(MochiKit.Base.methodcaller('notes'));
688 deferredResult.addTest("aproofofconcept\n<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>", "The value of the record note is correct");
689
690 deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d');
691 deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "A new note text"));
692
693 deferredResult.addMethod(user, 'hasPendingChanges');
694 deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag");
695
696 deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d');
697 deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "aproofofconcept\n<script>alert(\"nothing bad in here\");</script><script>alert(\"AAHHGGGH!\");</script>"));
698
699 deferredResult.addMethod(user, 'hasPendingChanges');
700 deferredResult.addTest(false, "setting the field to its original value basically reset the change, like 'revertChanges' would have done");
701 deferredResult.callback();
702
703 return deferredResult;
704 },
705
706 //-------------------------------------------------------------------------
707
708 'modifyRecordNoteAndCommitChanges_test': function (someTestArgs) {
709 var deferredResult;
710 var proxy;
711 var user;
712 var user2;
713 var newNoteText;
714
715 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
716 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
717 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
718 newNoteText = "A new note text";
719
720 deferredResult = new Clipperz.Async.Deferred("modifyRecordAndCommitChanges_test", someTestArgs);
721 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
722 deferredResult.addMethod(user, 'login');
723 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
724 deferredResult.addCallback(MochiKit.Base.methodcaller('notes'));
725 deferredResult.addTest("", "This is the original value of the notes");
726
727 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
728 deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', newNoteText));
729
730 deferredResult.addMethod(user, 'hasPendingChanges');
731 deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag");
732
733 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
734 deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges'));
735 deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag also on the record itself");
736
737 deferredResult.addMethod(user, 'saveChanges');
738
739 deferredResult.addMethod(user, 'hasPendingChanges');
740 deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 1");
741
742 deferredResult.addMethod(user2, 'login');
743 deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
744 deferredResult.addCallback(MochiKit.Base.methodcaller('notes'));
745 deferredResult.addTest(newNoteText, "It looks like the data edited was correctly stored and reloaded here");
746
747 deferredResult.callback();
748
749 return deferredResult;
750 },
751
752 //-------------------------------------------------------------------------
753
754 'multipleModificationToRecordTitleAndCommitChanges_test': function (someTestArgs) {
755 var deferredResult;
756 var proxy;
757 var user;
758 var user2;
759 var user3;
760 var newRecordTitle;
761
762 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
763 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
764 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
765 user3 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
766 newRecordTitle = "A nice new title here";
767
768 deferredResult = new Clipperz.Async.Deferred("multipleModificationToRecordTitleAndCommitChanges_test", someTestArgs);
769 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
770 deferredResult.addMethod(user, 'login');
771 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
772
773 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
774 deferredResult.addTest("Card 1", "This is the original value of the label");
775
776 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
777 deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', newRecordTitle));
778
779 deferredResult.addMethod(user, 'hasPendingChanges');
780 deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag");
781
782 deferredResult.addMethod(user, 'saveChanges');
783 deferredResult.addMethod(user, 'hasPendingChanges');
784 deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 2"); //FAIL
785
786 deferredResult.addMethod(user2, 'login');
787 deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
788 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
789 deferredResult.addTest(newRecordTitle, "It looks like the label edited was correctly stored and reloaded here");
790
791 deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
792 deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', newRecordTitle + "-" + newRecordTitle));
793 deferredResult.addMethod(user2, 'hasPendingChanges');
794 deferredResult.addTest(true, "changing again the value of record's label trigger the 'hasPendingChanges' flag also on the new user");
795
796 deferredResult.addMethod(user2, 'saveChanges');
797 deferredResult.addMethod(user2, 'hasPendingChanges');
798 deferredResult.addTest(false, "after committing the changes, the user has no pending changes"); //FAIL
799
800 deferredResult.addMethod(user3, 'login');
801 deferredResult.addMethod(user3, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
802 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
803 deferredResult.addTest(newRecordTitle + "-" + newRecordTitle, "It looks like the label edited was correctly stored and reloaded here");
804
805 deferredResult.callback();
806
807 return deferredResult;
808 },
809
810 //-------------------------------------------------------------------------
811
812 'saveChangesWithADeletedRecord_test': function (someTestArgs) {
813 var deferredResult;
814 var proxy;
815 var user;
816
817 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
818 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
819
820 deferredResult = new Clipperz.Async.Deferred("saveChangesWithADeletedRecord_test", someTestArgs);
821 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
822 deferredResult.addMethod(user, 'login');
823
824 deferredResult.addMethod(user, 'getRecords');
825 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
826 deferredResult.addTest(1, "This account has oly a single card");
827
828 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
829 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
830 deferredResult.addTest("Card 1", "This is the initial value of the label ...");
831
832 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
833 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
834 deferredResult.addCallback(function (aResult) {
835 SimpleTest.ok(aResult['updated'] != null, "There updated key is not null");
836 SimpleTest.isDeeply(aResult['updated'], [], "There are no updated cards");
837 SimpleTest.ok(aResult['deleted'] != null, "There deleted key is not null");
838 SimpleTest.isDeeply(aResult['deleted'], [], "There are no deleted references");
839 return aResult;
840 })
841 deferredResult.addMethod(user, 'revertChanges');
842
843 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
844 deferredResult.addMethod(user, 'deleteRecord');
845 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
846 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
847 deferredResult.addCallback(function (aResult) {
848 SimpleTest.isDeeply(aResult['deleted'], ['8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'], "The deleted record reference is correctly reported");
849 return aResult;
850 })
851 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
852 deferredResult.shouldFail("accessing the deleted record reference should raise an exception");
853
854 deferredResult.addMethod(user, 'getRecord', '0000000000000000000000000000000000000000000000000000000000000000');
855 deferredResult.shouldFail("accessing a fake record reference should raise an exception");
856
857 deferredResult.addMethod(user, 'saveChanges');
858 deferredResult.addMethod(user, 'getRecords');
859 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
860 deferredResult.addTest(0, "after deleting the only record, there should be no records bound to the user");
861
862 deferredResult.callback();
863
864 return deferredResult;
865 },
866
867 //-------------------------------------------------------------------------
868
869 'revertingChangesAfterDeletingACard_test': function (someTestArgs) {
870 var deferredResult;
871 var proxy;
872 var user;
873
874 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
875 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
876
877 deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs);
878 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
879 deferredResult.addMethod(user, 'login');
880
881 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
882 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
883 deferredResult.addTest("Card 1", "This is the initial value of the label ...");
884
885 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
886 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
887 deferredResult.addCallback(function (aResult) {
888 SimpleTest.ok(aResult['updated'] != null, "There updated key is not null");
889 SimpleTest.isDeeply(aResult['updated'], [], "There are no updated cards");
890 SimpleTest.ok(aResult['deleted'] != null, "There deleted key is not null");
891 SimpleTest.isDeeply(aResult['deleted'], [], "There are no deleted references");
892 return aResult;
893 })
894 deferredResult.addMethod(user, 'revertChanges');
895
896 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
897 deferredResult.addMethod(user, 'deleteRecord');
898 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
899 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
900 deferredResult.addCallback(function (aResult) {
901 SimpleTest.isDeeply(aResult['deleted'], ['8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'], "The deleted record reference is correctly reported");
902 return aResult;
903 })
904 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
905 deferredResult.shouldFail("accessing the deleted record reference should raise an exception");
906
907 deferredResult.addMethod(user, 'getRecord', '0000000000000000000000000000000000000000000000000000000000000000');
908 deferredResult.shouldFail("accessing a fake record reference should raise an exception");
909
910 deferredResult.addMethod(user, 'revertChanges');
911 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
912 deferredResult.addCallback(SimpleTest.ok, true, "after reverting all changes, the deleted card is restored");
913
914 deferredResult.callback();
915
916 return deferredResult;
917 },
918
919 //-------------------------------------------------------------------------
920
921 'lockUnlockAccountAfterDeletingACard_test': function (someTestArgs) {
922 var deferredResult;
923 var proxy;
924 var user;
925 var recordID;
926
927 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
928 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
929
930 recordID = 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5';
931 // recordID = '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a';
932
933 deferredResult = new Clipperz.Async.Deferred("lockUnlockAccountAfterDeletingACard_test", someTestArgs);
934 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
935 deferredResult.addMethod(user, 'login');
936
937 deferredResult.addMethod(user, 'getRecords');
938 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
939 deferredResult.addTest(20, "Initially the user has 20 cards");
940
941 deferredResult.addMethod(user, 'getDirectLogins');
942 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
943 deferredResult.addTest(22, "Initially the user has 22 direct logins");
944
945 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
946 deferredResult.addMethodcaller('directLoginsData');
947 deferredResult.addMethodcaller('values');
948 deferredResult.addCallback(MochiKit.Base.values);
949 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
950 deferredResult.addTest(22, "There should be also 22 direct login references");
951
952 deferredResult.addMethod(user, 'getRecord', recordID);
953 deferredResult.addMethodcaller('directLogins');
954 deferredResult.addCallback(MochiKit.Base.values);
955 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
956 deferredResult.addTest(4, "The selected record has 4 direct logins");
957
958 deferredResult.addMethod(user, 'getRecord', recordID);
959 deferredResult.addMethod(user, 'deleteRecord');
960 deferredResult.addMethod(user, 'saveChanges');
961
962 deferredResult.addMethod(user, 'hasAnyCleanTextData');
963 deferredResult.addTest(true, "after saving changes, hasAnyCleanTextData should be true");
964
965 deferredResult.addMethod(user, 'deleteAllCleanTextData');
966
967 deferredResult.addMethod(user, 'hasAnyCleanTextData');
968 deferredResult.addTest(false, "after deleting all clean text data, hasAnyCleanTextData should be true");
969
970 deferredResult.addMethod(user, 'login');
971
972 deferredResult.addMethod(user, 'getRecords');
973 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
974 deferredResult.addTest((20 - 1), "After deleting a card, only 19 are left");
975
976 deferredResult.addMethod(user, 'getDirectLogins');
977 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
978 deferredResult.addTest((22 - 4), "Initially the user has 18 direct logins");
979
980 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
981 deferredResult.addMethodcaller('directLoginsData');
982 deferredResult.addMethodcaller('values');
983 deferredResult.addCallback(MochiKit.Base.values);
984 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
985 deferredResult.addTest((22 - 4), "Once deleted the card, there should be just 18 direct login references left");
986
987 deferredResult.addCallback(function () {
988 SimpleTest.ok(true, "nothing wrong had happen 'till here");
989 });
990
991 deferredResult.callback();
992
993 return deferredResult;
994 },
995
996 //-------------------------------------------------------------------------
997
998 'lockUnlockAccountAfterDeletingACard_2_test': function (someTestArgs) {
999 var deferredResult;
1000 var proxy;
1001 var user;
1002
1003 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1004 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1005
1006 deferredResult = new Clipperz.Async.Deferred("lockUnlockAccountAfterDeletingACard_2_test", someTestArgs);
1007 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1008 deferredResult.addMethod(user, 'login');
1009
1010 deferredResult.addMethod(user, 'getRecords');
1011 deferredResult.addCallback(function (someRecords) {
1012 SimpleTest.is(someRecords.length, 20, "Initially the user has 20 cards");
1013 });
1014
1015 deferredResult.addMethod(user, 'getDirectLogins');
1016 deferredResult.addCallback(function (someDirectLogins) {
1017 SimpleTest.is(someDirectLogins.length, 22, "Initially the user has 42 direct logins");
1018 });
1019
1020 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
1021 deferredResult.addMethodcaller('directLoginsData');
1022 deferredResult.addMethodcaller('values');
1023 deferredResult.addCallback(MochiKit.Base.values);
1024 deferredResult.addCallback(function (someDirectLoginReferences) {
1025 SimpleTest.is(someDirectLoginReferences.length, 22, "There should be also 22 direct login references - 2");
1026 });
1027
1028 deferredResult.addMethod(user, 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a');
1029 deferredResult.addMethodcaller('directLogins');
1030 deferredResult.addCallback(MochiKit.Base.values);
1031 deferredResult.addCallback(function (someDirectLogins) {
1032 SimpleTest.is(someDirectLogins.length, 1, "The selected record has 4 direct logins");
1033 });
1034
1035
1036 deferredResult.addMethod(user, 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a');
1037 deferredResult.addMethod(user, 'deleteRecord');
1038 deferredResult.addMethod(user, 'saveChanges');
1039 deferredResult.addMethod(user, 'deleteAllCleanTextData');
1040 deferredResult.addMethod(user, 'login');
1041
1042 deferredResult.addMethod(user, 'getRecords');
1043 deferredResult.addCallback(function (someRecords) {
1044 SimpleTest.is(someRecords.length, (20 -1), "After deleting a card, only 19 are left - 2");
1045 });
1046
1047 deferredResult.addMethod(user, 'getDirectLogins');
1048 deferredResult.addCallback(function (someDirectLogins) {
1049 SimpleTest.is(someDirectLogins.length, (22 - 1), "Initially the user has 21 direct logins - 2");
1050 });
1051
1052 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
1053 deferredResult.addMethodcaller('directLoginsData');
1054 deferredResult.addMethodcaller('values');
1055 deferredResult.addCallback(MochiKit.Base.values);
1056 deferredResult.addCallback(function (someDirectLoginReferences) {
1057 SimpleTest.is(someDirectLoginReferences.length, (22 - 1), "Once deleted the card, there should be just 21 direct login references left");
1058 });
1059
1060 deferredResult.addCallback(function () {
1061 SimpleTest.ok(true, "nothing wrong had happen 'till here - 2");
1062 });
1063
1064 deferredResult.callback();
1065
1066 return deferredResult;
1067 },
1068
1069 //-------------------------------------------------------------------------
1070
1071 'simpleSaveChanges_test': function (someTestArgs) {
1072 var deferredResult;
1073 var proxy;
1074 var user;
1075
1076 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1077 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1078
1079 deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs);
1080 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
1081 deferredResult.addMethod(user, 'login');
1082
1083 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1084 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
1085 deferredResult.addTest("Card 1", "This is the initial value of the label ...");
1086
1087 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1088 deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "New label for Card 1"));
1089
1090 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1091 deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "Setting just the label would not trigger the update of the record data and nothing will end up in the 'updated' list"));
1092
1093 deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
1094 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
1095 deferredResult.addCallback(function (aResult) {
1096 SimpleTest.is(aResult['updated'].length, 1, "The updadated record should be listed in the changes getting ready for commit");
1097 return aResult;
1098 })
1099
1100 deferredResult.callback();
1101
1102 return deferredResult;
1103 },
1104
1105 //-------------------------------------------------------------------------
1106
1107 'saveChangesAndDataCaching_test': function (someTestArgs) {
1108 var deferredResult;
1109 var proxy;
1110 var user;
1111 var record_1;
1112 var record_2;
1113
1114 record_1 = '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80';
1115 record_2 = '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d';
1116
1117 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1118 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1119
1120 deferredResult = new Clipperz.Async.Deferred("saveChangesAndDataCaching_test", someTestArgs);
1121 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1122 deferredResult.addMethod(user, 'login');
1123
1124 deferredResult.addMethod(user, 'getRecord', record_1);
1125 deferredResult.addMethodcaller('hasLoadedRemoteData');
1126 deferredResult.addTest(false, "The card data should have not been loaded yet");
1127
1128 deferredResult.addMethod(user, 'getRecord', record_2);
1129 deferredResult.addMethodcaller('hasLoadedRemoteData');
1130 deferredResult.addTest(false, "Also the other card data should have not been loaded yet");
1131
1132 deferredResult.addMethod(user, 'getRecord', record_1);
1133 deferredResult.addMethodcaller('setLabel', "New title");
1134
1135 deferredResult.addMethod(user, 'getRecord', record_1);
1136 deferredResult.addMethodcaller('hasLoadedRemoteData');
1137 deferredResult.addTest(false, "Changing just the label should not trigger the full loading of the card");
1138
1139 deferredResult.addMethod(user, 'getRecord', record_1);
1140 deferredResult.addMethodcaller('setNotes', "New note text");
1141
1142 deferredResult.addMethod(user, 'getRecord', record_1);
1143 deferredResult.addMethodcaller('hasLoadedRemoteData');
1144 deferredResult.addTest(true, "Changing the notes should trigger the loading of the card");
1145
1146 deferredResult.addMethod(user, 'getRecord', record_2);
1147 deferredResult.addMethodcaller('hasLoadedRemoteData');
1148 deferredResult.addTest(false, "Changing record_1 should not trigger the loading of record_2");
1149
1150 deferredResult.addMethod(user, 'hasPendingChanges');
1151 deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag");
1152
1153 deferredResult.addMethod(user, 'saveChanges');
1154 deferredResult.addMethod(user, 'hasPendingChanges');
1155 deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 3");
1156
1157 deferredResult.addMethod(user, 'getRecord', record_1);
1158 deferredResult.addMethodcaller('hasLoadedRemoteData');
1159 deferredResult.addTest(true, "After saving the changes, record_1 sould not have the remote data");
1160
1161 deferredResult.addMethod(user, 'getRecord', record_2);
1162 deferredResult.addMethodcaller('hasLoadedRemoteData');
1163 deferredResult.addTest(false, "After saving, record_2 should still be NOT loaded");
1164
1165
1166 deferredResult.callback();
1167
1168 return deferredResult;
1169 },
1170
1171 //-------------------------------------------------------------------------
1172
1173 'addNewRecordFieldAndSave_test': function (someTestArgs) {
1174 var deferredResult;
1175 var proxy;
1176 var user;
1177
1178 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1179 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1180
1181 deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs);
1182 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
1183 deferredResult.addMethod(user, 'login');
1184
1185 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1186 deferredResult.addMethodcaller('fields');
1187 deferredResult.addCallback(function (someFields) {
1188 SimpleTest.is(MochiKit.Base.values(someFields).length, 3, "The record has initially 3 fields");
1189 });
1190
1191 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1192 deferredResult.addCallback(MochiKit.Base.methodcaller('addField', {'label':"New field label", 'value':"New field value", 'isHidden':false}));
1193
1194 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1195 deferredResult.addMethodcaller('hasPendingChanges');
1196 deferredResult.addTest(true, "adding a field should mark the record as having pending changes");
1197
1198 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1199 deferredResult.addMethodcaller('fields');
1200 deferredResult.addCallback(function (someFields) {
1201 SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The record has now 4 fields");
1202 });
1203
1204 deferredResult.addMethod(user, 'saveChanges');
1205 deferredResult.addMethod(user, 'hasPendingChanges');
1206 deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 4");
1207
1208 deferredResult.addMethod(user, 'hasAnyCleanTextData');
1209 deferredResult.addTest(true, "after saving changes, hasAnyCleanTextData should be true");
1210
1211//deferredResult.addCallback(function (aValue) { console.log(">>> #################################################"); return aValue});
1212 deferredResult.addMethod(user, 'deleteAllCleanTextData');
1213//deferredResult.addCallback(function (aValue) { console.log("<<< #################################################"); return aValue});
1214
1215 deferredResult.addMethod(user, 'hasAnyCleanTextData');
1216 deferredResult.addTest(false, "after deleting all clean text, hasAnyCleanTextData should be false");
1217
1218 deferredResult.callback();
1219
1220 return deferredResult;
1221 },
1222
1223 //-------------------------------------------------------------------------
1224
1225 'deleteRecordFieldAndSave_test': function (someTestArgs) {
1226 var deferredResult;
1227 var proxy;
1228 var user;
1229 var user2;
1230
1231 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1232 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1233 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1234
1235 deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs);
1236 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
1237 deferredResult.addMethod(user, 'login');
1238
1239 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1240 deferredResult.addMethodcaller('fields');
1241 deferredResult.addCallback(function (someFields) {
1242 SimpleTest.is(MochiKit.Base.values(someFields).length, 3, "The record has initially 3 fields");
1243 });
1244
1245 deferredResult.collectResults({
1246 'record': MochiKit.Base.method(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'),
1247 'field': [
1248 MochiKit.Base.method(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'),
1249 MochiKit.Base.methodcaller('fields'),
1250 MochiKit.Base.values,
1251 MochiKit.Base.itemgetter('0')
1252 ]
1253 })
1254 deferredResult.addCallback(function (someValues) {
1255 someValues['record'].removeField(someValues['field']);
1256 });
1257
1258 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1259 deferredResult.addMethodcaller('hasPendingChanges');
1260 deferredResult.addTest(true, "removing a field should mark the record as having pending changes");
1261
1262 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1263 deferredResult.addMethodcaller('fields');
1264 deferredResult.addCallback(function (someFields) {
1265 SimpleTest.is(MochiKit.Base.values(someFields).length, 2, "The record has now 2 fields");
1266 });
1267
1268 deferredResult.addMethod(user, 'saveChanges');
1269 deferredResult.addMethod(user, 'hasPendingChanges');
1270 deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 5");
1271
1272 //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1273
1274 deferredResult.addMethod(user2, 'login');
1275 deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
1276 deferredResult.addMethodcaller('fields');
1277 deferredResult.addCallback(function (someFields) {
1278 SimpleTest.is(MochiKit.Base.values(someFields).length, 2, "Once saved, the record is left with just two fields");
1279 });
1280
1281 deferredResult.callback();
1282
1283 return deferredResult;
1284 },
1285
1286 //-------------------------------------------------------------------------
1287
1288 'loadDirectLogin_test': function (someTestArgs) {
1289 var deferredResult;
1290 var proxy;
1291 var user;
1292
1293 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
1294 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1295
1296 deferredResult = new Clipperz.Async.Deferred("loadDirectLogin_test", someTestArgs);
1297 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1298 deferredResult.addMethod(user, 'login');
1299
1300 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
1301 deferredResult.addCallback(MochiKit.Base.methodcaller('directLogins'));
1302 deferredResult.addCallback(function (someDirectLogins) {
1303 SimpleTest.is(1, MochiKit.Base.keys(someDirectLogins).length, "the Amazon.com card has just one direct login");
1304 });
1305
1306 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
1307 deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges'));
1308 deferredResult.addTest(false, "initially the record does not have any pending changes");
1309
1310 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
1311 deferredResult.addCallback(MochiKit.Base.methodcaller('directLogins'));
1312 deferredResult.addCallback(MochiKit.Base.itemgetter('03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c'));
1313 // deferredResult.addCallback(MochiKit.Base.methodcaller('runDirectLogin', true));
1314 deferredResult.addCallback(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin);
1315
1316 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
1317 deferredResult.addCallback(MochiKit.Base.methodcaller('getFieldsValues'));
1318 deferredResult.addCallback(function (someFieldsValues) {
1319 SimpleTest.is(MochiKit.Base.keys(someFieldsValues).length, 2, "the Amazon.com card has just two fields");
1320 });
1321
1322 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
1323 deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges'));
1324 deferredResult.addTest(false, "accessing fields values should not trigger the 'hasPendingChanges' flag");
1325
1326 deferredResult.callback();
1327
1328 return deferredResult;
1329 },
1330
1331 //-------------------------------------------------------------------------
1332
1333 'readingVeryOldCards_test': function (someTestArgs) {
1334 var deferredResult;
1335 var proxy;
1336 var user;
1337
1338 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
1339 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1340
1341 deferredResult = new Clipperz.Async.Deferred("readingVeryOldCards_test", someTestArgs);
1342 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']);
1343 deferredResult.addMethod(user, 'login');
1344
1345 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1346 deferredResult.addMethodcaller('label');
1347 deferredResult.addTest('Card encoded with an old algorithm', 'the label of the selected record is the expected one');
1348
1349 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1350 deferredResult.addCallback(MochiKit.Base.methodcaller('fields'));
1351 deferredResult.addCallback(function (someFields) {
1352 SimpleTest.is(6, MochiKit.Base.keys(someFields).length, "the 'Card encoded with an old algorithm' card has six fields");
1353 });
1354
1355 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1356 deferredResult.addMethodcaller('hasPendingChanges');
1357 deferredResult.addTest(false, "accessing the card fields should not trigger the hasPendingChanges flag");
1358
1359 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1360 deferredResult.addCallback(MochiKit.Base.methodcaller('addField', {'label':"New field label", 'value':"New field value", 'isHidden':false}));
1361
1362 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1363 deferredResult.addCallback(MochiKit.Base.methodcaller('fields'));
1364 deferredResult.addCallback(function (someFields) {
1365 SimpleTest.is(7, MochiKit.Base.keys(someFields).length, "adding a field shoult bring the total field count to 7");
1366 });
1367
1368 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1369 deferredResult.addMethodcaller('hasPendingChanges');
1370 deferredResult.addTest(true, "adding a field should mark the record as having pending changes - 2");
1371
1372 deferredResult.callback();
1373
1374 return deferredResult;
1375 },
1376
1377 //-------------------------------------------------------------------------
1378
1379 'addingNewEmptyRecordAndSaveChanges_test': function (someTestArgs) {
1380 var deferredResult;
1381 var proxy;
1382 var user;
1383 var newRecordReference;
1384
1385 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1386 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1387 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1388
1389 deferredResult = new Clipperz.Async.Deferred("addingNewEmptyRecordAndSaveChanges_test", someTestArgs);
1390 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']);
1391 deferredResult.addMethod(user, 'login');
1392
1393 deferredResult.addMethod(user, 'getRecords');
1394 deferredResult.addCallback(function (someRecords) {
1395 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record");
1396 });
1397
1398 deferredResult.addMethod(user, 'createNewRecord');
1399 deferredResult.addMethodcaller('reference');
1400 deferredResult.addCallback(function (aNewRecordReference) {
1401 newRecordReference = aNewRecordReference;
1402 })
1403
1404 deferredResult.addMethod(user, 'getRecords');
1405 deferredResult.addCallback(function (someRecords) {
1406 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly");
1407 });
1408
1409 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1410 deferredResult.addMethodcaller('hasPendingChanges');
1411 deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record");
1412
1413 deferredResult.addMethod(user, 'hasPendingChanges');
1414 deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user");
1415
1416 deferredResult.addMethod(user, 'saveChanges');
1417
1418 deferredResult.addMethod(user2, 'login');
1419 deferredResult.addMethod(user2, 'getRecords');
1420 deferredResult.addCallback(function (someRecords) {
1421 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "Reloading the data, just one record is available, as a brand new record without any changes should not be saved");
1422 });
1423
1424 deferredResult.callback();
1425
1426 return deferredResult;
1427 },
1428
1429 //-------------------------------------------------------------------------
1430
1431 'addNewRecordAndSaveChanges_test': function (someTestArgs) {
1432 var deferredResult;
1433 var proxy;
1434 var user;
1435
1436 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1437 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1438 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1439
1440 deferredResult = new Clipperz.Async.Deferred("addNewRecordAndSaveChanges_test", someTestArgs);
1441 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']);
1442 deferredResult.addMethod(user, 'login');
1443
1444 deferredResult.addMethod(user, 'getRecords');
1445 deferredResult.addCallback(function (someRecords) {
1446 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record");
1447 });
1448
1449 deferredResult.addMethod(user, 'createNewRecord');
1450 deferredResult.addCallback(function (aNewRecord) {
1451 var innerDeferredResult;
1452
1453 innerDeferredResult = new Clipperz.Async.Deferred("addNewRecordAndSaveChanges_test <internal>", {trace:false});
1454
1455 innerDeferredResult.addMethod(aNewRecord, 'label');
1456 innerDeferredResult.addTest('', "The label of a brand new record should be the empty string");
1457
1458 innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record label");
1459 innerDeferredResult.addMethod(aNewRecord, 'setNotes', "New record notes");
1460 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 1", 'value':"Value 1", 'isHidden':false});
1461 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 2", 'value':"Value 2", 'isHidden':false});
1462 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 3", 'value':"Value 3", 'isHidden':true});
1463 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 4", 'value':"Value 4", 'isHidden':false});
1464 innerDeferredResult.callback();
1465
1466 return innerDeferredResult;
1467 })
1468
1469 deferredResult.addMethod(user, 'getRecords');
1470 deferredResult.addCallback(function (someRecords) {
1471 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly");
1472 });
1473
1474 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1475 deferredResult.addMethodcaller('hasPendingChanges');
1476 deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record");
1477
1478 deferredResult.addMethod(user, 'hasPendingChanges');
1479 deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user");
1480
1481 deferredResult.addMethod(user, 'saveChanges');
1482
1483 deferredResult.addCallback(function () {
1484 var recordData
1485 var recordVersionData;
1486
1487 recordData = MochiKit.Base.values(proxy.dataStore().data()['users']['9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8']['records'])[1];
1488 recordVersionData = MochiKit.Base.values(recordData['versions'])[0];
1489
1490 SimpleTest.is(recordVersionData['previousVersionKey'], Clipperz.PM.Crypto.nullValue, "The previous version key on the first version of a newly created record is equal to Clipperz.PM.Crypto.nullValue");
1491 });
1492
1493 deferredResult.addMethod(user2, 'login');
1494 deferredResult.addMethod(user2, 'getRecords');
1495 deferredResult.addCallback(function (someRecords) {
1496 SimpleTest.is(someRecords.length, 2, "Reloading the data, two records are available.");
1497 return someRecords;
1498 });
1499 deferredResult.addCallback(MochiKit.Base.itemgetter('1'));
1500 deferredResult.collectResults({
1501 'label':[
1502 MochiKit.Base.methodcaller('label'),
1503 Clipperz.Async.Test.is("New record label", "The label is correct")
1504 ],
1505 'notes':[
1506 MochiKit.Base.methodcaller('notes'),
1507 Clipperz.Async.Test.is("New record notes", "The note is correct")
1508 ],
1509 'fields':[
1510 MochiKit.Base.methodcaller('fields'),
1511 function (someFields) {
1512 SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The fields are 4, as expected");
1513 return someFields;
1514 }
1515 ]
1516 })
1517
1518 deferredResult.callback();
1519
1520 return deferredResult;
1521 },
1522
1523 //-------------------------------------------------------------------------
1524
1525 'addNewRecordAndTestNewRecordIndex_test': function (someTestArgs) {
1526 var deferredResult;
1527 var proxy;
1528 var user;
1529
1530 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1531 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1532
1533 deferredResult = new Clipperz.Async.Deferred("addNewRecordAndTestNewRecordIndex_test", someTestArgs);
1534 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1535 deferredResult.addMethod(user, 'login');
1536
1537 deferredResult.addMethod(user, 'getRecords');
1538 deferredResult.addCallback(function (someRecords) {
1539 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 20, "The user has initially 20 records");
1540 });
1541
1542 deferredResult.addMethod(user, 'createNewRecord');
1543 deferredResult.addCallback(function (aNewRecord) {
1544 var innerDeferredResult;
1545
1546 innerDeferredResult = new Clipperz.Async.Deferred("addNewRecordAndTestNewRecordIndex_test <internal>", {trace:false});
1547
1548 innerDeferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex');
1549 innerDeferredResult.addMethodcaller('recordsIndex');
1550 innerDeferredResult.addCallback(MochiKit.Base.itemgetter(aNewRecord.reference()));
1551 innerDeferredResult.addTest(20, "The index of the new record should be 20");
1552
1553 innerDeferredResult.callback();
1554
1555 return innerDeferredResult;
1556 })
1557
1558 deferredResult.callback();
1559
1560 return deferredResult;
1561 },
1562
1563 //-------------------------------------------------------------------------
1564
1565 'editRecordAndTestForChangesInPreferencesAndOTP_test': function (someTestArgs) {
1566 var deferredResult;
1567 var proxy;
1568 var user;
1569 var user_2;
1570 var originalPreferences;
1571 var originalOTPs;
1572
1573 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1574 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1575 user_2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1576
1577 deferredResult = new Clipperz.Async.Deferred("editRecordAndTestForChangesInPreferencesAndOTP_test", someTestArgs);
1578 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']);
1579 deferredResult.addMethod(user, 'login');
1580 deferredResult.addMethod(user, 'getServerData');
1581
1582 deferredResult.collectResults({
1583 'preferences': [
1584 MochiKit.Base.method(user, 'getHeaderIndex', 'preferences'),
1585 MochiKit.Base.methodcaller('getDecryptedData')
1586 ],
1587 'oneTimePasswords': [
1588 MochiKit.Base.method(user, 'getHeaderIndex', 'oneTimePasswords'),
1589 MochiKit.Base.methodcaller('getDecryptedData')
1590 ]
1591 });
1592
1593 deferredResult.addCallback(function (someValues) {
1594//console.log("SOME VALUES", someValues);
1595 originalPreferences = Clipperz.Base.deepClone(someValues['preferences']);
1596 originalOTPs = Clipperz.Base.deepClone(someValues['oneTimePasswords']);
1597
1598 SimpleTest.is(originalPreferences['preferredLanguage'], 'en-US', "Preference.language is ok");
1599 SimpleTest.is(originalPreferences['shouldShowDonationPanel'], false, "Preference.shouldShowDonationPanel is ok");
1600
1601 SimpleTest.is(MochiKit.Base.keys(originalOTPs).length, 6, "the number of OTPs is as expected");
1602 });
1603
1604 deferredResult.addMethod(user, 'getRecord', '35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b');
1605 deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "NEW LABEL"));
1606 deferredResult.addMethod(user, 'saveChanges');
1607
1608 deferredResult.addMethod(user_2, 'login');
1609 deferredResult.addMethod(user_2, 'getServerData');
1610
1611 deferredResult.collectResults({
1612 'preferences': [
1613 MochiKit.Base.method(user_2, 'getHeaderIndex', 'preferences'),
1614 MochiKit.Base.methodcaller('getDecryptedData')
1615 ],
1616 'oneTimePasswords': [
1617 MochiKit.Base.method(user_2, 'getHeaderIndex', 'oneTimePasswords'),
1618 MochiKit.Base.methodcaller('getDecryptedData')
1619 ]
1620 });
1621
1622 deferredResult.addCallback(function (someValues) {
1623//console.log("SOME VALUES", someValues);
1624 // originalPreferences = Clipperz.Base.deepClone(someValues['preferences']);
1625 // originalOTPs = Clipperz.Base.deepClone(someValues['oneTimePasswords']);
1626
1627 SimpleTest.is(someValues['preferences']['preferredLanguage'], originalPreferences['preferredLanguage'], "Preference.language is preserved");
1628 SimpleTest.is(someValues['preferences']['shouldShowDonationPanel'], originalPreferences['shouldShowDonationPanel'], "Preference.shouldShowDonationPanel is preserved");
1629
1630 SimpleTest.is(MochiKit.Base.keys(someValues['oneTimePasswords']).length, MochiKit.Base.keys(originalOTPs).length, "the number of OTPs is preserved");
1631 });
1632
1633 deferredResult.callback();
1634
1635 return deferredResult;
1636 },
1637
1638 //-------------------------------------------------------------------------
1639
1640 'addRecordAndSaveChangesMultipleTimes_test': function (someTestArgs) {
1641 var deferredResult;
1642 var proxy;
1643 var user;
1644
1645 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1646 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1647 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1648
1649 deferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test", someTestArgs);
1650 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']);
1651 deferredResult.addMethod(user, 'login');
1652
1653 deferredResult.addMethod(user, 'getRecords');
1654 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1655 deferredResult.addTest(1, "The user has one record stored in its account");
1656
1657 deferredResult.addMethod(user, 'hasPendingChanges');
1658 deferredResult.addTest(false, "After loading records, the user should have no pending changes");
1659
1660 deferredResult.addMethod(user, 'createNewRecord');
1661 deferredResult.addCallback(function (aNewRecord) {
1662 var innerDeferredResult;
1663
1664 innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test <internal [1]>", {trace:false});
1665
1666 innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 1");
1667 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'record number', 'value':"1", 'isHidden':false});
1668 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'field count', 'value':"2", 'isHidden':false});
1669 innerDeferredResult.callback();
1670
1671 return innerDeferredResult;
1672 })
1673
1674 deferredResult.addMethod(user, 'hasPendingChanges');
1675 deferredResult.addTest(true, "Before saving, the user has pending changes");
1676
1677 deferredResult.addMethod(user, 'saveChanges');
1678 deferredResult.addCallback(SimpleTest.ok, true, "Saving worked (apparently) fine");
1679
1680 deferredResult.addMethod(user, 'hasPendingChanges');
1681 deferredResult.addTest(false, "After saving, the user has no pending changes");
1682
1683 deferredResult.addMethod(user, 'createNewRecord');
1684 deferredResult.addCallback(function (aNewRecord) {
1685 var innerDeferredResult;
1686
1687 innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test <internal [2]>", {trace:false});
1688
1689 innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 2");
1690 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"record number", 'value':"2", 'isHidden':false});
1691 innerDeferredResult.callback();
1692
1693 return innerDeferredResult;
1694 })
1695 deferredResult.addMethod(user, 'saveChanges');
1696
1697 deferredResult.addMethod(user, 'getRecords');
1698 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1699 deferredResult.addTest(3, "After having created two new records, the total should be updated accordingly");
1700
1701
1702 deferredResult.addMethod(user2, 'login');
1703 deferredResult.addMethod(user2, 'getRecords');
1704 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1705 deferredResult.addTest(3, "Reloading the data, three records are available");
1706
1707 deferredResult.addMethod(user2, 'recordWithLabel', 'New record 1');
1708//deferredResult.addCallback(function (aValue) { console.log("RECORD with Label", aValue); return aValue; });
1709 deferredResult.collectResults({
1710 'label':[
1711 MochiKit.Base.methodcaller('label'),
1712 MochiKit.Base.partial(Clipperz.Async.Test.is, 'New record label', "The label is correct")
1713 ],
1714 'notes':[
1715 MochiKit.Base.methodcaller('notes'),
1716 Clipperz.Async.Test.is('', "The note of the new created record is empty")
1717 ],
1718 'fields':[
1719 MochiKit.Base.methodcaller('fields'),
1720 MochiKit.Base.values,
1721 MochiKit.Base.itemgetter('length'),
1722 Clipperz.Async.Test.is(2, "The new record has just one field, as expected")
1723 ],
1724 'fieldValues_1': [
1725 MochiKit.Base.methodcaller('fieldWithLabel', 'record number'),
1726 MochiKit.Base.methodcaller('value'),
1727 Clipperz.Async.Test.is('1', "The field value is as expected")
1728 ],
1729 'fieldValues_2': [
1730 MochiKit.Base.methodcaller('fieldWithLabel', 'field count'),
1731 MochiKit.Base.methodcaller('value'),
1732 Clipperz.Async.Test.is('2', "Also the second field value is as expected")
1733 ]
1734 })
1735
1736 deferredResult.callback();
1737
1738 return deferredResult;
1739 },
1740
1741 //-------------------------------------------------------------------------
1742
1743 'addNewRecordAndRevertChanges_test': function (someTestArgs) {
1744 var deferredResult;
1745 var proxy;
1746 var user, user2;
1747
1748 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1749 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1750 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
1751
1752 deferredResult = new Clipperz.Async.Deferred("addNewRecordAndRevertChanges_test", someTestArgs);
1753 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']);
1754 deferredResult.addMethod(user, 'login');
1755
1756 deferredResult.addMethod(user, 'getRecords');
1757 deferredResult.addCallback(function (someRecords) {
1758 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record");
1759 });
1760
1761 deferredResult.addMethod(user, 'createNewRecord');
1762 deferredResult.addCallback(function (aNewRecord) {
1763 returnClipperz.Async.callbacks("addNewRecordAndRevertChanges_test <internal>", [
1764 MochiKit.Base.method(aNewRecord, 'setLabel', "New record label"),
1765 MochiKit.Base.method(aNewRecord, 'setNotes', "New record notes"),
1766 MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 1", 'value':"Value 1", 'isHidden':false}),
1767 MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 2", 'value':"Value 2", 'isHidden':false}),
1768 MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 3", 'value':"Value 3", 'isHidden':true}),
1769 MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 4", 'value':"Value 4", 'isHidden':false})
1770 ], {trace:false});
1771 })
1772
1773 deferredResult.addMethod(user, 'getRecords');
1774 deferredResult.addCallback(function (someRecords) {
1775 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly");
1776 });
1777
1778 deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a');
1779 deferredResult.addMethodcaller('hasPendingChanges');
1780 deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record");
1781
1782 deferredResult.addMethod(user, 'hasPendingChanges');
1783 deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user");
1784
1785 deferredResult.addMethod(user, 'revertChanges');
1786 deferredResult.addMethod(user, 'hasPendingChanges');
1787 deferredResult.addTest(false, "reverting changes shoud restore the previous state on the user");
1788
1789 deferredResult.addMethod(user2, 'login');
1790 deferredResult.addMethod(user2, 'getRecords');
1791 deferredResult.addCallback(function (someRecords) {
1792 SimpleTest.is(someRecords.length, 1, "Reloading the data, just one record is available.");
1793 return someRecords;
1794 });
1795
1796 deferredResult.callback();
1797
1798 return deferredResult;
1799 },
1800
1801 //-------------------------------------------------------------------------
1802
1803 'logout_test': function (someTestArgs) {
1804 var deferredResult;
1805 var proxy;
1806 var user;
1807
1808 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1809 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1810
1811 deferredResult = new Clipperz.Async.Deferred("logout_test", someTestArgs);
1812 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']);
1813 deferredResult.addMethod(user, 'login');
1814
1815 deferredResult.addMethod(user, 'getRecords');
1816 deferredResult.addCallback(function (someRecords) {
1817 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 18, "The user has 18 records");
1818 });
1819
1820 deferredResult.addMethod(user, 'logout');
1821 deferredResult.shouldSucceed("Logging out should not trigger an exception");
1822
1823 deferredResult.callback();
1824
1825 return deferredResult;
1826 },
1827
1828 //-------------------------------------------------------------------------
1829
1830 'lock_test': function (someTestArgs) {
1831 var deferredResult;
1832 var proxy;
1833 var user;
1834 var returnPassword= function () { return MochiKit.Async.succeed('clipperz'); };
1835 var failPassword= function () { throw "Unexpected access to the password"; };
1836 var currentPasswordFunction = returnPassword;
1837 var passwordFunction = function () { return currentPasswordFunction(); };
1838
1839
1840 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1841 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:passwordFunction});
1842
1843 deferredResult = new Clipperz.Async.Deferred("lock_test", someTestArgs);
1844 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']);
1845
1846 deferredResult.addMethod(user, 'login');
1847
1848 deferredResult.addMethod(user, 'getRecords');
1849 deferredResult.addCallback(function (someRecords) {
1850 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 18, "The user has 18 records");
1851 });
1852
1853 deferredResult.addMethod(user, 'getDirectLogins');
1854 deferredResult.addCallback(function (someDirectLogins) {
1855 SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 22, "The user has 22 direct logins");
1856 });
1857
1858 deferredResult.addMethod(proxy, 'shouldNotReceiveAnyFurtherRequest');
1859 deferredResult.addCallback(function () { currentPasswordFunction = failPassword; });
1860
1861 deferredResult.addMethod(user, 'lock');
1862 deferredResult.shouldSucceed("Locking out should not trigger an exception");
1863
1864 deferredResult.addMethod(proxy, 'unexpectedRequests');
1865 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1866 deferredResult.addTest(0, "The proxy should have not received any extra request");
1867//deferredResult.addCallback(function (aValue) { console.log("PROXY.unexpectedRequests", Clipperz.Base.serializeJSON(proxy.unexpectedRequests())); return aValue; });
1868 deferredResult.addMethod(proxy, 'mayReceiveMoreRequests');
1869 deferredResult.addCallback(function () { currentPasswordFunction = returnPassword; });
1870
1871 deferredResult.callback();
1872
1873 return deferredResult;
1874 },
1875
1876 //-------------------------------------------------------------------------
1877
1878 'registerNewUser_test': function (someTestArgs) {
1879 var deferredResult;
1880 var proxy;
1881 var user, user2;
1882 var username;
1883 var passphrase;
1884
1885 username = "new";
1886 passphrase = "user";
1887
1888 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1889 // user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return MochiKit.Async.succeed(passphrase);}});
1890 user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
1891
1892 deferredResult = new Clipperz.Async.Deferred("registerNewUser_test", someTestArgs);
1893 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']);
1894
1895 deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, username, function () { return MochiKit.Async.succeed(passphrase);});
1896 deferredResult.setValue('user');
1897
1898 deferredResult.addMethodcaller('getRecords');
1899 deferredResult.addCallback(function (someRecords) {
1900 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 0, "The newly created user has no records");
1901 });
1902 deferredResult.getValue('user');
1903 deferredResult.addMethodcaller('logout');
1904
1905 deferredResult.addMethod(user2, 'login');
1906 deferredResult.addMethod(user2, 'getDirectLogins');
1907 deferredResult.addCallback(function (someDirectLogins) {
1908 SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 0, "The user has no direct logins");
1909 });
1910
1911 deferredResult.callback();
1912
1913 return deferredResult;
1914 },
1915
1916 //-------------------------------------------------------------------------
1917
1918 'registerNewUserAndAddARecord_test': function (someTestArgs) {
1919 var deferredResult;
1920 var proxy;
1921 var user, user2;
1922 var username;
1923 var passphrase;
1924
1925 username = "new";
1926 passphrase = "user";
1927
1928 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1929 user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
1930
1931 deferredResult = new Clipperz.Async.Deferred("registerNewUserAndAddARecord_test", someTestArgs);
1932 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']);
1933
1934 deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, username, function () { return MochiKit.Async.succeed(passphrase);});
1935 deferredResult.setValue('user');
1936
1937 deferredResult.addMethodcaller('getRecords');
1938 deferredResult.addCallback(function (someRecords) {
1939 SimpleTest.is(MochiKit.Base.keys(someRecords).length, 0, "The newly created user has no records");
1940 });
1941
1942 deferredResult.getValue('user');
1943 deferredResult.addMethodcaller('createNewRecord');
1944 deferredResult.addCallback(function (aNewRecord) {
1945 var innerDeferredResult;
1946
1947 innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test <internal [1]>", {trace:false});
1948
1949 innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 1");
1950 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'record number', 'value':"1", 'isHidden':false});
1951 innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'field count', 'value':"2", 'isHidden':false});
1952 innerDeferredResult.callback();
1953
1954 return innerDeferredResult;
1955 })
1956
1957 deferredResult.getValue('user');
1958 deferredResult.addMethodcaller('saveChanges');
1959 deferredResult.addCallback(SimpleTest.ok, true, "Saving worked (apparently) fine");
1960
1961
1962 deferredResult.getValue('user');
1963 deferredResult.addMethodcaller('logout');
1964
1965 deferredResult.addMethod(user2, 'login');
1966 deferredResult.addMethod(user2, 'getRecords');
1967 deferredResult.addCallback(function (someDirectLogins) {
1968 SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 1, "The user - even after a brand new login - has the newly created record");
1969 });
1970
1971 deferredResult.callback();
1972
1973 return deferredResult;
1974 },
1975
1976 //-------------------------------------------------------------------------
1977
1978 'changePassphrase_test': function (someTestArgs) {
1979 var deferredResult;
1980 var proxy;
1981 var user;
1982 var user2;
1983 var newPassphrase;
1984
1985 newPassphrase = 'zreppilc';
1986 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
1987 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
1988 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return newPassphrase;}});
1989
1990 deferredResult = new Clipperz.Async.Deferred("changePassphrase_test", someTestArgs);
1991 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
1992
1993 deferredResult.addMethod(user, 'login');
1994
1995 deferredResult.addMethod(user, 'getRecords');
1996 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
1997 deferredResult.addTest(20, "This account has oly a single card");
1998
1999 deferredResult.addMethod(user, 'changePassphrase', newPassphrase);
2000 deferredResult.addMethod(user, 'logout');
2001
2002 deferredResult.addMethod(user2, 'login');
2003 deferredResult.addMethod(user2, 'getRecords');
2004 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
2005 deferredResult.addTest(20, "This account has oly a single card");
2006
2007 deferredResult.callback();
2008
2009 return deferredResult;
2010 },
2011
2012 //-------------------------------------------------------------------------
2013/*
2014 'rearrangeRecordFieldOrderAndSave_test': function (someTestArgs) {
2015 var deferredResult;
2016 var proxy;
2017 var user;
2018
2019 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
2020 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
2021
2022 deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs);
2023 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
2024 deferredResult.addMethod(user, 'login');
2025
2026 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
2027 deferredResult.addMethodcaller('fields');
2028 deferredResult.addCallback(function (someFields) {
2029 var fields;
2030
2031 fields = MochiKit.Base.values(someFields);
2032 SimpleTest.is(fields.length, 3, "The record has initially 3 fields");
2033 SimpleTest.is(fields[0].reference(), '6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b', "the first field is the expected one");
2034 SimpleTest.is(fields[1].reference(), 'fde88847cdbae6f7ee7e38aca1a242492888ff430a79c997bc6ba4afd0540ca2', "the second field is the expected one");
2035 SimpleTest.is(fields[2].reference(), 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410', "the third field is the expected one");
2036 });
2037
2038 // "6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b": {
2039 // "label":"Label 1","value":"Value 1","type":"TXT","hidden":false
2040 // },
2041 // "fde88847cdbae6f7ee7e38aca1a242492888ff430a79c997bc6ba4afd0540ca2": {
2042 // "label":"Label 2","value":"Value 2","type":"PWD","hidden":true
2043 // },
2044 // "bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410": {
2045 // "label":"Label 3","value":"http://www.example.com","type":"URL","hidden":false
2046 // }
2047
2048 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
2049 deferredResult.addCallback(MochiKit.Base.methodcaller('sortFieldReference', [
2050 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410',
2051 '6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b',
2052 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410'
2053 ]));
2054
2055 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
2056 deferredResult.addMethodcaller('hasPendingChanges');
2057 deferredResult.addTest(true, "adding a field should mark the record as having pending changes");
2058
2059 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
2060 deferredResult.addMethodcaller('fields');
2061 deferredResult.addCallback(function (someFields) {
2062 SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The record has now 4 fields");
2063 });
2064
2065 deferredResult.addMethod(user, 'saveChanges');
2066 deferredResult.addMethod(user, 'hasPendingChanges');
2067 deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 4");
2068
2069 deferredResult.callback();
2070
2071 return deferredResult;
2072 },
2073*/
2074 //-------------------------------------------------------------------------
2075 'syntaxFix': MochiKit.Base.noop
2076};
2077
2078
2079
2080//#############################################################################
2081
2082SimpleTest.runDeferredTests("Clipperz.PM.DataModel.User", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html
new file mode 100644
index 0000000..d762093
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html
@@ -0,0 +1,47 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.DataModel.* - tests</title>
32
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script>
35</head>
36<body>
37<script>
38TestRunner.runTests(
39 'EncryptedRemoteObject.html',
40 'Record.html',
41 'DirectLogin.html',
42 'User.html',
43 'OneTimePassword.html'
44);
45</script>
46</body>
47</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.html b/frontend/gamma/tests/tests/Clipperz/PM/Date.html
new file mode 100644
index 0000000..106774b
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.html
@@ -0,0 +1,59 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.Date - test</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <!-- script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script -->
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37
38 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
39
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46
47 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
50 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
51
52</head>
53<body>
54<pre id="test">
55 <script type="text/javascript" src="Date.test.js"></script>
56</pre>
57
58</body>
59</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js
new file mode 100644
index 0000000..df271f1
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js
@@ -0,0 +1,90 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29var tests = {
30
31 //-------------------------------------------------------------------------
32
33 'offlineDataParsing_test': function () {
34 var value;
35 varparsedValue;
36 var expectedValue;
37
38 value = 'Tue Mar 27 06:41:37 PDT 2007';
39 parsedValue = Clipperz.PM.Date.parse(value);
40 expectedValue = new Date();
41 expectedValue.setUTCFullYear(2007, 03 - 1, 27);
42 expectedValue.setUTCHours(13, 41, 37);
43 // SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [1]");
44 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [1]");
45
46 value = 'Thu May 10 15:01:21 PDT 2007';
47 parsedValue = Clipperz.PM.Date.parse(value);
48 expectedValue = new Date();
49 expectedValue.setUTCFullYear(2007, 05 - 1, 10);
50 expectedValue.setUTCHours(22, 01, 21);
51 // SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 00:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]");
52 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]");
53
54 value = 'Thu May 10 15:01:21 PST 2007';
55 parsedValue = Clipperz.PM.Date.parse(value);
56 expectedValue = new Date();
57 expectedValue.setUTCFullYear(2007, 05 - 1, 10);
58 expectedValue.setUTCHours(23, 01, 21);
59 // SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 01:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]");
60 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]");
61 },
62
63 //-------------------------------------------------------------------------
64
65 'onlineDataParsing_test': function () {
66 var value;
67 varparsedValue;
68 var expectedValue;
69
70 value = 'Tue, 27 March 2007 06:41:37 PDT';
71 parsedValue = Clipperz.PM.Date.parse(value);
72 expectedValue = new Date();
73 expectedValue.setUTCFullYear(2007, 03 - 1, 27);
74 expectedValue.setUTCHours(13, 41, 37);
75
76 // SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format returned by the server is processed correctly");
77 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format returned by the server is processed correctly");
78 },
79
80 //-------------------------------------------------------------------------
81 'syntaxFix': MochiKit.Base.noop
82};
83
84//#############################################################################
85
86Clipperz.PM.Strings.Languages.initSetup();
87SimpleTest.runDeferredTests("Clipperz.PM.Date", tests, {trace:false});
88
89
90
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
new file mode 100644
index 0000000..573dac8
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
@@ -0,0 +1,65 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.Proxy - TEST</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
57 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
58
59</head>
60<body>
61<pre id="test">
62 <script type="text/javascript" src="Proxy.test.js"></script>
63</pre>
64</body>
65</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js
new file mode 100644
index 0000000..8a16a5b
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js
@@ -0,0 +1,117 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 //-------------------------------------------------------------------------
34
35 'simple_tests': function() {
36 vardeferredResult;
37
38 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
39 deferredResult.addCallback(function() {
40 var proxy;
41
42 proxy = new Clipperz.PM.Proxy();
43 ok(proxy != null, "can create instances of the Proxy class");
44 is(proxy.shouldPayTolls(), false, "proxy is set to NOT pay tolls by default");
45 });
46
47 deferredResult.callback();
48
49 return deferredResult;
50 },
51
52 //-------------------------------------------------------------------------
53
54 'simpleTestsWithTolls_tests': function() {
55 vardeferredResult;
56
57 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
58 deferredResult.addCallback(function() {
59 var proxy;
60
61 proxy = new Clipperz.PM.Proxy({shouldPayTolls:true});
62 is(proxy.shouldPayTolls(), true, "I can set Proxy to pays tolls");
63 });
64
65 deferredResult.callback();
66
67 return deferredResult;
68 },
69
70 //-------------------------------------------------------------------------
71 'syntaxFix': MochiKit.Base.noop
72};
73
74//#############################################################################
75
76runTests = function(aClassName) {
77 try {
78 var deferredTests;
79 var aTestName;
80
81 deferredTests = new Clipperz.Async.Deferred(aClassName + ".test", {trace:false});
82
83 aTestName = window.location.href.match(/#.*/);
84 if (aTestName && (aTestName != '#')) {
85 aTestName = aTestName[0].slice(1);
86 if (aTestName in tests) {
87 //Clipperz.log("single test execution, via fragment identifier", aTestName);
88 deferredTests.addCallback(tests[aTestName]);
89 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
90 } else {
91 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run");
92 }
93 } else {
94 for (aTestName in tests) {
95 deferredTests.addCallback(tests[aTestName]);
96 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
97 }
98 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests");
99 }
100 deferredTests.addBoth(SimpleTest.finish);
101 deferredTests.callback();
102
103 SimpleTest.waitForExplicitFinish();
104 } catch (err) {
105 var s = "test suite failure!\n";
106 var o = {};
107 var k = null;
108 for (k in err) {
109 // ensure unique keys?!
110 if (!o[k]) {
111 s += k + ": " + err[k] + "\n";
112 o[k] = err[k];
113 }
114 }
115 ok ( false, s );
116 }
117}("Clipperz.PM.Proxy");
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
new file mode 100644
index 0000000..7937380
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
@@ -0,0 +1,62 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.Toll - test</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
51
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
53 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
54
55</head>
56<body>
57<pre id="test">
58 <script type="text/javascript" src="Toll.test.js"></script>
59</pre>
60
61</body>
62</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js
new file mode 100644
index 0000000..b54996f
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js
@@ -0,0 +1,202 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 //-------------------------------------------------------------------------
34/*
35 'simple_test': function() {
36 vardeferredResult;
37
38 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
39 deferredResult.addCallback(function() {
40 vartollTargetValue;
41 vartoll;
42 var price;
43
44 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
45 tollTargetValue = Clipperz.Crypto.SHA.sha256(tollTargetValue);
46
47 price = 1;
48 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
49 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
50 toll.pay();
51
52 price = 5;
53 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
54 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
55 toll.pay();
56
57 price = 6;
58 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
59 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
60 toll.pay();
61
62 price = 7;
63 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
64 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
65 toll.pay();
66
67 price = 7;
68 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
69 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
70 toll.pay();
71 });
72
73 deferredResult.callback();
74
75 return deferredResult;
76 },
77*/
78 //-------------------------------------------------------------------------
79
80 'deferredPay_test': function() {
81 vardeferredResult;
82 vartollTargetValue;
83 var toll_1, toll_5, toll_6, toll_7, toll_10, toll_16;
84
85 // tollTargetValue = Clipperz.Crypto.SHA.sha256(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32));
86
87
88
89 deferredResult = new Clipperz.Async.Deferred("deferredPay_tests", {trace:false});
90
91 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
92 toll_1 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:1});
93
94 deferredResult.addMethod(toll_1, 'deferredPay');
95 deferredResult.addCallback(function (aResult) {
96 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 1), "Payed a toll of cost 1");
97 });
98 deferredResult.addCallback(MochiKit.Async.wait, 1);
99
100 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
101 toll_5 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:5});
102
103 deferredResult.addMethod(toll_5, 'deferredPay');
104 deferredResult.addCallback(function (aResult) {
105 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 5), "Payed a toll of cost 5");
106 });
107 deferredResult.addCallback(MochiKit.Async.wait, 1);
108
109
110 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
111 toll_6 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:6});
112
113 deferredResult.addMethod(toll_6, 'deferredPay');
114 deferredResult.addCallback(function (aResult) {
115 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 6), "Payed a toll of cost 6");
116 });
117 deferredResult.addCallback(MochiKit.Async.wait, 1);
118
119
120 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
121 toll_7 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:7});
122
123 deferredResult.addMethod(toll_7, 'deferredPay');
124 deferredResult.addCallback(function (aResult) {
125 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 7), "Payed a toll of cost 7");
126 });
127 deferredResult.addCallback(MochiKit.Async.wait, 1);
128
129
130 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
131 toll_10 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:10});
132
133 deferredResult.addMethod(toll_10, 'deferredPay');
134 deferredResult.addCallback(function (aResult) {
135 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 10), "Payed a toll of cost 10");
136 });
137 deferredResult.addCallback(MochiKit.Async.wait, 1);
138
139/*
140 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
141 toll_16 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:16});
142
143 deferredResult.addMethod(toll_16, 'deferredPay');
144 deferredResult.addCallback(function (aResult) {
145 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 16), "Payed a toll of cost 16");
146 });
147 deferredResult.addCallback(MochiKit.Async.wait, 1);
148*/
149
150 deferredResult.callback();
151
152 return deferredResult;
153 },
154
155 //-------------------------------------------------------------------------
156 'syntaxFix': MochiKit.Base.noop
157};
158
159//#############################################################################
160
161runTests = function() {
162 try {
163 var deferredTests;
164 var aTestName;
165
166 deferredTests = new Clipperz.Async.Deferred("Clipperz.PM.Toll.test", {trace:false});
167
168 aTestName = window.location.href.match(/#.*/);
169 if (aTestName && (aTestName != '#')) {
170 aTestName = aTestName[0].slice(1);
171 if (aTestName in tests) {
172 //Clipperz.log("single test execution, via fragment identifier", aTestName);
173 deferredTests.addCallback(tests[aTestName]);
174 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
175 } else {
176 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run");
177 }
178 } else {
179 for (aTestName in tests) {
180 deferredTests.addCallback(tests[aTestName]);
181 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
182 }
183 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests");
184 }
185 deferredTests.addBoth(SimpleTest.finish);
186 deferredTests.callback();
187
188 SimpleTest.waitForExplicitFinish();
189 } catch (err) {
190 var s = "test suite failure!\n";
191 var o = {};
192 var k = null;
193 for (k in err) {
194 // ensure unique keys?!
195 if (!o[k]) {
196 s += k + ": " + err[k] + "\n";
197 o[k] = err[k];
198 }
199 }
200 ok ( false, s );
201 }
202}();
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html
new file mode 100644
index 0000000..6fbdcd6
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html
@@ -0,0 +1,64 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.UI.Web.MainController - test</title>
32
33 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../../../../SimpleTest/test.css">
37
38 <script type='text/javascript' src='../../../../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../../../../js/Clipperz/Async.js'></script>
43 <script type='text/javascript' src='../../../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44
45 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SRP.js'></script>
51
52 <script type='text/javascript' src='../../../../../../../js/Clipperz/Signal.js'></script>
53
54 <script type='text/javascript' src='../../../../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script>
55 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.Async.js"></script>
56
57</head>
58<body>
59<pre id="test">
60 <script type="text/javascript" src="MainController.test.js"></script>
61</pre>
62
63</body>
64</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js
new file mode 100644
index 0000000..3953558
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js
@@ -0,0 +1,90 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29//Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30
31var tests = {
32
33 'isPassphraseDelegateLockSetAfterInit': function (someTestArgs) {
34 return Clipperz.Async.callbacks('isPassphraseDelegateLockSetAfterInit', [
35 function () {
36 var mainController;
37
38 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
39 SimpleTest.is(true, mainController._passphraseDelegateLock.locked, 'passphraseDelegate lock is locked after MainController initialization')
40 }]);
41 },
42
43 //-------------------------------------------------------------------------
44
45 'getPassphraseWithUnsetDelegate_test': function (someTestArgs) {
46 var deferredResult;
47 var mainController;
48 var delegateFunction;
49
50 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
51 delegateFunction = function () { return "clipperz";};
52
53 MochiKit.Async.callLater(1, MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction));
54
55 return Clipperz.Async.callbacks("MainController.getPassphraseWithUnsetDelegate",[
56 MochiKit.Base.method(mainController, 'getPassphrase'),
57 function (aResult) {
58 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct");
59 }
60 ], {trace:false});
61 },
62
63 //-------------------------------------------------------------------------
64
65 'getPassphraseWithSetDelegate_test': function (someTestArgs) {
66 var deferredResult;
67 var mainController;
68 var delegateFunction;
69
70 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
71 delegateFunction = function () {return "clipperz";};
72
73 return Clipperz.Async.callbacks("MainController.getPassphraseWithSetDelegate_test",[
74 MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction),
75 MochiKit.Base.method(mainController, 'getPassphrase'),
76 function (aResult) {
77 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct");
78 }
79 ], {trace:false});
80 },
81
82 //-------------------------------------------------------------------------
83 'syntaxFix': MochiKit.Base.noop
84};
85
86
87
88//#############################################################################
89
90SimpleTest.runDeferredTests("Clipperz.PM.UI.Web.Controllers.MainController", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html
new file mode 100644
index 0000000..f3283b6
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html
@@ -0,0 +1,46 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.UI.Web.Controllers.* - tests</title>
32
33 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../../../SimpleTest/TestRunner.js"></script>
35</head>
36<body>
37<script>
38TestRunner.runTests(
39//
40 //This is still a complete mess.
41//
42 'MainController.html'
43);
44</script>
45</body>
46</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html
new file mode 100644
index 0000000..9afa73d
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html
@@ -0,0 +1,45 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.UI.Web* - tests</title>
32
33 <script type="text/javascript" src="../../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../../SimpleTest/TestRunner.js"></script>
35</head>
36<body>
37<script>
38TestRunner.runTests(
39//
40 //This is still a complete mess.
41//
42);
43</script>
44</body>
45</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html
new file mode 100644
index 0000000..867362b
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html
@@ -0,0 +1,45 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.UI.* - tests</title>
32
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script>
35</head>
36<body>
37<script>
38TestRunner.runTests(
39//
40 //This is still a complete mess.
41//
42);
43</script>
44</body>
45</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/index.html b/frontend/gamma/tests/tests/Clipperz/PM/index.html
new file mode 100644
index 0000000..acc45f7
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/PM/index.html
@@ -0,0 +1,56 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.PM.* - tests</title>
32
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script>
35</head>
36<body>
37<script>
38TestRunner.runTests(
39//
40 //This is still a complete mess.
41//
42 //'BookmarkletProcessor.html',
43 'Connection.html',
44 'Crypto.html',
45 //'Crypto_other_implementation_comparison.html',
46 'Crypto_performanceEvaluation.html',
47 //'CryptoPerformance_ByteArrayArray.html',
48 //'CryptoPerformance_ByteArrayHex.html',
49 //'CryptoPerformance_ByteArrayString.html',
50 'Date.html',
51 'Proxy.html',
52 'Toll.html'
53);
54</script>
55</body>
56</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
new file mode 100644
index 0000000..7fe9a84
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
@@ -0,0 +1,210 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
35
36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script>
40
41 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
42</head>
43<body>
44<pre id="test">
45<script type="text/javascript">
46try {
47 var deferredResult;
48 varkeePassProcessor;
49
50 keePassProcessor = new Clipperz.KeePassExportProcessor();
51
52 deferredResult = new MochiKit.Async.Deferred();
53
54 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" });
55 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
56 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); });
57 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
58
59 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
60 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
61 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); });
62 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
63
64 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
65 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
66 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); });
67 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
68
69
70
71 deferredResult.addBoth(SimpleTest.finish);
72 deferredResult.callback();
73
74/*
75 var set;
76 varobject1;
77 varobject2;
78 var object3;
79
80 set = new Clipperz.Set();
81
82 object1 = new Object();
83 object2 = new Object();
84 object3 = new Object();
85
86 object1.label = "object 1";
87 object2.label = "object 2";
88 object3.label = "object 3";
89
90 is(set.size(), 0, "A new set should be empty");
91
92 set.add(object1);
93 is(set.size(), 1);
94 is(set.contains(object1), true);
95 is(set.contains(object2), false);
96
97 set.add(object1);
98 is(set.size(), 1, "Adding the same object twice does not change the set content");
99 is(set.contains(object1), true);
100 is(set.contains(object2), false);
101
102 set.add(object2);
103 is(set.size(), 2);
104 is(set.contains(object1), true);
105 is(set.contains(object2), true);
106 is(set.contains(object3), false);
107
108 set.remove(object1);
109 is(set.size(), 1, "Size check after removing an object");
110 is(set.contains(object1), false);
111 is(set.contains(object2), true);
112 is(set.contains(object3), false);
113
114 set.remove(object1);
115 is(set.size(), 1, "Removing twice the same object does not change the set content");
116 is(set.contains(object1), false);
117 is(set.contains(object2), true);
118 is(set.contains(object3), false);
119
120 set.empty();
121 is(set.size(), 0);
122
123 {
124 varitems;
125 varpopulatedSet;
126
127 items = ["item1", "item2", "item3"];
128
129 populatedSet = new Clipperz.Set({'items': items});
130 is(populatedSet.size(), 3);
131 is(populatedSet.contains("item1"), true);
132 is(populatedSet.contains("item4"), false);
133
134 items.splice(0, items.length);
135 is(populatedSet.size(), 3);
136 }
137
138 {
139 varitems;
140 vardeletedItems;
141
142 items = ["item1", "item2", "item3"];
143
144 set = new Clipperz.Set({'items': items});
145 deletedItems = ["item1"];
146 set.remove(deletedItems);
147 is(set.size(), 2, "here I am");
148 is(set.contains("item1"), false);
149 is(set.contains("item2"), true);
150
151 set = new Clipperz.Set({'items': items});
152 deletedItems = ["item1", "item2"];
153 set.remove(deletedItems);
154 is(set.size(), 1);
155 is(set.contains("item1"), false);
156 is(set.contains("item2"), false);
157
158 set = new Clipperz.Set({'items': items});
159 deletedItems = ["item1", "item4"];
160 set.remove(deletedItems);
161 is(set.size(), 2);
162 is(set.contains("item1"), false);
163 is(set.contains("item2"), true);
164 }
165
166 {
167 var items;
168 var poppedItem;
169
170 items = ["item1", "item2", "item3"];
171 set = new Clipperz.Set({'items': items});
172
173 poppedItem = set.popAnItem();
174 ok(poppedItem != null, "test popAnItem - 1");
175 is(set.size(), 2, "test popAnItem - 2");
176
177 poppedItem = set.popAnItem();
178 ok(poppedItem != null, "test popAnItem - 3");
179 is(set.size(), 1, "test popAnItem - 4");
180
181 poppedItem = set.popAnItem();
182 ok(poppedItem != null, "test popAnItem - 5");
183 is(set.size(), 0, "test popAnItem - 6");
184
185 poppedItem = set.popAnItem();
186 ok(poppedItem == null, "test popAnItem - 7");
187 }
188*/
189
190 SimpleTest.waitForExplicitFinish();
191
192} catch (err) {
193
194 var s = "test suite failure!\n";
195 var o = {};
196 var k = null;
197 for (k in err) {
198 // ensure unique keys?!
199 if (!o[k]) {
200 s += k + ": " + err[k] + "\n";
201 o[k] = err[k];
202 }
203 }
204 ok ( false, s );
205}
206
207</script>
208</pre>
209</body>
210</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Set.html b/frontend/gamma/tests/tests/Clipperz/Set.html
new file mode 100644
index 0000000..e5814bc
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Set.html
@@ -0,0 +1,54 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.Set - test</title>
32
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/Set.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44
45 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
46</head>
47<body>
48
49<pre id="test">
50<script type="text/javascript" src="Set.test.js"></script>
51</pre>
52</body>
53</html>
54
diff --git a/frontend/gamma/tests/tests/Clipperz/Set.test.js b/frontend/gamma/tests/tests/Clipperz/Set.test.js
new file mode 100644
index 0000000..8122b07
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/Set.test.js
@@ -0,0 +1,165 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29var tests = {
30
31 //-------------------------------------------------------------------------
32
33 'set_test': function (someTestArgs) {
34 var deferredResult;
35
36 deferredResult = new Clipperz.Async.Deferred("set_test", someTestArgs);
37 deferredResult.addCallback(function () {
38 var set;
39 varobject1;
40 varobject2;
41 var object3;
42
43 set = new Clipperz.Set();
44
45 object1 = new Object();
46 object2 = new Object();
47 object3 = new Object();
48
49 object1.label = "object 1";
50 object2.label = "object 2";
51 object3.label = "object 3";
52
53 is(set.size(), 0, "A new set should be empty");
54
55 set.add(object1);
56 is(set.size(), 1);
57 is(set.contains(object1), true);
58 is(set.contains(object2), false);
59
60 set.add(object1);
61 is(set.size(), 1, "Adding the same object twice does not change the set content");
62 is(set.contains(object1), true);
63 is(set.contains(object2), false);
64
65 set.add(object2);
66 is(set.size(), 2);
67 is(set.contains(object1), true);
68 is(set.contains(object2), true);
69 is(set.contains(object3), false);
70
71 set.remove(object1);
72 is(set.size(), 1, "Size check after removing an object");
73 is(set.contains(object1), false);
74 is(set.contains(object2), true);
75 is(set.contains(object3), false);
76
77 set.remove(object1);
78 is(set.size(), 1, "Removing twice the same object does not change the set content");
79 is(set.contains(object1), false);
80 is(set.contains(object2), true);
81 is(set.contains(object3), false);
82
83 set.empty();
84 is(set.size(), 0);
85
86 {
87 varitems;
88 varpopulatedSet;
89
90 items = ["item1", "item2", "item3"];
91
92 populatedSet = new Clipperz.Set({'items': items});
93 is(populatedSet.size(), 3);
94 is(populatedSet.contains("item1"), true);
95 is(populatedSet.contains("item4"), false);
96
97 items.splice(0, items.length);
98 is(populatedSet.size(), 3);
99 }
100
101 {
102 varitems;
103 vardeletedItems;
104
105 items = ["item1", "item2", "item3"];
106
107 set = new Clipperz.Set({'items': items});
108 deletedItems = ["item1"];
109 set.remove(deletedItems);
110 is(set.size(), 2, "here I am");
111 is(set.contains("item1"), false);
112 is(set.contains("item2"), true);
113
114 set = new Clipperz.Set({'items': items});
115 deletedItems = ["item1", "item2"];
116 set.remove(deletedItems);
117 is(set.size(), 1);
118 is(set.contains("item1"), false);
119 is(set.contains("item2"), false);
120
121 set = new Clipperz.Set({'items': items});
122 deletedItems = ["item1", "item4"];
123 set.remove(deletedItems);
124 is(set.size(), 2);
125 is(set.contains("item1"), false);
126 is(set.contains("item2"), true);
127 }
128
129 {
130 var items;
131 var poppedItem;
132
133 items = ["item1", "item2", "item3"];
134 set = new Clipperz.Set({'items': items});
135
136 poppedItem = set.popAnItem();
137 ok(poppedItem != null, "test popAnItem - 1");
138 is(set.size(), 2, "test popAnItem - 2");
139
140 poppedItem = set.popAnItem();
141 ok(poppedItem != null, "test popAnItem - 3");
142 is(set.size(), 1, "test popAnItem - 4");
143
144 poppedItem = set.popAnItem();
145 ok(poppedItem != null, "test popAnItem - 5");
146 is(set.size(), 0, "test popAnItem - 6");
147
148 poppedItem = set.popAnItem();
149 ok(poppedItem == null, "test popAnItem - 7");
150 }
151 });
152 deferredResult.callback();
153
154 return deferredResult;
155 },
156
157 //-------------------------------------------------------------------------
158 'syntaxFix': MochiKit.Base.noop
159};
160
161
162
163//#############################################################################
164
165SimpleTest.runDeferredTests("Clipperz.Set", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/index.html b/frontend/gamma/tests/tests/Clipperz/index.html
new file mode 100644
index 0000000..b4c4992
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/index.html
@@ -0,0 +1,49 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz.* - tests</title>
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
34</head>
35<body>
36<script>
37TestRunner.runTests(
38 'Async.html',
39 'Base.html',
40 'ByteArray.html',
41 'Date.html',
42 'DOM.html',
43 'KeePassExportProcessor.html',
44 'RoboFormExportProcessor.html',
45 'Set.html'
46);
47</script>
48</body>
49</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/index_googleCode.html b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html
new file mode 100644
index 0000000..6e3249c
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html
@@ -0,0 +1,50 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
33</head>
34<body>
35<script>
36TestRunner.runTests(
37 'Base.html',
38 'ByteArray.html',
39 'NotificationCenter.html',
40 'Set.html',
41 'Crypto/AES.html',
42 'Crypto/BigInt.html',
43 'Crypto/PRNG.html',
44 'Crypto/SHA.html',
45 'Crypto/ECC.html',
46 'Crypto/SRP.html'
47);
48</script>
49</body>
50</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/index_testECC.html b/frontend/gamma/tests/tests/Clipperz/index_testECC.html
new file mode 100644
index 0000000..46572ab
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Clipperz/index_testECC.html
@@ -0,0 +1,50 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
33</head>
34<body>
35<script>
36TestRunner.runTests(
37 //'Base.html',
38 'ByteArray.html',
39 //'Crypto/AES.html',
40 'Crypto/BigInt.html',
41 //'Crypto/PRNG.html',
42 //'Crypto/SHA.html',
43 //'Crypto/SRP.html',
44 //'Crypto/ECC.html',
45 'Crypto/ECC.BinaryField.FiniteField.html',
46 'Crypto/ECC.BinaryField.Value.html'
47);
48</script>
49</body>
50</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js
new file mode 100644
index 0000000..21b6af6
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js
@@ -0,0 +1,238 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.CardDialogEditing');
30
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup();
33
34Clipperz.Tests.CardDialogEditing.Tester = function(args) {
35 args = args || {};
36
37 Clipperz.Tests.CardDialogEditing.Tester.superclass.constructor.call(this, args);
38 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
40
41 return this;
42};
43
44Clipperz.Base.extend(Clipperz.Tests.CardDialogEditing.Tester, Object, {
45
46 'toString': function() {
47 return "Clipperz.Tests.CardDialogEditing.Tester";
48 },
49
50 //-------------------------------------------------------------------------
51
52 'user': function () {
53 return this._user;
54 },
55
56 //-------------------------------------------------------------------------
57
58 'run': function () {
59 var deferredResult;
60 var proxy;
61 varcardDialogController;
62 varcardDialogComponent;
63
64 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
65
66 deferredResult = new Clipperz.Async.Deferred("CardDialogEditing_test.init", {trace:false});
67 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
68 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data_newVersion']);
69 deferredResult.addMethod(this.user(), 'login');
70 //# deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
71
72 // deferredResult.addMethod(this.user(), 'getRecord', '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'); //Linkedin
73 // deferredResult.addMethod(this.user(), 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); //Example Attack
74 deferredResult.addMethod(this.user(), 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); //Amazon
75 // deferredResult.addMethod(this.user(), 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); //MyBlogLog
76 // deferredResult.addMethod(this.user(), 'getRecord', '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728'); //Del.icio.us
77 // deferredResult.addMethod(this.user(), 'getRecord', '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a'); //Microsoft Office Key
78 // deferredResult.addMethod(this.user(), 'getRecord', '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18'); //The NewYork Times
79 // deferredResult.addMethod(this.user(), 'getRecord', '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb'); //Web Password
80 // deferredResult.addMethod(this.user(), 'getRecord', '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39'); //Jaiku
81 // deferredResult.addMethod(this.user(), 'getRecord', '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291'); //Home Burglar Alarm
82 // deferredResult.addMethod(this.user(), 'getRecord', 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c'); //MySpace
83 // deferredResult.addMethod(this.user(), 'getRecord', 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045'); //American Airlines
84 // deferredResult.addMethod(this.user(), 'getRecord', 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4'); //Luftansa
85 // deferredResult.addMethod(this.user(), 'getRecord', 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'); //Google Account
86 // deferredResult.addMethod(this.user(), 'getRecord', 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732'); //Expedia
87 // deferredResult.addMethod(this.user(), 'getRecord', 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6'); //Bloglines
88
89 // deferredResult.addMethod(this.user(), 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0)
90 // deferredResult.addMethod(this.user(), 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1)
91 // deferredResult.addMethod(this.user(), 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2)
92 // deferredResult.addMethod(this.user(), 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
93
94 // deferredResult.addMethod(this.user(), 'createNewRecord');
95
96/*
97 deferredResult.addCallback(function (aRecord) {
98 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record", [
99 MochiKit.Base.method(aRecord, 'setLabel', "Clipperz staging site"),
100 MochiKit.Base.method(aRecord, 'addField', {'label':"URL", 'value':"http://d6.clipperz.com", 'isHidden':false}),
101 MochiKit.Base.method(aRecord, 'addField', {'label':"USERNAME", 'value':"staging", 'isHidden':false}),
102 MochiKit.Base.method(aRecord, 'addField', {'label':"PASSWORD", 'value':"drupal", 'isHidden':true}),
103
104 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
105 function (aDirectLogin) {
106 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record [directLogin]", [
107 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Clipperz staging site'),
108 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.apple.com/favicon.ico'),
109 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{ "page":{"title":"HTTP authentication"},\n "form":{"attributes": {\n "action":"",\n "type":"http_auth"\n }, "inputs": [\n {"type":"text","name":"url","value":""},\n {"type":"text","name":"username","value":""},\n {"type":"password","name":"password","value":""}\n ]}, "version":"0.2.3"}'),
110
111 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'url', 'URL'),
112 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'username', 'USERNAME'),
113 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'PASSWORD')
114 ], {trace:false});
115 },
116 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
117 ], {trace:false});
118 });
119
120 // deferredResult.addMethod(this.user(), 'createNewRecord');
121 deferredResult.addCallback(function (aRecord) {
122 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup another record", [
123 MochiKit.Base.method(aRecord, 'setLabel', "Twitter site"),
124 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_url", 'value':"http://www.twitter.com", 'isHidden':false}),
125 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_username", 'value':"staging", 'isHidden':false}),
126 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_password", 'value':"drupal", 'isHidden':true}),
127
128 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
129 function (aDirectLogin) {
130 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup another record [directLogin]", [
131 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Twitter'),
132 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.twitter.com/favicon.ico'),
133 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{"page": {"title": "Twitter"},\n"form": {"attributes": {"action": "https://twitter.com/sessions",\n"method": "post"},\n"inputs": [{"type": "hidden",\n"name": "authenticity_token",\n"value": "b78a9460629980ed4c705fe94e6c4f37bfc32fed"},\n{"type": "text",\n"name": "session[username_or_email]",\n"value": ""},\n{"type": "password",\n"name": "session[password]",\n"value": ""},\n{"type": "checkbox",\n"name": "remember_me",\n"value": "1"},\n{"type": "hidden",\n"name": "q",\n"value": ""}]},\n"version": "0.2.3"}'),
134
135 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'session[username_or_email]', 'twitter_username'),
136 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'session[password]', 'twitter_password'),
137
138 MochiKit.Base.method(aDirectLogin, 'formValues'),
139 MochiKit.Base.itemgetter('remember_me'),
140 MochiKit.Base.methodcaller('setValue', 1)
141
142 ], {trace:false});
143 },
144 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
145 ], {trace:false});
146 });
147
148 // deferredResult.addMethod(this.user(), 'createNewRecord');
149 deferredResult.addCallback(function (aRecord) {
150 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup third record", [
151 MochiKit.Base.method(aRecord, 'setLabel', "R@cine"),
152 MochiKit.Base.method(aRecord, 'addField', {'label':"R@cine_username", 'value':"joe", 'isHidden':false}),
153 MochiKit.Base.method(aRecord, 'addField', {'label':"R@cine_password", 'value':"clipperz", 'isHidden':true}),
154
155 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
156 function (aDirectLogin) {
157 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup third record [directLogin]", [
158 MochiKit.Base.method(aDirectLogin, 'setLabel', 'R@cine'),
159 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.racine.ra.it/horde/imp/graphics/favicon.ico'),
160 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{"page": {"title": "IMP :: Welcome to Horde"},\n"form": {"attributes": {"action": "http://www.racine.ra.it/horde/imp/redirect.php",\n"method": "post"},\n"inputs": [{"type": "hidden",\n"name": "actionID",\n"value": "105"},\n{"type": "hidden",\n"name": "url",\n"value": ""},\n{"type": "hidden",\n"name": "mailbox",\n"value": "INBOX"},\n{"type": "text",\n"name": "imapuser",\n"value": ""},\n{"type": "password",\n"name": "pass",\n"value": ""},\n{"type": "hidden",\n"name": "server",\n"value": "localhost"},\n{"type": "hidden",\n"name": "port",\n"value": "143"},\n{"type": "hidden",\n"name": "namespace",\n"value": ""},\n{"type": "hidden",\n"name": "maildomain",\n"value": "racine.ra.it"},\n{"type": "hidden",\n"name": "protocol",\n"value": "imap/notls"},\n{"type": "hidden",\n"name": "realm",\n"value": "racine.ra.it"},\n{"type": "hidden",\n"name": "folders",\n"value": "mail/"},\n{"type": "select",\n"name": "new_lang",\n"options": [{"selected": false,\n"label": "Bulgarian",\n"value": "bg_BG"},\n{"selected": false,\n"label": "Chinese (Simplified)",\n"value": "zh_CN"},\n{"selected": false,\n"label": "Chinese (Traditional)",\n"value": "zh_TW"},\n{"selected": false,\n"label": "Czech",\n"value": "cs_CZ"},\n{"selected": false,\n"label": "Dansk",\n"value": "da_DK"},\n{"selected": false,\n"label": "Deutsch",\n"value": "de_DE"},\n{"selected": false,\n"label": "English (GB)",\n"value": "en_GB"},\n{"selected": true,\n"label": "English (US)",\n"value": "en_US"},\n{"selected": false,\n"label": "Español",\n"value": "es_ES"},\n{"selected": false,\n"label": "Eesti",\n"value": "et_EE"},\n{"selected": false,\n"label": "Français",\n"value": "fr_FR"},\n{"selected": false,\n"label": "Greek",\n"value": "el_GR"},\n{"selected": false,\n"label": "Italiano",\n"value": "it_IT"},\n{"selected": false,\n"label": "Japanese",\n"value": "ja_JP"},\n{"selected": false,\n"label": "Korean",\n"value": "ko_KR"},\n{"selected": false,\n"label": "Latviešu",\n"value": "lv_LV"},\n{"selected": false,\n"label": "Lietuviskas",\n"value": "lt_LT"},\n{"selected": false,\n"label": "Magyar",\n"value": "hu_HU"},\n{"selected": false,\n"label": "Nederlands",\n"value": "nl_NL"},\n{"selected": false,\n"label": "Norsk bokmål",\n"value": "nb_NO"},\n{"selected": false,\n"label": "Norsk nynorsk",\n"value": "nn_NO"},\n{"selected": false,\n"label": "Polski",\n"value": "pl_PL"},\n{"selected": false,\n"label": "Português",\n"value": "pt_PT"},\n{"selected": false,\n"label": "Português Brasileiro",\n"value": "pt_BR"},\n{"selected": false,\n"label": "Romana",\n"value": "ro_RO"},\n{"selected": false,\n"label": "Russian (Windows)",\n"value": "ru_RU"},\n{"selected": false,\n"label": "Russian (KOI8-R)",\n"value": "ru_RU.KOI8-R"},\n{"selected": false,\n"label": "Slovak",\n"value": "sk_SK"},\n{"selected": false,\n"label": "Slovenscina",\n"value": "sl_SI"},\n{"selected": false,\n"label": "Suomi",\n"value": "fi_FI"},\n{"selected": false,\n"label": "Svenska",\n"value": "sv_SE"},\n{"selected": false,\n"label": "Ukranian",\n"value": "uk_UA"}]},\n{"type": "submit",\n"name": "button",\n"value": "Log in"}]},\n"version": "0.2.3"}'),
161
162 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'imapuser', 'R@cine_username'),
163 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'pass', 'R@cine_password'),
164
165 MochiKit.Base.method(aDirectLogin, 'formValues'),
166 MochiKit.Base.itemgetter('new_lang'),
167 MochiKit.Base.methodcaller('setValue', 'en_US')
168
169 ], {trace:false});
170 },
171 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
172 ], {trace:false});
173 });
174*/
175
176 deferredResult.addCallback(function (aRecord) {
177 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup Kiva", [
178 MochiKit.Base.method(aRecord, 'setLabel', "KIVA"),
179 MochiKit.Base.method(aRecord, 'addField', {'label':"kiva_email", 'value':"giulio.cesare@solaroli.it", 'isHidden':false}),
180 MochiKit.Base.method(aRecord, 'addField', {'label':"kiva_password", 'value':"G0ELE0ngyTZf", 'isHidden':true}),
181
182 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
183 function (aDirectLogin) {
184 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup Kiva [directLogin]", [
185 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Kiva'),
186 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.kiva.org/favicon.ico'),
187 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{\n "page": {\n "title": "kiva.org"\n },\n "form": {\n "attributes": {\n "action": "https://www.kiva.org/app.php?page=login&action=doLogin",\n "method": "post"\n },\n "inputs": [\n {\n "type": "text",\n "name": "email",\n "value": ""\n },\n {\n "type": "password",\n "name": "password",\n "value": ""\n },\n {\n "type": "submit",\n "name": "submit",\n "value": "Login >>"\n },\n {\n "type": "hidden",\n "name": "currURL",\n "value": "https://www.kiva.org/app.php?page=login"\n }\n ]\n },\n "version": "0.2.3"\n}'),
188
189 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'email', 'kiva_email'),
190 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'kiva_password')
191 ], {trace:false});
192 },
193 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
194 ], {trace:false});
195 });
196
197 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
198 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
199 cardDialogController.run();
200 }, this));
201 deferredResult.callback();
202
203 return deferredResult;
204 },
205
206 //=========================================================================
207
208 'saveChanges': function () {
209 return this.user().saveChanges();
210 },
211
212 //-------------------------------------------------------------------------
213
214 'hasPendingChanges': function () {
215 return this.user().hasPendingChanges();
216 },
217
218 //-------------------------------------------------------------------------
219
220 'revertChanges': function () {
221 return this.user().revertChanges();
222 },
223
224 //=========================================================================
225 __syntaxFix__: "syntax fix"
226});
227
228
229
230
231init = function () {
232 vartester;
233
234 tester = new Clipperz.Tests.CardDialogEditing.Tester();
235 tester.run();
236};
237
238MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js
new file mode 100644
index 0000000..8065144
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js
@@ -0,0 +1,1881 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29testData = {
30
31 //-------------------------------------------------------------------------
32
33 'simpleLogin_001': {
34 'users': [
35 {
36 'username': "joe",
37 'passphrase': "eoj",
38 'version': "0.2",
39 'connectionVersion':"0.2",
40 'records':{
41 'record 1': {
42 'notes':"Some notes here",
43 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"}
46 ],
47 'directLogins':{
48 "record 1 direct login": {
49 'configuration':"",
50 'bindings':[
51 ],
52 'favicon':"http://www.example.com/favicon.ico"
53 }
54 }
55 }
56 },
57 'otp':[
58 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321"
60 ]
61 }
62 ]
63 },
64
65 //-------------------------------------------------------------------------
66
67 'joe_clipperz_offline_copy_data': {
68 users:{
69 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2',
78 maxNumberOfRecords: '100',
79 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3',
82 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
85 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
87 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
88 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 }
99 }
100 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
103 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
105 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
106 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
114 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
115 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
116 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
122 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
123 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
124 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
130 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
131 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
132 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####',
135 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
136 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
138 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
139 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
140 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####',
143 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
144 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
146 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
147 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
148 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
154 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
155 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
156 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
162 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
163 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
164 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
170 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
171 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
172 }
173 }
174 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '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',
177 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
179 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
180 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
188 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
189 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
190 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
196 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
197 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
198 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
204 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
205 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
206 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
212 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
213 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
214 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
220 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
221 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
222 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
228 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
229 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
230 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
236 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
237 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
238 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
244 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
245 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
246 }
247 }
248 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
253 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
254 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
262 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
263 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
264 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
270 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
271 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
272 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
278 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
279 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
280 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
286 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
287 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
288 }
289 }
290 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
293 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
295 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
296 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
304 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
305 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
306 }
307 }
308 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
313 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
314 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
322 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
323 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
324 }
325 }
326 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
331 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
332 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
340 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
341 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
342 }
343 }
344 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
349 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
350 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
358 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
359 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
360 }
361 }
362 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
365 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
367 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
368 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
376 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
377 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
378 }
379 }
380 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
385 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
386 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
394 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
395 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
396 }
397 }
398 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 CEST 2007',
403 updateDate: 'Tue May 01 01:13:27 CEST 2007',
404 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####',
409 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
410 version: '0.2',
411 creationDate: 'Tue May 01 01:10:17 CEST 2007',
412 updateDate: 'Tue May 01 01:10:17 CEST 2007',
413 accessDate: 'Tue May 01 01:10:17 CEST 2007'
414 },
415 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
416 header: '####',
417 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
418 version: '0.2',
419 creationDate: 'Tue May 01 01:13:27 CEST 2007',
420 updateDate: 'Tue May 01 01:13:27 CEST 2007',
421 accessDate: 'Mon Jan 19 16:10:02 CET 2009'
422 }
423 }
424 },
425 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
426 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
427 version: '0.2',
428 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
429 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
430 accessDate: 'Mon Jan 19 16:10:01 CET 2009',
431 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
432 versions: {
433 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
434 header: '####',
435 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
436 version: '0.2',
437 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
438 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
439 accessDate: 'Mon Jan 19 16:10:01 CET 2009'
440 }
441 }
442 },
443 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
444 data: 'HxkHstm/nWfD4tTwtaDqycSrP6vR7O9JUQrVXp90Z+prnnvuUMH3SbOlv+AQZFJotuM9VVOh52yWcl8TuSJ5SYR6pwmZVcK9GJd3aRH48wBRrsi9do+pgyxmzfpBm+CMnUtI63LMPfyz/zPndUQSke5+G/Q1b8ZddaShjYHWHEifjdswmKg68FOSu7RuElR/FwRCBwuT02vMRdrjwxSxxM5zWB3vqzN4xKi/jkvqGgIc21m8adTQoxAJARleZiyWXzfPO/MpUs3vA6nxH6ZO1kEayGw3ZAR3nFBiW0UjjdXCBI2b4PcUP0nSJKetRSiudo2cUKfYxsWgEPoG+PM/CQFdnlfGcPf4d0QYnkU+JHff99mLJRmz7VWH7ZeW10NTxzTEr47diHLpyufZ4knnRgfhfKtwOvgmG1n1lXyXDRVTeyfCCX+mB5qdB79ujqon1BiLOGQfLWZ8bDyTZAakpcRJb8qk3zP004XwN5BpO+jC2waMcUEuH62gSQeelGZ19pzBiRz8kn3ZZ8iviX46Wwk3X1TTke9teF7t6Pop4pRkaAj2z2ji0mqWtv4T/3QW4Xgf1mKaT2t8ZaucGvZ3jrxm0CW/Ra3Cy1v1APwRPvKnY5i/WPDS1elq3vNF0NY7EQbXrxBX7hgGpUGRcHSKYsuftIquJFv0HV31jRhd99nZz6Otx82xidWbroIS+37o2Rr56X/AwkLn3DgH+V/YAK24z3Otku+lbaorXnv6C8ZDUhcce2CjgEuCFPmv928YOahgmE0Q0uKniwVXgXACevvACEsduvW32JhI4D4cjRWcSzB6YhqXE8QYCQwK97OykJ30Szd/ZYykiXjdjymyqFOmI9tZqi/PUOKRJ9NhYZaVAeLEFUunvKJWHNs50CqElw6z7nAvBwYyEVvvc+rSpMb2Z/KAWLMzv5R3MeITVUph/RlRlMIrJr0lBhmghnLRt6cGRQcDA2Si3tGAm34K+BpxVbTK0ilTrwzCfaE3Q+dvBTFRcZzMcPFLHL7Mho1/kNMb5S0izIpsNPCb26yH/gueYghVmhRL76HQAH79k00uJcyXt57AYlOYQM7FKDHWciWtJDOMNjVFDYQJJSAS39HukwrLnAdqCNrabrS+AuWhX+CqmMlKQ0PRszjtT7oQaAcgJd0uPOVz3IsjyZ/CmrzSxM+c4iPXugkiiyS2HYU7EEz9IEDvoqwv3Djcy4+3oxPUdmIJGMz2Mk5UXMDyMpqfuujirZI5r5WQWWQLivD9mid5RWDiQp2NYwpnQ/J0emEpWFlf/XkmXW+Em/A0+DOeJtHB729WsKYEvMWOB1nuITkqPJShf8FVEunHzUuLKsG3Hf5yEc3isB5rWGO8hPCueVUKgiS/NSCxQ+iinBTO3gUl+hzK+yaajQUomCx7+N9/n5HTLM5kFsUxZ8gfG3LMEK1iaza4KZeS8Hmb58NU3e3MI0FvlZHa787LqNO226awx3sX/nuTMX+LXx9v8/AMrkRdbzlcYbe6xWRWcBGiTirbTV/CXMgCdop60xfRqCskQPbfj89zpHQS/GiTJjhUwh6XKc/TpbjQJ6OZ6dAQBDxexPa+sjr70kLARxeUhvDUytp/zd/A5OBpuZ0aUz530aQEj8BCAk18vdUks7TWcpiw+/Lq//QLu/9uLU/rLanu2DFUYGXo7bJzy2QpzuoHqKDqa3anK9Gs34NfcIjUbeMUyCzd6CFj+1vGNIk4zZi44PZvmqxZXI8XcxboTpnheNRksjw36FbhIKWMWksIIq+mh4XMnkQcS83PB9rwMHsYY4nKfCwddYfRlbVjcjX+jSlz0r6Oh3KxVDP6dt37CPo8DGMvXSeU4LFMcYBkZ/Q57sH3/gyblyHK8OqYX3pzbnkCqoaOwAseBrQYMel3OgSLt1nAxzhN+ZicCLhpSYHCcHYDcg9xoa/1u4uEMJ0JC+/OzU7xp3nC4OgSYxVzL+gBNnqX4Plep7oikvE7+qymqwtoEhEEuaO5pbOdPG4I7NknL+u/RazjXdy3IGyfUPCCQKsjAEbAkD6OBZZf4St21e4sSgV/anAYFGr87fHMPtXhBxH6QTQPgWqrK75Lr/RaOLihrQHgVhcQHYcTD7nTtPNelbJKx5aGOFtcqykaVizLzrflZWXnk+QAjHo6Hsn/edm7Hbna+JTlyVsttp2vcs8kHQk6xcCpi2kR7nJwb+6kntEEPZAyuFQVwvdkqyC5nAecdg==',
445 version: '0.3',
446 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
447 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
448 accessDate: 'Thu Feb 12 12:54:37 CET 2009',
449 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
450 versions: {
451 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
452 header: '####',
453 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
454 version: '0.3',
455 creationDate: 'Thu Feb 12 12:54:37 CET 2009',
456 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
457 accessDate: 'Thu Feb 12 12:54:37 CET 2009'
458 },
459 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
460 header: '####',
461 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
462 version: '0.3',
463 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
464 updateDate: 'Thu Feb 12 12:45:43 CET 2009',
465 accessDate: 'Thu Feb 12 12:45:43 CET 2009'
466 },
467 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
468 header: '####',
469 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
470 version: '0.3',
471 creationDate: 'Thu Feb 12 12:47:39 CET 2009',
472 updateDate: 'Thu Feb 12 12:47:39 CET 2009',
473 accessDate: 'Thu Feb 12 12:47:39 CET 2009'
474 }
475 }
476 },
477 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
478 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
479 version: '0.2',
480 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
481 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
482 accessDate: 'Mon Jan 19 16:10:12 CET 2009',
483 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
484 versions: {
485 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
486 header: '####',
487 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
488 version: '0.2',
489 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
490 updateDate: 'Wed Mar 14 15:51:17 CET 2007',
491 accessDate: 'Wed Apr 25 10:37:27 CEST 2007'
492 },
493 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
494 header: '####',
495 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
496 version: '0.2',
497 creationDate: 'Wed Apr 25 10:39:26 CEST 2007',
498 updateDate: 'Wed Apr 25 10:39:26 CEST 2007',
499 accessDate: 'Wed Apr 25 10:39:26 CEST 2007'
500 },
501 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
502 header: '####',
503 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
504 version: '0.2',
505 creationDate: 'Wed Apr 25 11:14:05 CEST 2007',
506 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
507 accessDate: 'Mon Jan 19 16:10:12 CET 2009'
508 },
509 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
510 header: '####',
511 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
512 version: '0.2',
513 creationDate: 'Wed Apr 25 10:51:49 CEST 2007',
514 updateDate: 'Wed Apr 25 10:51:49 CEST 2007',
515 accessDate: 'Wed Apr 25 10:51:49 CEST 2007'
516 },
517 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
518 header: '####',
519 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
520 version: '0.2',
521 creationDate: 'Wed Apr 25 11:01:21 CEST 2007',
522 updateDate: 'Wed Apr 25 11:01:21 CEST 2007',
523 accessDate: 'Wed Apr 25 11:01:21 CEST 2007'
524 },
525 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
526 header: '####',
527 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
528 version: '0.2',
529 creationDate: 'Wed Apr 25 10:59:57 CEST 2007',
530 updateDate: 'Wed Apr 25 10:59:57 CEST 2007',
531 accessDate: 'Wed Apr 25 10:59:57 CEST 2007'
532 },
533 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
534 header: '####',
535 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
536 version: '0.2',
537 creationDate: 'Wed Apr 25 10:38:17 CEST 2007',
538 updateDate: 'Wed Apr 25 10:38:17 CEST 2007',
539 accessDate: 'Wed Apr 25 10:38:17 CEST 2007'
540 },
541 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
542 header: '####',
543 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
544 version: '0.2',
545 creationDate: 'Wed Apr 25 10:56:58 CEST 2007',
546 updateDate: 'Wed Apr 25 10:56:58 CEST 2007',
547 accessDate: 'Wed Apr 25 10:56:58 CEST 2007'
548 },
549 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
550 header: '####',
551 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
552 version: '0.2',
553 creationDate: 'Wed Apr 25 10:58:33 CEST 2007',
554 updateDate: 'Wed Apr 25 10:58:33 CEST 2007',
555 accessDate: 'Wed Apr 25 10:58:33 CEST 2007'
556 }
557 }
558 },
559 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
560 data: '7x7+2tk+I8+OchrmpfLJhDR2crUWfHDo/E8TdmVxbMH9fsnqG4azJG/xVbWROw8N0v8ahhBY3BJG9de9L6PH9B+wECx9zRx/udStcStKRpJLCcjWxVVMt/ipJ+/QqFKWZptqs7VkiT4jZw0V3I4Tl7Wt82/PWZ/euyzYOau+YtiflSedG7+7aEEbhDblntf7NbSXCTIXVnAZw/xuyMjxmioJNNe4sA+fls8KZSYYAzpvxl9+h+esPm978SN/+IuG3mDzCHS+V0tmEhr4v2yfWsZ5axAZFjQSu6TaLNvdFmvgF2olddkizXBsov12WlMSQDSEhs/xkv5ZXVLK3JOCDJldW80eLs0vGOSOJZL3r7NO1gRiwnX5K8PM3YowFIFkWNavRy/B4RneSNCo8XqEg8lBBiJbTtExxMByLKjifcKP7xAD2VeByJ0XDo5If+J4fGiYjo9XU/Bkc2POnJQt+SnNN5iAw493AtGDdPMO37RFRCAeU3W0vR1unsaD9Xn+ClPj1jNCXWZDtvwWnoke8XCeDeTIAzh3wXMCs7ZRqfAHwA1UWOqIq4DP0RJaWeIXCWYSRYAWLnteX1EzHixkvh4MMKmA09bbH/SS5gB6P/V7BBiwxKgstU3tyBbA2bW8aUG1zNthaOtbVqj9YbyogEMN5f3r4I0eMAZDKkbD6med1bHm6P0Zlr0MIYFIgiLkZvEjfoVkuQmFpM1N/PAlEeVDD97VZG9bGN006wdIsR2TEStymt4aBTIyZ+AKDKiGAARYPyYBTswPIAzKBfUipJ7milktKHHmj6LdsDMrwIf5ZQLqvAm2v7xMMBLWTJI+ieGi/R1UgvKAzyGQwzQFB2x+ljNQHsC3wnTLm7/y87CE0FB39FZVC2NJETmWUmAmltL9CPs1Wr6tkin6e2CzSvf5EGsKWBMDkHZD08vjLd30+BxbfS8cuWS3BpTzZ481qjqsF5hDtyRgHQ2eXXggc9imQCvNdG13yNOCcN2KUMPWvPhik6pV7HIMPI2ncPegtCVYwfDFHCn2AV+K1j0G1JIPzRxPlXBX/XNK9kyyK7R3xO7vC3VQyMzPGp8Br5vmoP2356lLLvR5JT7j/uXwZTP1H2/cZSLOii44OXiSNQ8OKp8SIzcWpAd+IuQ7zp2TKOSTl8IEbnorNnJdOG1FbT9kF3FlWkjT6LmQM6Y6pwsYPWinjth72RpTTMBAg6XXr7jveONdFOhoQBjD+VDkF5mv9MqANwv+1HSxwd3SI2OuTsoUcaHzpvquixf6BF2mctDX70i1Nx0gsnBzwsAa3hMQ924fEUyt2XQbJi+3HJ+C5qakgfZ2ERq/MaUL3aSUEL2ViuBly7ObM9/E9NQKyRySXGXb6e1ZdFlajhWLw/N4UpZQVXuQOX/0i95lWQsGbc8aeEn5kh5+Mwruxh8cIBVywiet34O5smc0bdoSWgXdaHZZ2OhJpP26gcDmsYQQPhUUpkhdipRTuNMoWDpy7T2Z36otFZYSRY7tUF7Wmh4zcXxgm8nBbxD3m63ll5MQXIfsR6KL+Ai+81U19VEd224+SdtHd8LP2kbQTRzNvDI2HJdw3GRsdkhyVRFR2NCdoseUfLGqOVxNt/XiWha8r70JOBpe+otSStF5pM92FHHsLqPIEakPqaEXL6IYJa1C9kLjMTjmQNig/biF1X3vQAne1maUvuAGx+6sdUU+GNIpw+AdjilUoRLsFwIMiwLxQLc4dY/97AEdbaC4pNYFW80ch0Joq54IYdmZwv4A08mD7yDGuWxBSyJV4Ylo9nI5ZofpW4Bw2HaG6L3Qx+207Y54WbYjZvmPUdLjItjQWgbJVPfvYi18zaqfbHFulrhKk4MM12oc0OBqt9nl6HHNKHhoHULDMR3B09B4luV1uziY0JudV7ePlCaLd3BDF/y1ujXFPJm3GLkjsaXY/rargrHuiIgKz1FJPuEXKq9admZmS0YgsGkRAgP3RwxpwJoCBuvV1XsFAYJNnz07VjaGvtTazGg5tlfITyF3tZ9m+GAeWR7dObhBOIxR60JddSz/61Zy95BfUOgpuhXYaVuZNFVxYTWcsDFy6Rn4TJN36FfZ6SaNiDQmWK0nhXiphNAzFTDvOBCZdXj0hwSNibD93fMrnphbjmpRfuhLk9MVLupB0FcuW6gGcJENbLKHaJYzRk1LTqXkZ70BCNoSt0HHUgaxj6S0gYVgWa5iqB4HS2vB2gr3B4iEezUWYG5gZsbCcC/H0bvPsSiNpelHrApPgrhGatR5ZwyLt9tnpVTxq6Uw1DkgVdEYrVBUftA9WB02R/cPD0T4K3VqyEaixODGpRWj3RcmUlHT9LwTlVmX9zABKxyIe6Zaq1Chk6mfDPgBzgai4yoUlLQulgayxG3GFc8oZRAm/kOjsY2E+/OpVPtKGzPGR7i4dSK+c+/GTJZykDu6w5FGznNo8YYKB6fvSi0nsTdUSBxBcYgFs81Lkvh/iBf3ZgA4XT9tvHls8VDOKHS7Uz5B7yr13pzVUDJLPQnlbDusmiAKgoloq89ASV2XdmUB50RxeKk1yuMfSVNqXSRxHB7xcQAsnJKaPTvkc1Dikv0K8g6uFSOlN6PXqOJU5SEwkDVsG7OBAWw9aiRC+IKwquOvzejh1Cbu11yMYlPpPtSydMoOEwAKoeoT0XdGVDXP2ySOYpVuW3i8wceWQLg2BYHIlWUzX0CIN0HZbvw5v+ptTzDXT+tp3AtlRzmGKXRVBvdtyUn/38abZ/Qwm5Uzw2jtXc0ol7ce9SMpJb83wpJbQGVTrDUrevFw+vh2x093yS7xNRJS+XNKnfZVG8WahWTdD2VRilgQ/GNILKjAT22XC0kW/+MxBReazixYCMU/vp7fJ2/2i3Th2X6ZlvzVeR+0jd1lp+Y/8//iLFpNn/WCkIKZQk1gVlVlzlY889hORm/SJd2J08ODQ4qCJS4ncYzu/xxikyjd2q+9wb38UHIIOx+qlop36QXaCraduzD5ZO2GHKZBWlJG0nBWxli6BMc6CIQdTKAAm3xnDP0wsIUPhey4u2+HoqC+znZeXTDVwl9n1oxzXsgpHsUlRCHG2pUGF/nGGe/r6/PQ3viSz5I5XUPWy0yOoy6I+NYQCanjcYtFvbcNTDrFmIkQPpf2kFslGlfINGgRlLTIjoYcSx/Xp11FGGwG/1tOKuUzDUAY2dMmFiGGkkxlHL71Z6BFAWj547krybEyCujhtNDCex8htVlI6GH4RxoVyBmw6cO+LV6TO63ieZWrFJGyQ0hd0ikh4A77NZi4+0rEsa1nC4DBm47z3CiLsXH+IlPi3MiBKUVb0MGHcLSvDokCZ4iFsdaMx3Cvkne0Ym8v0i8ImhWa8oJzmC7VQBSCs3gxCs9bENWShhlPs8JJId2vpn5LzsYp913gtD4PthRUGUAa+9cPzQ6V4qQgpzkX0KmV8VRbElDlR1Q4FRC4Cu7ULf8YTSof/Ko2I0iJlH/EmtM+BQO+zf0MohRvDPzEkKeHFhgbUSjcYls/NWU5oK5dOdbP8Sg2AryTySVmMiJd0Eefu6YnjJaLS3++mM1tOHKucCStqhehFL/Jo63qcHbe1jGvAdbKHk6WVHn4DX3DbT3U1awpfEVHRxNG0/IWu/6G2RDx++pi5KcmBIp40gkd4Exv/k2BK/gFs1HXBt8OXS858W0yWDsAl6z9zbzg1JfUvmrfhFLMNN5jls0AITqvo3rHaA4gVUjswUJmsJdElncyRHkTYuE0lbr9Fv5ELkQePYfhyGwKKJpRYdtNZ2f54rAMy5r/Pei1pn0ag6m5jcYzzM8NVIrJSYwsHsghphpkJw7Fxtme8hgAMoD6lL4lGjC786IG9jsnmXnmV+Y491DDjCnOMTy/NTWm1RD+9vjXYxVaO46+0iYtIjk/e6cmFUEz/eGzphzglVXnAlBs569glfbuZrNriiGzd66Wq4lETelMy7sm3UUwL9n3RvGalQCuwxVLZf2oQdNRLnH1k8sKYJk1DtFNW8R3gTRyFQBx1FKYz5rtCKaobLQf7xn+Bnn4uBMtpVoxfsWnK7se3UIKutJuWH2PoetRft7fAcYzLSy9Oyy2fV2gR9OV+9p0HJAIPIKUMC8nVdLXXaggwns4cigSgOLN08gWpTlD39IZmBY8iA+l+bkJcDSFqD+T6hYTNxSXkSLy9Xve18tvYJqG4JvfBt7JwSdA+QwfiS9jIQdIWUs5cBl/ShX9IRmlhsZPF9sow5JAnGJNZhPBF0j9UJfDcgyw98E8wVuNHly5J2CneK1vigbZTM25KMnjevyN3PnfsFSkPjTw4wmMEJpGdMnzzVqA7etpitypyNbgjX0fsAWOgEIRQ5Sog498t6nF1SwWVy7R+0CdpZhh0GpyoNf2TFUklYRec+xRLbAZc5Bkj6Tm9Z/ex9Ssjhi23uL0XG1SCJbHrhox4F8LgLQD22wcnXoSTU4mPAY942u5o2nvB6CTQS8Mj5n+YipQ99UxDhii5UrliGHSdEgjugfHiSoxpkjhNxJSWErYOgWi/qadZqsB/FHLFfMDrhkKxjpcSZwzZO6fAtKiDM5teK6TWaGWwEutd/W/q0Px1vYWxnxHn1ryXx9O3ORe5JJ5FymN4SWkTBIC8eeWTUxQ3TSs2NoGPmN6SnpGFLZH2VLygpg56tE9nXJifXElP8TcIPGPvFGNZFLwtxcdoVbLZaS1IUTpExPGBQ6NUPH24cnWE3RoQrQQHaFcdE1+IRC3TKf+ajINV2LBMhdYI0yE5l5F9hI4GhHNsd/xzROx4NFqkSdVW6T0jFl4NhAUB0iSX2zwJ+yvaor69uzWIFW81n8T5iSPG7Q1naFLL6AOt56wLDUOkioi5CVYlt5lFEl0UtmFnM4j+/Nj+FCCo6jPil847/ZlAicGKXktmDG2nVGILKLe0MZAKdcni/RwBJnl6qSs5x6u2Z46HYi63t4c2RXlljJkHvrn9PuAIG4xSC041F9gaxEshFqg0+nZ5dNiza+DoWgltTHkJehK2UQLMAbRwyvURSz0zSwrUTuT1lBCoSR8/rP3M8PghvUQ6sHpcw1TJ7NwG5y9oS1UVKiU5xC9gHlsMyxfSEaySkhdD5tVOCeGmOzKCD+vx8C577HZaNskKN6KxB3o+DvF6KOAjrtWvZ7C7r1JF7COugUoBSGrp/CeXtvswFvxNc8bqGqEqEZehhl+4TnKrQ+M9LOyWYnkHqbAVt91tIaeNCZZT3wyP4ooZU+JbOogK50kn9LMeT3r7aqbYLY0T1KQH1eezt8tuaeHaKaMX8P7gpW3ucwTINqDlTHL+/wm42D5UfP+/8/jmD+OfHdi8riILye/fDH+BMbk2/syWF94/ZbxjSEWuNtKBEQZJS2PlxQvlqr5pwCcIOFfTE6afEzCjC8968aBhqXMmONQjiYTj+CGZAfivZQV/60o9ckLAXAJoFBiBNf85l7M8DBfmRyabNCQMldus0zvBX6tptH8EuGL4wRPC5vReeigzpcaP8zbjOmvv8bOY6ZgDZTTfXiqOeSwCVUABEUfErNIzGizNu7iYCrbrPqSErrSC/8EmCqyqVbQ9qcN1VSJSAOJ4Vo4udeib5Zvu2zG5St9HWO/blRkKM9qn9s9i6ONSvn1bM8sp20cvAM3+/JVLD5nlCEqVe7oQ+uBCGLpgFJNj6lHiOqSjOm2OSvIbXq53l3IETF/r49OAKYQP8FkVpxrXmQS9Du9Fbp1u50BY9eSmzJuWOE8rOZhNbpaKIpMhdA7HYRmq7hX0bzDUHfKt9hbcrS89fzGikdlyTFmD2soGEbAwgjb4nFkYpzROVAjOhpfz3loAgZO5qpiXym/ee9gus0+OO6PM1xPkWUrTA8mnKvfiFO/ZJx3rn5g5+M/llzj41Cc7Ds0GtbWpUPhLzY7icmtNBamZf/uSUiSHXi6GCZ26llyX7bayCIVUpjg6ijelZQU3rkq42lVPByq8zmxECK8HjAyff6StsBAdIIexA9DN9psACVvybb8iYd09R1wPPFz3o5Gl5tSNV4f2brsPa5VAUyQdQ8YezWXIwZ9u3Q9vrls20FFfN697M+/Y9meu3hX3lVx93LTTsDCLVipaTJyq65n6lbOWZMQb5dgxtoBEKL3ZuxfeSTLiVgbzF3KqxyKNw8MwiyqcVO5mgZGwK9mHFFbSnUiPfHxBfBdqYzH07OksNb9/MvNYK+ebVj5yrEwT/EjNP5/3Bhe5cRUE3m7Y0WgS0TuYZiPgNYCak7ynZXOrYkNjLpH3Wc5GC4RnHXvwpBtD4yJaiIVt0lxYPvfik8FaRjQymubWA09j78ac9d5bKq40ERYLE9oTOoot26jEKoNSX7xqGQCU8VwAOQhC1HfKfdJ88uFMENnB2WLFGqHhZq444eS3Swc1OwBn5zSxUXLNZon9pinWObX8O8ULY1N5TTY8Qh9bLLfLjntCqXFXH8/6wcdnuOrBH0It6LLqrUm/TehuqXXL1c9Q1cYBLYrYjT0FJmbKrcyqG4peOxfCqEiryLLLcdSOECA4vDSvlo6eJ1sk1mXgF64ZEIIH7dZWlOl/eL0L6fGs/vrbvJBBArkVftkOiumIsXMwqaNtZYwMzX811NZpFMOhInwTmh8mbaaCpL+0ioizEE1/is5M9eA3808sF3Miv7d2RtI3sGWbdb9K/cVrOhV4Oy4MkdVxrZpeYuzshod3DRB3/Es72Z1ImrZh+div/GnWpo9Q9M9U/pLVuLnKVCPnXhu5dkF9nVse5NrcBlt7qQvvr/4CC0uctQ94nbjNZobcEXGSYZ8dx7Oftr7fKzT9cxhh93Zm/mxz48dys3JD1JB2V/OZfPoiiMIEW7r/0aXQSjDhp/v7QeIL9nLT/NiNUi5puti/t9q/GDK+pj6UNQak56M2//iLQ0y+3ov9Fod/LJAAVnCgMAFFUX0AJ3nkRPT6Rz/dEtbKdmnVqUER6UzDvhcDfDV+OiMmSgVFZ43d9JkuDPTu5Zuk2J12kgxddjbbSf8Z5TqkaDPlz7OMCdEht6wyTt7QEX88sUaiFrRLgvGxm3BYv6FZ0FGWfKqEgqjnsFJkmIYPYl2jrAC20G9LE5T/niONA8V2wT6S7Ha0xXNWUk6xaWP64SVOFvRvG8mx9fstjLCMhRYGmpol5az6XSgZ9Xd+JzhkoAWc+xmYMrT30kw8LztcWEz1HeK+cktGYS7vB32fG+oM8MMz6bVtkouHiGVE+YlELr4GjUHrnWgNKqtrkL5btt8ceZqI9RjE9aUqN3KgJgAt8YselJLfqFHNu5kh0XQBbD8CIplN6nzaXTcK5qsboyNRAEC7kjzp0iG3vHqNSPvGlfqCKYCZNW9mPpFaTFPQoEhttDp9+W9cCSTeObdPTKe4n0a4CkLNsZ7mZlFHN+7BhJcPa5E/e8P14xJ0E5200RKjkv/+jXxMEvlay0xypHam6Bw15RJDW6vW2O1ZvBZUDtlrpxXf2YpfhFP55WGVbfiVcsQfQTzJkzmgBleS0lmuO7k3s/11XcCfpFSe2aLGA52ClXXvFzSeKFnrZ6gsa4vfX/8bnLQwZDB2btftzgoHvKRTQ9tw/fdicNck/qJDplSW192y/66bqpm/qKFqt8nrx1FfivIXZnqR+YpcvJuZWkp+uT06Jy5oDOHqjmKrQkQoWmQlXyzTHJSIYjK0pfwAV3X09uMYI7+tsR98K6yXNUmYYR7CC7n5m44eu0Gr3fBienuuXFTdbrQvaVHQsY+ekPWByR+rfhVKxoK7cYOJM14faQlpMfrrOtPSJ7yABcCyFRmcaluNQxUIx/ueC07TpbP1oIVhRrBpFPfmUuh8EhWsMqJOrZXvJ12pPrNvSWaqZ7sgs06NNob5iM0YsNPDMYtk7he0ZxwD2Pjh/u7w7X1CyGRJ8iFEn3xihuJzCkn9UU5toSt2jYA98IW32VopPuhqqpBk6sv+Rfs0HvSltGSF1QpbmAEAOrpv/jHlIrT9KhEXXVnQn5uYIMM447o0VAODIDP0UxGmUkRBCZs9YD/aMSaaqjhFjkIXCRIx44G1hMiyJMY1hXV1AVpQQPc61qQqltlXCJShzeDU+eIqeOXKLKEvHpSbSdyC0m7BSjet/2s6Mdwp/JuIft4oUCMF/DoGYGxEo6mi3OYUM+xBpep7iFAY1pb/DzdqHUn9NxwPi6C0OMxU+jaw2733LILmAcE0jFSJyQ4KpeCGubNWjMMg1iVPWtohYbRUuL8Hypq0d9QD2iJ2a6OLnU33HnolnO7VQKSIrBKMMeJZlPfptnytn3CW78xswDIGTsSLYFcbsNL2dj4f0ZU3nUhPy0XKqfEB3DgDpiwH1tdWrpWEaHgIEZWs7HIwSDb69K2kCDTnVGnb6hXSL/k4NvW2qHyTeMPYyqSbK4xwDX37UJMZbA4p62j4mDYa06tADbLsjr0PcLs1hkwanvZEcFz7fo/5Mf6n79QlBsjRyy6GdHwbUF8REbpQUY2j/lF38bz9cz2qwm0OpmpkX8eu4DGxsMZ05ycUk4WdZZv5zCpOV2oiDAvTnxQQY/j3A1wxjklolnjWWLRELaXae1z1KcHzlT+kro0eUIoqSHIbbnhysYb3TYLtllIFR5d7BzJxEirjoyogpnkNBnEXfxzqu1RjvNB1NM4fLOnnd0RmIjW6o7ncj0VY+wWsVVpIiybGvd7eFPftTii+zHU/eOfLOiVLEWwAcN8qQL4GpWC3fKNXBO7cW88YxMhE2SA+aef4WLYlg0y3S/tdoo4V03iSqgbvUwrI6sfcT8biJD8XG95/7MxD8iLzI1Lmj1lg0crieRctFoHel8fnZfOZyN3PkIlQUQGe4q5YG2nMWShtbJUqUs9QF4MuvNB1Xqel9mqzXzfkYArZ33+W6gBn8uMRTiH/uNsdAts3i5CCiScNs6CGXmD/IkX0G17EuHiHi31W2xHq921SRy6VLSM7MuiUmP8HWisDV9Qih8QYA+QI6nKbFtISIDgdLKR4nIjbXbW7FXcr6lu3ujvrAsK+o+O3rWEPhzFwzFRFk/VdwP2BJ+dthGHsj4XxxiZOFYGP3TahTy861IL3ZPbKPLFT5YVx5R+b6z+zaAdEXbE97xP74BJPfTaXR2X3k/rczKgt3GAdwYTHaJ4PMoiJyQ12J5nztQRo7rZdZBMmMqSJcZH1oyPGDCgBJ3nzXbS5F9FLqIbjaA6Sih5PQ6e63j3OucsXZmYU9nA6qQ7fG+x496RsvmvxND0CX+8ryZTbhXDuQoMBPEtY7wXQZegWQRkkrBmnErKEnmxDokiMuyh51z3dJOSYIyHYOfYFR5DAOE+ikEB/IWVva2WuOv+R670WwBRP5e4TqcGgZBk4ppa3YI8/jEqgVP8urL6JBdT0GGwcMwPPxdbvwFPUA8NQq77D01w79w5gJiv2ZXt74iZS7i5TS6yLvw0G/CSP/PaJ291m1Jh4/qSNpBoTEFOrUBhuTAzrn0MsAuuvnPwOnynwh850gqhXmtDml+6JwE84aHwSx5D34jKCUZ+TAtddczIQyxMg1qu7g7WhZe+WCvrzYgW8ZLR6dk7lS3/vXP7mMU6X46xKEb5YmakuT/FTW3xASywnE5+NMAtOWTxLEY60/NiqCVeqI8BPL+9Et5Lyw6di1DlF9Aa4VCqaOGLo6e6/9NlnI/QnFy0kEVxQmOVsRgf9k9P9VAHXMWy4vM05O6LQ/EAptQgFEkRvG4ZKQVcPPM68jSWMqoDdTqwPvELiVAT8K5ZC/OAVqOBqNbMKCzCK92quPV8iiBUnj+07IR44v65BjTWJOUR3f4tm5h4OvRdf2I6rW0RErwXeVLwI58ADfNh1ZyqMua8E4MTB3p7776us8lzYYSmdWCE9GZqY/vQUb6D5F0jO/W5U8ux0Pxqa3ORckrp99RN2vAqviwqMM67CNyyIJqO25kxpVxm4pvCf0h3KX6mzblooM4VFZEMpBREU5FaXTvNDIP00oFCwB+zpENLXLxfaNAuVemH7lbPiA==',
561 version: '0.2',
562 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
563 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
564 accessDate: 'Mon Jan 19 16:10:23 CET 2009',
565 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
566 versions: {
567 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
568 header: '####',
569 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
570 version: '0.2',
571 creationDate: 'Wed Mar 14 17:27:40 CET 2007',
572 updateDate: 'Wed Mar 14 17:27:40 CET 2007',
573 accessDate: 'Wed Mar 14 19:00:21 CET 2007'
574 },
575 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
576 header: '####',
577 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
578 version: '0.2',
579 creationDate: 'Wed Mar 14 16:09:07 CET 2007',
580 updateDate: 'Wed Mar 14 16:09:07 CET 2007',
581 accessDate: 'Wed Mar 14 16:39:40 CET 2007'
582 },
583 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
584 header: '####',
585 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
586 version: '0.2',
587 creationDate: 'Wed Mar 14 19:01:05 CET 2007',
588 updateDate: 'Wed Mar 14 19:01:05 CET 2007',
589 accessDate: 'Tue Apr 17 19:20:33 CEST 2007'
590 },
591 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
592 header: '####',
593 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
594 version: '0.2',
595 creationDate: 'Wed Mar 14 17:17:20 CET 2007',
596 updateDate: 'Wed Mar 14 17:17:20 CET 2007',
597 accessDate: 'Wed Mar 14 17:22:06 CET 2007'
598 },
599 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
600 header: '####',
601 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
602 version: '0.2',
603 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
604 updateDate: 'Wed Mar 14 16:06:54 CET 2007',
605 accessDate: 'Wed Mar 14 16:06:54 CET 2007'
606 },
607 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
608 header: '####',
609 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
610 version: '0.2',
611 creationDate: 'Tue Apr 17 19:23:41 CEST 2007',
612 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
613 accessDate: 'Mon Jan 19 16:10:23 CET 2009'
614 },
615 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
616 header: '####',
617 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
618 version: '0.2',
619 creationDate: 'Tue Apr 17 19:22:08 CEST 2007',
620 updateDate: 'Tue Apr 17 19:22:08 CEST 2007',
621 accessDate: 'Tue Apr 17 19:22:08 CEST 2007'
622 }
623 }
624 },
625 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
626 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
627 version: '0.2',
628 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
629 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
630 accessDate: 'Mon Jan 19 16:09:28 CET 2009',
631 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
632 versions: {
633 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
634 header: '####',
635 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
636 version: '0.2',
637 creationDate: 'Wed Mar 14 16:51:02 CET 2007',
638 updateDate: 'Wed Mar 14 16:51:02 CET 2007',
639 accessDate: 'Wed Mar 14 16:51:02 CET 2007'
640 },
641 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
642 header: '####',
643 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
644 version: '0.2',
645 creationDate: 'Mon Jul 09 15:10:15 CEST 2007',
646 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
647 accessDate: 'Mon Jan 19 16:09:28 CET 2009'
648 },
649 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
650 header: '####',
651 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
652 version: '0.2',
653 creationDate: 'Wed Mar 21 12:56:43 CET 2007',
654 updateDate: 'Wed Mar 21 12:56:43 CET 2007',
655 accessDate: 'Wed Apr 25 09:59:58 CEST 2007'
656 },
657 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
658 header: '####',
659 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
660 version: '0.2',
661 creationDate: 'Sat May 19 11:26:44 CEST 2007',
662 updateDate: 'Sat May 19 11:26:44 CEST 2007',
663 accessDate: 'Mon Jul 09 15:08:39 CEST 2007'
664 },
665 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
666 header: '####',
667 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
668 version: '0.2',
669 creationDate: 'Wed Mar 14 16:38:54 CET 2007',
670 updateDate: 'Wed Mar 14 16:38:54 CET 2007',
671 accessDate: 'Wed Mar 14 16:38:54 CET 2007'
672 },
673 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
674 header: '####',
675 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
676 version: '0.2',
677 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
678 updateDate: 'Wed Mar 14 16:36:20 CET 2007',
679 accessDate: 'Wed Mar 14 16:38:12 CET 2007'
680 },
681 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
682 header: '####',
683 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
684 version: '0.2',
685 creationDate: 'Wed Apr 25 10:04:29 CEST 2007',
686 updateDate: 'Wed Apr 25 10:04:29 CEST 2007',
687 accessDate: 'Sat May 19 11:22:01 CEST 2007'
688 },
689 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
690 header: '####',
691 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
692 version: '0.2',
693 creationDate: 'Wed Mar 14 16:52:12 CET 2007',
694 updateDate: 'Wed Mar 14 16:52:12 CET 2007',
695 accessDate: 'Wed Mar 21 12:16:29 CET 2007'
696 }
697 }
698 },
699 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
700 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
701 version: '0.2',
702 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
703 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
704 accessDate: 'Mon Jan 19 16:10:06 CET 2009',
705 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
706 versions: {
707 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
708 header: '####',
709 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
710 version: '0.2',
711 creationDate: 'Wed Mar 14 16:45:40 CET 2007',
712 updateDate: 'Wed Mar 14 16:45:40 CET 2007',
713 accessDate: 'Wed Mar 14 16:45:40 CET 2007'
714 },
715 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
716 header: '####',
717 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
718 version: '0.2',
719 creationDate: 'Wed Mar 14 16:47:01 CET 2007',
720 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
721 accessDate: 'Mon Jan 19 16:10:06 CET 2009'
722 },
723 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
724 header: '####',
725 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
726 version: '0.2',
727 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
728 updateDate: 'Wed Mar 14 16:20:58 CET 2007',
729 accessDate: 'Wed Mar 14 16:43:46 CET 2007'
730 }
731 }
732 },
733 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
734 data: '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',
735 version: '0.2',
736 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
737 updateDate: 'Thu May 10 15:01:21 CEST 2007',
738 accessDate: 'Mon Jan 19 16:09:54 CET 2009',
739 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
740 versions: {
741 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
742 header: '####',
743 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
744 version: '0.2',
745 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
746 updateDate: 'Wed Mar 14 13:35:58 CET 2007',
747 accessDate: 'Wed Mar 14 13:35:58 CET 2007'
748 },
749 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
750 header: '####',
751 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
752 version: '0.2',
753 creationDate: 'Wed Mar 14 19:24:49 CET 2007',
754 updateDate: 'Wed Mar 14 19:24:49 CET 2007',
755 accessDate: 'Wed Mar 14 19:24:49 CET 2007'
756 },
757 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
758 header: '####',
759 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
760 version: '0.2',
761 creationDate: 'Wed Mar 14 17:41:15 CET 2007',
762 updateDate: 'Wed Mar 14 17:41:15 CET 2007',
763 accessDate: 'Wed Mar 14 17:41:15 CET 2007'
764 },
765 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
766 header: '####',
767 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
768 version: '0.2',
769 creationDate: 'Wed Mar 14 19:25:28 CET 2007',
770 updateDate: 'Wed Mar 14 19:25:28 CET 2007',
771 accessDate: 'Thu May 10 15:00:47 CEST 2007'
772 },
773 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
774 header: '####',
775 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
776 version: '0.2',
777 creationDate: 'Wed Mar 14 14:46:36 CET 2007',
778 updateDate: 'Wed Mar 14 14:46:36 CET 2007',
779 accessDate: 'Wed Mar 14 17:40:01 CET 2007'
780 },
781 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
782 header: '####',
783 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
784 version: '0.2',
785 creationDate: 'Thu May 10 15:01:21 CEST 2007',
786 updateDate: 'Thu May 10 15:01:21 CEST 2007',
787 accessDate: 'Mon Jan 19 16:09:54 CET 2009'
788 },
789 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
790 header: '####',
791 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
792 version: '0.2',
793 creationDate: 'Wed Mar 14 17:43:29 CET 2007',
794 updateDate: 'Wed Mar 14 17:43:29 CET 2007',
795 accessDate: 'Wed Mar 14 19:23:51 CET 2007'
796 }
797 }
798 },
799 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
800 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
801 version: '0.3',
802 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
803 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
804 accessDate: 'Mon Jan 19 16:09:41 CET 2009',
805 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
806 versions: {
807 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
808 header: '####',
809 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
810 version: '0.2',
811 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
812 updateDate: 'Wed Mar 14 17:39:39 CET 2007',
813 accessDate: 'Tue Apr 17 19:09:44 CEST 2007'
814 },
815 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
816 header: '####',
817 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
818 version: '0.2',
819 creationDate: 'Tue Apr 17 19:12:39 CEST 2007',
820 updateDate: 'Tue Apr 17 19:12:39 CEST 2007',
821 accessDate: 'Wed Feb 13 15:27:04 CET 2008'
822 },
823 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
824 header: '####',
825 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
826 version: '0.3',
827 creationDate: 'Wed Feb 13 15:29:04 CET 2008',
828 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
829 accessDate: 'Mon Jan 19 16:09:41 CET 2009'
830 },
831 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
832 header: '####',
833 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
834 version: '0.3',
835 creationDate: 'Wed Feb 13 15:28:28 CET 2008',
836 updateDate: 'Wed Feb 13 15:28:28 CET 2008',
837 accessDate: 'Wed Feb 13 15:28:28 CET 2008'
838 },
839 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
840 header: '####',
841 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
842 version: '0.2',
843 creationDate: 'Tue Apr 17 19:11:33 CEST 2007',
844 updateDate: 'Tue Apr 17 19:11:33 CEST 2007',
845 accessDate: 'Tue Apr 17 19:11:33 CEST 2007'
846 }
847 }
848 },
849 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
850 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
851 version: '0.2',
852 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
853 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
854 accessDate: 'Mon Jan 19 16:09:30 CET 2009',
855 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
856 versions: {
857 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
858 header: '####',
859 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
860 version: '0.2',
861 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
862 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
863 accessDate: 'Mon Jan 19 16:09:30 CET 2009'
864 }
865 }
866 }
867 }
868 }
869 }
870 },
871
872 //-------------------------------------------------------------------------
873
874 'joe_clipperz_offline_copy_data_newVersion': {
875 users:{
876 'catchAllUser': {
877 __masterkey_test_value__: 'masterkey',
878 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
879 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
880 },
881 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
882 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
883 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
884 version: '0.2',
885 maxNumberOfRecords: '100',
886 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"17"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","6e218e5d129105c20ac499307b260eb76bb2e753f6c319e17efdb848675c5fa2":"20"},"data":"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"},"preferences":{"data":"lwtXtArw4a27+tL3R9WRPagZT7T949t3Btdf3HHQ7w5vb7rkmjipAfjbuQHuMUxy"},"oneTimePasswords":{"data":"j6xAAs7uiQRbzdHADZO4wUKkUhwvqLR1tz5kIdHpTv0KIfJuSx96FoOjuHcOeskbxvPVr2b3fYYvvdzM1d4jWu2bg13ZIL44xwakhXlCwc+2dbYpkJgN5nY7D7/BwN3q3ctWlsE9dllYZ+bC2LQfb+lgxJonhCLF28BOWh3uae14xbdAHZ314MZmmju+xRZ7iY2GEu1/Z3Cuuf0hwpbSaY233iJeN5Ooc32rF1eHo9RrlcJVTKGzN74QQ+9f90lq+XlOFx3IfWba0axFxHlQLk2gnGwu7TX++LV9zpBk9MfRUDN2b1Rb0t/GWT6kQLtO+6Y+oTTlebc3dDbqIx8u5tFhOzELoS2fYctMTvW9XKg953cyFRHfmmq9b6NnAIoespck+gF4LeH8Ips0nqVnr3t2OpGnNk3ek4BYjzpgIqpN1+VrdciXQfo5bZFvAD7RHEP6HPSziRsoSml+5qyF8bAJvQxZwpWHYuCubeowAJX5FyoETtB1VRO4I3lYA1xhZgaJYyp3dAqezaXOZhLoq7hsneKczwpJFZGlNrWTbjpWYYh3Oijv2FGKaNUXz24pAP4FbweAtzE8Hbwpq3rgxVC9k1vWlSJRhSmJEDdNO9MFtVYcgoetnkK1bsYROQLQA9DA0Hy8Ew=="},"version":"0.1"}',
887 statistics: 'QJDMnceWmEr3hl6ZcSh8YffA',
888 userDetailsVersion: '0.3',
889 records: {
890 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
891 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
892 version: '0.2',
893 creationDate: 'Wed Mar 14 07:46:44 PDT 2007',
894 updateDate: 'Wed Mar 14 07:46:44 PDT 2007',
895 accessDate: 'Sat Oct 24 02:11:37 PDT 2009',
896 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
897 versions: {
898 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
899 header: '####',
900 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
901 version: '0.2',
902 creationDate: 'Wed Mar 14 07:46:44 PDT 2007',
903 updateDate: 'Wed Mar 14 07:46:44 PDT 2007',
904 accessDate: 'Sat Oct 24 02:11:37 PDT 2009'
905 }
906 }
907 },
908 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
909 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
910 version: '0.3',
911 creationDate: 'Fri Oct 17 07:49:20 PDT 2008',
912 updateDate: 'Mon Oct 27 00:58:49 PDT 2008',
913 accessDate: 'Sat Oct 24 02:11:26 PDT 2009',
914 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
915 versions: {
916 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
917 header: '####',
918 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
919 version: '0.3',
920 creationDate: 'Fri Oct 17 08:00:31 PDT 2008',
921 updateDate: 'Fri Oct 17 08:00:31 PDT 2008',
922 accessDate: 'Fri Oct 17 08:00:31 PDT 2008'
923 },
924 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
925 header: '####',
926 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
927 version: '0.3',
928 creationDate: 'Fri Oct 17 07:49:20 PDT 2008',
929 updateDate: 'Fri Oct 17 07:49:20 PDT 2008',
930 accessDate: 'Fri Oct 17 07:54:23 PDT 2008'
931 },
932 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
933 header: '####',
934 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
935 version: '0.3',
936 creationDate: 'Fri Oct 17 08:00:13 PDT 2008',
937 updateDate: 'Fri Oct 17 08:00:13 PDT 2008',
938 accessDate: 'Fri Oct 17 08:00:13 PDT 2008'
939 },
940 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
941 header: '####',
942 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
943 version: '0.3',
944 creationDate: 'Fri Oct 17 07:59:31 PDT 2008',
945 updateDate: 'Fri Oct 17 07:59:31 PDT 2008',
946 accessDate: 'Fri Oct 17 07:59:31 PDT 2008'
947 },
948 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
949 header: '####',
950 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
951 version: '0.3',
952 creationDate: 'Mon Oct 27 00:58:49 PDT 2008',
953 updateDate: 'Mon Oct 27 00:58:49 PDT 2008',
954 accessDate: 'Sat Oct 24 02:11:26 PDT 2009'
955 },
956 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
957 header: '####',
958 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
959 version: '0.3',
960 creationDate: 'Fri Oct 17 07:57:17 PDT 2008',
961 updateDate: 'Fri Oct 17 07:57:17 PDT 2008',
962 accessDate: 'Fri Oct 17 07:57:17 PDT 2008'
963 },
964 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
965 header: '####',
966 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
967 version: '0.3',
968 creationDate: 'Fri Oct 17 07:58:00 PDT 2008',
969 updateDate: 'Fri Oct 17 07:58:00 PDT 2008',
970 accessDate: 'Fri Oct 17 07:58:00 PDT 2008'
971 },
972 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
973 header: '####',
974 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
975 version: '0.3',
976 creationDate: 'Fri Oct 17 08:01:59 PDT 2008',
977 updateDate: 'Fri Oct 17 08:01:59 PDT 2008',
978 accessDate: 'Mon Oct 27 00:57:58 PDT 2008'
979 }
980 }
981 },
982 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
983 data: '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',
984 version: '0.3',
985 creationDate: 'Wed Mar 14 06:53:11 PDT 2007',
986 updateDate: 'Fri Oct 30 10:52:54 PDT 2009',
987 accessDate: 'Fri Oct 30 10:54:46 PDT 2009',
988 currentVersion: '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5',
989 versions: {
990 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
991 header: '####',
992 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
993 version: '0.2',
994 creationDate: 'Tue Apr 17 10:13:41 PDT 2007',
995 updateDate: 'Tue Apr 17 10:13:41 PDT 2007',
996 accessDate: 'Tue Apr 17 10:13:41 PDT 2007'
997 },
998 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
999 header: '####',
1000 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
1001 version: '0.2',
1002 creationDate: 'Wed Mar 14 06:53:11 PDT 2007',
1003 updateDate: 'Wed Mar 14 06:53:11 PDT 2007',
1004 accessDate: 'Wed Mar 14 07:24:35 PDT 2007'
1005 },
1006 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
1007 header: '####',
1008 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
1009 version: '0.2',
1010 creationDate: 'Wed Mar 14 07:33:00 PDT 2007',
1011 updateDate: 'Wed Mar 14 07:33:00 PDT 2007',
1012 accessDate: 'Tue Apr 17 10:12:56 PDT 2007'
1013 },
1014 '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda': {
1015 header: '####',
1016 data: '9rcbGeLFjW1cwULSScOa5zfb9BZqoSi8IvarxwjLVz+4VqApsBZnwJsxJHq/L9zV3SRYlAQRRLNy3lhpO/fJAOg4RNp68KdtA+IZfCsn1MzwfOoBrnTTELPKxDim4US9xQNdJp5ffWoLB8demEL2YkSNTrPVr5crvVPyepuRCzdqUoe6Dba05tR6Ju7/+d9K/cfJg+KI/ziSUSVlOTsIahGkipvMwYzhCOqjljJvdeF6XLLCh7F70lFvpW5vtv5jNmpkgvAhfxgovIZ3tav0WDc+DEdFNHNsCtFhwRYsb1dH5Ry01M8g4vS7PDkuCNYOvjL9bS2Wmy/lVulM9dYdB/d/gKWTjbqgre/IR1TPPdtfiVBo2J9PUvM8P/c2LmQrf63OwjWT74N0D7q/NuVn1KXzREQiyMi6ezzujzJolpNVUNkJFlnSHl+EqnfFiiR5ALZ7Nts4uWLe4Vpn0XmyvHoAVDBK3fw7e3n0tIG4x6k95guIWRKdDpYLOTHOe9jKJbc6KxdGmt21/5pX4KdeWavwirKRcXW6ReJIOVF+KREEZZOGWu7UKWgqgdaMuvxO472zzXzxTBvnpOmnxl/oIkhs23OPxHEwHXX8gXnyA60hd2tthCfmzfI48wWkO40cUTFnqO8htWRXwbUa9gYTjYWDTmoIyK9AgO+PfBLNqx3JzJYAymDcw39ItO2lIcEBkZ4=',
1017 version: '0.3',
1018 previousVersion: '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544',
1019 previousVersionKey: 'RDzOj7LWZcdVg5KmmIT5VXM0cUFeC9tC3n0IXDfNpj12cq0w3k1rpBYbt4eSEkOcdM7Va07FPNdZY4Pd65xBo2MGc56Ka1pX3wW4jTxz350qtw==',
1020 creationDate: 'Fri Sep 11 05:54:50 PDT 2009',
1021 updateDate: 'Fri Sep 11 05:54:50 PDT 2009',
1022 accessDate: 'Fri Sep 11 05:54:50 PDT 2009'
1023 },
1024 '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549': {
1025 header: '####',
1026 data: '0ck0NbHAOYieUs5c1U6xSMf3pj743aIv1nnBnB7f4vsvKpMiYleQwr4SwY1W6vhg+3sLnO9C0CCD8Brt4V1wScz/STp4oB3hoy31W4dsAFsUyAWFJ8MrYDsZW3jotIPVbMKxu+4Yp051iDPcFKimDhfAu1zVyiVE9llNj3tP6d9gukUNfGZ5CvFmEXcheHB8t81Z2tgeO70EELFUn7uqKJwh5xCqTeogPtsifmCjgx8Yo6hi19vl2TDAaX0HquFO3WcIAL185tzYZ5rU23BYwxD7hVfan7lngSVq614MsEB3EX9WiHRoissSSajNkKTlTW8zsNj3VlUXKMQiJ2aA9Pi+/Yt9sNAbmyTl6T5TNN4QSquLPLyxO4p+OIjra1WPdmVsCti7fOyGirogfJF0XhZg4imvGXK0c6lPZIlg/OEnoDSTiHXlOYpSgaEw1Js5HZ+390XY0KYPtpsZlY+oeVS4p29HN7x3CEairuIldEsZrk4whiVcwzlnmw3n8wiewumus4eRh9w0CIwJELKeMiz5cX4bX8+AKS+u8O1W0GwKlEGTj/joA/M=',
1027 version: '0.3',
1028 previousVersion: 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd',
1029 previousVersionKey: 'moIwxP20kmN6f/+pgb8pJNqsLUz8Qo2BvcAFnXBmiX2E4oL1pakM9iq0e3IAiNLApmID2TwyAxhsmKj422R9uWXsUFd84LRRt6lMKa3/u1dC1w==',
1030 creationDate: 'Sun Oct 04 14:05:10 PDT 2009',
1031 updateDate: 'Sun Oct 04 14:05:10 PDT 2009',
1032 accessDate: 'Fri Oct 30 10:52:36 PDT 2009'
1033 },
1034 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
1035 header: '####',
1036 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
1037 version: '0.2',
1038 creationDate: 'Wed Mar 14 07:26:35 PDT 2007',
1039 updateDate: 'Wed Mar 14 07:26:35 PDT 2007',
1040 accessDate: 'Wed Mar 14 07:26:35 PDT 2007'
1041 },
1042 '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043': {
1043 header: '####',
1044 data: 'jt/CbXS+TEjH/jPrstH7cQZGK3yse470grrhdAOdWoGVtFMmL7fMJZQOKm5IQSrMHFEsH3PoSs99Rr4ui/u71vUb6s/TIsjyv7yihnCYVsOEJOPcnL2wynciILV8p48Lky1wGztW+oSynYOG0CGYDofFhF/MNCBsG1EcTqW7Cf+8rUiS4nA4ZRZVv3HsZp6rCabJsAoK1pmf5tXGJHPjS6xdy1A9ea4bV5Gad0pu8IXvjbZTrDymHem0t8C+oZ7uJ/mG9cFVcNykXoO/TDP0goD6KvTqtdY3VWNNTAERycAW6jFtdMv2W/AFNmnYatZ+EbSbj6/RyGaNnRv/ceBitMh73HRr1EVtZw0wPthMBXwnlPbpkfUwWPBHYpwImligm62/6YBhxDgnMZta7TSi8apT',
1045 version: '0.3',
1046 previousVersion: 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521',
1047 previousVersionKey: '8BbhE8C41VX8B8m3TbfLz4bgSfE01IAUl8Zlu2YFdEhpw1erqInN1eRE6WLyBB5MxckmJpbn6VSizqbFbi/3Id5p/fibHKmbmNp6xu7iIo5zzA==',
1048 creationDate: 'Fri May 22 03:30:43 PDT 2009',
1049 updateDate: 'Fri May 22 03:30:43 PDT 2009',
1050 accessDate: 'Fri May 22 03:31:39 PDT 2009'
1051 },
1052 '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544': {
1053 header: '####',
1054 data: 'XKsPGp4MeuvDrgikcjbMnmw/Gz74sTfyP3lLylbrtEZJ3aGSjRvE7s9o3Ya9GKRhYxNQ0dXT0vM6xIE6r/dMt8PwU+/5dNtRhCGPAHvKmEEGb6EBwR7gUDxQLyFTAYX8ut+CpyNJLQa2pHoEl5aNUTjk6blYrKp0GHKt2Q3PZrjIn78rcOLcKY5bx4OK0h9rN0G8mOFQ0g29knKyaykv8dja/Uy5XBeshKnVT7YRHk1nRuwz69ZcX+1Z2qzfw5sxJx+fDK+otWVpjzDP02qqn7ju/r3GgSnW8p/ghBeurUCLdQiS+fFAevhOwCkZGjPMntG3Q4qVt42VxIiiuvfShdaSsNMOW9Uziew3XwOYL9mNIOSdPSjtry4sKrAh3XNmfuJjWTy+69Iyi85CtQ6xMFilANgSBfTqThUePCrEkv9ZBbvpRovuuljlxqZ3gUmtvwy9a3ACAr8SMGWX0ydQjKyvZhoGRCBM+ZC7zCe/JmIpdklvNd/+HqUgS2iAnf3CeH4gUPQVizFR04Ysgj00xO6v4bdY2bYVKIxunygBGNzySi8DeSREu/rUKWgx0KY7S+Gg/jqFMYpE9oy8CxUCmSLeNrnxUgprPqKrr72yue0kBGVoYyJwhXo4MG+LPV0rtVp8b2GeHE9fYmyEZO2Ke93SrHjezS6CnWQsvjYsFYCLdLtEGwo3mpS46DF69LlO53k=',
1055 version: '0.3',
1056 previousVersion: '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447',
1057 previousVersionKey: 'eEvij0YZ1r+5cNNpleVHE+kjCZlSggZuE+3Kum9b/11JGHTgQ3bY/o5amM+4+FPaiCU0Zd6MWFAI4dPscyvAS9in6WdTOm7z3fQ3uqYAtHghPw==',
1058 creationDate: 'Fri Sep 11 05:54:01 PDT 2009',
1059 updateDate: 'Fri Sep 11 05:54:01 PDT 2009',
1060 accessDate: 'Fri Sep 11 05:54:01 PDT 2009'
1061 },
1062 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
1063 header: '####',
1064 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
1065 version: '0.2',
1066 creationDate: 'Wed Mar 14 07:30:09 PDT 2007',
1067 updateDate: 'Wed Mar 14 07:30:09 PDT 2007',
1068 accessDate: 'Wed Mar 14 07:30:09 PDT 2007'
1069 },
1070 '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': {
1071 header: '####',
1072 data: 't4ohy1/z6oUzyQLtqQoumRzcLCnaYjL/+WQGwE6yIXaGEhCWywe0aIVusPKLcsfYTCXVU1/dXtuucaZoMw7PMSOUx9awTp14NmShaT/9VKChZf1TLi0CO2jOUGsvO4DHlNAQhJhas431l83F+h5+hrkqX8j5kIhzpwlroGEjkml0fswmmwDyHbSTgVEyErZc+b3V+9oUCwzYvd9ITHh8uWLa6j+GuwZTZAk2FY7Vzoh9K46WO3/qCz1pJ8JVkcffun9alK8qzK0Wp05mMLIrt+WHFFTKrG9zpBkcswkbwhJ5ZnakfYLJ8GPH7fKnAid1FGW0Owms058smDBmFO20HyH+ho7SL80Q689W+Jx0+nkUKvxWtq9BWLW6Z3ClDZOVITeg35gQVr6aRzZ+VZwbAy++',
1073 version: '0.3',
1074 previousVersion: '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043',
1075 previousVersionKey: 'i4e0h4QhuN0B39drNLsOWruy+R64siKHWxc9YXgpoCPitWL/ika1MVCRX7CJC7lH5WD9yzx6l9isAy/Hb3nUIEp97VcFKG4S0gOaZkdWNZ/U5Q==',
1076 creationDate: 'Fri May 22 03:31:46 PDT 2009',
1077 updateDate: 'Fri May 22 03:31:46 PDT 2009',
1078 accessDate: 'Mon Jun 15 15:20:17 PDT 2009'
1079 },
1080 '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447': {
1081 header: '####',
1082 data: 'LDAixBQ/CEqQX35jio3aAXG+Py4wNylXI1mQJ5IDxnpqmkFZfOXCaScpwIkQwQzEOjh9p3cOShzrBm6r234HKxgg0ufFnkTWbQSjCgekfVEqiBFi2rWSj5v6a5LMANLwtCz0b2IPr6Z8LSPddgao7P0nwBdCiKJAnY/uGdvSn67WSFhAUGAIs5ZKIZQf8Zi+cA3hd+Xlv1W/2+OXLaIPTkD1bCuQo5qEiAoOl5mXngWOmQ2kTGpC7Hfkknm/uzDeiZTe8VpGjqKTwB/tl64LU5OD26DMpihnVeQNqMpYndEJO7Yu9Zodv8WMyYmVlrw1UzTB4BLTL337vVm5uBiUjAfJIwJx3b3fXxdEiWFuK8uwOXAO2X9OOKfLPuowOj21B/+zRLum3Dti23IfHab5KwSq72sB/vjpl/KVbcGsWZET4VTCZvO04T6Emjb2UBLFLIgInZ9tqN4RXSKz0Uj4n+pitmFSDleuPtL8EzEESX6FtmT/IVdr5AGNjv93wIk5CgeoK2YiNlpTb+CHbcA5HPn+TH9T4999mWrJh5hxZ1vGYxlAd1AveMCgA3y/Wl+kZKMnUatXPM0deUS1GnzpoRXtI0dUi6J5sOHxeahZL0TQbCbHcKkoaSJklMl5YEVaLXyakO4ATKyNcsPfDQrPvWfra1I59RI3seStv2Q0bs14Zco+0opvKN71R/HxjF/etUU=',
1083 version: '0.3',
1084 previousVersion: 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b',
1085 previousVersionKey: '3JAEXzigeX/PwpA42+K/CPSpP40EO/j++M6pB0NF71EfKCApWSWy89flo0KbrckF+mUAjyY2hLYBc/F+Q2vgGNhAZqq0vo3wcUpFjFktqgRZ4A==',
1086 creationDate: 'Mon Jun 15 15:21:15 PDT 2009',
1087 updateDate: 'Mon Jun 15 15:21:15 PDT 2009',
1088 accessDate: 'Fri Sep 11 05:53:23 PDT 2009'
1089 },
1090 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
1091 header: '####',
1092 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
1093 version: '0.2',
1094 creationDate: 'Tue Apr 17 10:17:52 PDT 2007',
1095 updateDate: 'Tue Apr 17 10:17:52 PDT 2007',
1096 accessDate: 'Fri May 22 03:27:59 PDT 2009'
1097 },
1098 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
1099 header: '####',
1100 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
1101 version: '0.2',
1102 creationDate: 'Wed Mar 14 07:27:35 PDT 2007',
1103 updateDate: 'Wed Mar 14 07:27:35 PDT 2007',
1104 accessDate: 'Wed Mar 14 07:27:35 PDT 2007'
1105 },
1106 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888': {
1107 header: '####',
1108 data: 'ZRJXJ72ZBH01gAML0R7n42fI0WjdbVXzyZH7H5MP2RgtGuVvfdadVK9+U8mzdf1Et9DoKrHhZUp9baeREPO/Fk0r2IO8NmKv/8+rMkK6x4qeWnI8ZAJfQemGtqke/VcTn4KGAyTeV8arzXn/whsLpp/xN087NdDw9dP8PLb43Yk8TNC1m2d85FUagSh4NOI3rmcbHAiCOQpqHBPBoJY1Vf4Pxu949TEUm6kT6Rl0n/sb3PSLu4LSa6+WiGZJ4mgE+3XZyfozrJsvGoTYSkim3MTwhrCLEVaDMTq4Ei6FyG+TeV95Q9Ei8HHwBqdp0fxUxavNe67Oo4m+ECiRvZ24b5+Nz6POBjXfn+61yCyIhz3SV3IaYIF3rgXRZA1q2sax8kRGtoG7ONxczUqGyQ5S6Lht',
1109 version: '0.3',
1110 previousVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
1111 previousVersionKey: 'ZbGA3id5JTGeRjVUR/LkntSGjPDEbZbNrQxc4SiQDdlDO3dJNVpfRp69PSk6vqEiZ4r/6OKvE+fl2TtPadJQ82fP7WsULtrSkYryQL+CQvz0VA==',
1112 creationDate: 'Fri May 22 03:28:11 PDT 2009',
1113 updateDate: 'Fri May 22 03:28:11 PDT 2009',
1114 accessDate: 'Fri May 22 03:29:03 PDT 2009'
1115 },
1116 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521': {
1117 header: '####',
1118 data: '6TAJAQ4qE5l2SybVzeEqQxYZgVow0MKzl8xwfoE0HeuSr8uJlszGas5NaJL1SFI5sDDwIJzbtIBE/yjaNwWw18+JzswIWmkLW+kTIAtJKjNtWnaGlDJMTA4OIo5gj2Vqq4o1VngzMTk/DV6f5ob3/HxN+YpE4r1u2SUVeADbjcyjRmYE9ygvuvQ5AuU3u2hzmstI582kBlksLPGhX6nJfAPCrSkdphNj28T393p5w82/FFCFNHKjgKN/xI3Rotq7rObFaNid1tmHvozKLYeLQQfjglJ2rRDQDTOJONRVJEObDFV5bmaY4z3XljO2nbQ4iMK5CrTFAYTYNph3/WOQWjZHWmAXaHMYvBSlICvF99C530sOGQYIaBWKFuOv/pNuCZh/tBNVcI4pU1dz438/7LQf',
1119 version: '0.3',
1120 previousVersion: 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127',
1121 previousVersionKey: 'U2Z+xaFl6o4XH/8DktJimjP3+1PaYRf1mZPW0sulAOykDH0LY2U+kbBj+mfNV8rVAJlA7O8LYl8AlUNZUTS+036MiIinpD0Tmhkc91rFkMYgbw==',
1122 creationDate: 'Fri May 22 03:30:03 PDT 2009',
1123 updateDate: 'Fri May 22 03:30:03 PDT 2009',
1124 accessDate: 'Fri May 22 03:30:36 PDT 2009'
1125 },
1126 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd': {
1127 header: '####',
1128 data: 'zqOJI8Qken5hwXQ4MFRzfnB5tnROjMhg9mw+aYwwvI8VV8aADoyPuaRi6bdxy4LP45PqVR9G2iXFT+h/WaBql+rz1AA5AVz54cpd2gdDh8Eec/PJXyL3SfXW1PQoO3bwhW6rkR5cNQf8xKxlmGWLvE88AXT65tV/RdYJE574aVEZexzo/40X60weCl1ZITl8IH97eug5URe1lSBFsy5sjo+SE09FqtnmnGy4O2LL+0XSR7xJqiJihv80msEgk3lTbwUEiGWm3OiDnvLk0GjaMy3+EGV2/rHZuICMJkD4ge6cIBc/h00ZCFnXN4bX+OC/KpEFgtnPgQ+duVpsVNdYmNwxSavyFs/UnFFDTDIPZxEKhRHFTW9zaqu2jVTZd4+/ro6TSYSlEN6F/jtiL06nM/F14Bp/dYuqBZfc+N3vx+72jj6IOKTHtqvlj6jdSZseN8olODT2IGI/fsjR79biVCIOODAaF6DCd32ClvoenCVPTIhMc2AfuKTbleiquk95nN4lgpZbMzrrvWHPJD0oKXHo8X1GJd19QCj+IhzCTx1Ap1JPOTMIG+reaxxwicGjH5Iios5DmA4gjsRWj9BVr+QmMJmY4KTpyRG1lVYovm78VWf0nzyGLNx5sgWrRyYLOI75m0zUdNGDUpKGSyqrIuEwOrI36uRr71MvJ0ui1HXBkDbPIvrQ01UyocO1paeHyTk=',
1129 version: '0.3',
1130 previousVersion: '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda',
1131 previousVersionKey: 'zOAbF4q8A+LjWfMMXHRHH2DmzdToA6a2U12y0G6cyAm5tvz1BrrAcgk/5dx0yvFF+ZSxuOOfnvCPVBN2kT75otq44tVEg+FSJ4khcC6HThCluA==',
1132 creationDate: 'Fri Sep 11 05:56:02 PDT 2009',
1133 updateDate: 'Fri Sep 11 05:56:02 PDT 2009',
1134 accessDate: 'Sun Oct 04 14:04:58 PDT 2009'
1135 },
1136 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
1137 header: '####',
1138 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
1139 version: '0.2',
1140 creationDate: 'Tue Apr 17 10:15:09 PDT 2007',
1141 updateDate: 'Tue Apr 17 10:15:09 PDT 2007',
1142 accessDate: 'Tue Apr 17 10:17:01 PDT 2007'
1143 },
1144 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b': {
1145 header: '####',
1146 data: 'Al9KSfdnvVJW+GPqYbIGXNDb4KefUjtkNTJbk0zlBsyeZc+eoDDLJKy3ukugFfDFDmX+g0U3lp1UIsRQB7JHEZ+NWKPJu/hyvbTmwuVFZUnGEZMhMOIqc6nECN+VFCllxV7QBKpdcRJ3E3fiYP4fV0v8wquOD1dfsMs26f3y2fOQLNS0+UpDe0GoRw2R3+lbot3qlftdO6vb5+LYjZEjdSI/G2fPQ3VsS8N0KLLNVHQxix4xn4Qn78i/ImlxbtyoKNLP4ZIaXZ9ELuGvV+yKaQVOVTwxpJOWKMu1Do55cMwdFjxU7Gid03xEYEaZpClcsrbwdGgkJo2+WnpC/L9G4I9X5L+sVISbO49PaZ9DMdQJAlY5QCIjokPchYUp9Vr9u4KcgbAw9FrLQAMSRLnWhf0bLr0mv2ioTOlQKPFBkTIuMnsyglD856ZYQOIHl48+K5HvUZYZqI5UJjPXdrmzycD/Yxt878pSnkkfeyX0Cr/7Rwfq/zOPN5XJcwsO6j9ubuXjnIos0E/SG1BOKrLY+sE7SXzWOqhpzkApb6ILaGhtHNOHmYAckpPAqCe85g/XPZsmWjsABB64Gwg9oviC2ew/IDXigNXGtY8tbQmAny58QPfRihT5HxCRMFP2pA1Xh2WU1vEXtP8=',
1147 version: '0.3',
1148 previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7',
1149 previousVersionKey: 'B0wCj/b+UZP07a7VlnKVl/wtiaFzCmPux+T4tBFQati+nSNQCHUQM2XAQ3n1VWeewIyLjKlVI6W7SXRZnCxlcOdqBLDymDkhKfL0FIvmHNKmig==',
1150 creationDate: 'Mon Jun 15 15:20:54 PDT 2009',
1151 updateDate: 'Mon Jun 15 15:20:54 PDT 2009',
1152 accessDate: 'Mon Jun 15 15:20:54 PDT 2009'
1153 },
1154 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127': {
1155 header: '####',
1156 data: 'mZNwCsPrEohGEYglwUcTQNPDGJWoQRcRDIoWJ482qFJu617UU3Y0hML3CZ+ALtITVpnZl6mGZ3nHCpigt5naJmvwjyV9O7SVkGjc7mrzvjQSP2jrlXGXVIPqjsywDgG74bmaOPLEstQ9Sb2UPGIdinYdDglvQsIaFHQaWHO9bSYLjitfuS+qH2erK/QhqJQ56LxSpcnF5pevfuKZVAkrfhYAhIxqSQ15lZ3QSHxJfT8pQntR8QWL65RetkX/c9eydWyPqVFKqCTghU18p2Omz74UEakBBh3o6DxeTw90UY4YM1tRmsalS3oYG00BFDfDD3mEVZNSrqsxdCikqUSEGvq82whYxsFTj/5fHVLoJybYg5MfpLR+iW8O94g9p2d3jx2mTeNNjOZp+Q5/Wc4rKS7r',
1157 version: '0.3',
1158 previousVersion: 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888',
1159 previousVersionKey: 'RFTIyzDM9GP+QklGI/YfTgxB64iqyF7+c7bZntSZlFFDkiVN7pJbToZjl47c272J4dPXFxkORR2o+pIyYDdRvKQZQ/oHXp9aZi5BDKGwHYkl8w==',
1160 creationDate: 'Fri May 22 03:29:12 PDT 2009',
1161 updateDate: 'Fri May 22 03:29:12 PDT 2009',
1162 accessDate: 'Fri May 22 03:29:51 PDT 2009'
1163 },
1164 '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5': {
1165 header: '####',
1166 data: '8mmpKGrkSqiLyreEtGdKN9EXeb47uEN+XkSXEhdIxkMkmvR0A/AGtKjG1o6bbSXfPzAtfrMfJJxwyhWcRVqcikzc0KwINua4X+1Grf7QG2IOYYFqujmLyCwClGSRaannCAbio7+YI2PlDrlMrwB38RvMde6zrMfZzl2O75nkVX3DH+5IHJpwwYeukTSAu5EQR17oed+xoSHkKCQG3ToTsbnGPwZSGM0D+aiTXVW+PJD8D8LvDEU8i3EHQ9E02+d3dKPV/3FGRDgvwLIIjHU0qX5khYJ9PjqSgAxOhRKFwnG1kJn6NG1rvsXYgefJORElib/xijoCM9EJkUZ9e340WwhfZa1GbV7gLEbVn2aeaLcaTjhtPz9pL9WQOklChvdi/0XaHRrgflHogqC0qUQ63lA2CFOXwR9EXspZIi+zLzgAaEMGN0NlnbGHjAiVz6SVU/RUkh3DkKmMuGNS1n93spVbMMLZgcT5zxBFzT6jARvC8qKaxe9UlbMIH8ZCXMrq26V/sEZrxmPT3FZB+dmmqA9lLEBFEcw927uu1U3kZwXhQArQCN3MbEQ=',
1167 version: '0.3',
1168 previousVersion: '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549',
1169 previousVersionKey: 'gxQ13UMdZF0F7chGySUkuhxxSJ7CU2wubdG0tijs2G9uxYEY6ADjVX6zi3nrft7ggnLM8LyuFtZqj1wMX3pMUsbxZq0v2vfpVaYZ9cN1pahwMQ==',
1170 creationDate: 'Fri Oct 30 10:52:54 PDT 2009',
1171 updateDate: 'Fri Oct 30 10:52:54 PDT 2009',
1172 accessDate: 'Fri Oct 30 10:54:46 PDT 2009'
1173 }
1174 }
1175 },
1176 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
1177 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
1178 version: '0.3',
1179 creationDate: 'Wed Mar 14 10:39:35 PDT 2007',
1180 updateDate: 'Mon Oct 27 01:16:14 PDT 2008',
1181 accessDate: 'Sat Oct 24 02:11:24 PDT 2009',
1182 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
1183 versions: {
1184 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
1185 header: '####',
1186 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
1187 version: '0.2',
1188 creationDate: 'Wed Mar 14 10:39:55 PDT 2007',
1189 updateDate: 'Wed Mar 14 10:39:55 PDT 2007',
1190 accessDate: 'Mon Oct 27 01:07:56 PDT 2008'
1191 },
1192 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
1193 header: '####',
1194 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
1195 version: '0.3',
1196 creationDate: 'Mon Oct 27 01:09:11 PDT 2008',
1197 updateDate: 'Mon Oct 27 01:09:11 PDT 2008',
1198 accessDate: 'Mon Oct 27 01:15:58 PDT 2008'
1199 },
1200 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
1201 header: '####',
1202 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
1203 version: '0.2',
1204 creationDate: 'Wed Mar 14 10:39:35 PDT 2007',
1205 updateDate: 'Wed Mar 14 10:39:35 PDT 2007',
1206 accessDate: 'Wed Mar 14 10:39:35 PDT 2007'
1207 },
1208 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
1209 header: '####',
1210 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
1211 version: '0.3',
1212 creationDate: 'Mon Oct 27 01:16:14 PDT 2008',
1213 updateDate: 'Mon Oct 27 01:16:14 PDT 2008',
1214 accessDate: 'Sat Oct 24 02:11:24 PDT 2009'
1215 }
1216 }
1217 },
1218 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
1219 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
1220 version: '0.2',
1221 creationDate: 'Wed Mar 14 08:01:24 PDT 2007',
1222 updateDate: 'Wed Mar 14 08:01:24 PDT 2007',
1223 accessDate: 'Sat Oct 24 02:11:41 PDT 2009',
1224 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
1225 versions: {
1226 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
1227 header: '####',
1228 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
1229 version: '0.2',
1230 creationDate: 'Wed Mar 14 08:01:24 PDT 2007',
1231 updateDate: 'Wed Mar 14 08:01:24 PDT 2007',
1232 accessDate: 'Sat Oct 24 02:11:41 PDT 2009'
1233 }
1234 }
1235 },
1236 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
1237 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
1238 version: '0.2',
1239 creationDate: 'Tue Apr 17 07:36:08 PDT 2007',
1240 updateDate: 'Tue Apr 17 07:36:08 PDT 2007',
1241 accessDate: 'Sat Oct 24 02:11:21 PDT 2009',
1242 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
1243 versions: {
1244 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
1245 header: '####',
1246 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
1247 version: '0.2',
1248 creationDate: 'Tue Apr 17 07:36:08 PDT 2007',
1249 updateDate: 'Tue Apr 17 07:36:08 PDT 2007',
1250 accessDate: 'Sat Oct 24 02:11:21 PDT 2009'
1251 }
1252 }
1253 },
1254 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
1255 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
1256 version: '0.2',
1257 creationDate: 'Mon Apr 02 10:12:44 PDT 2007',
1258 updateDate: 'Mon Apr 02 10:12:44 PDT 2007',
1259 accessDate: 'Sat Oct 24 02:11:40 PDT 2009',
1260 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
1261 versions: {
1262 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
1263 header: '####',
1264 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
1265 version: '0.2',
1266 creationDate: 'Mon Apr 02 10:12:44 PDT 2007',
1267 updateDate: 'Mon Apr 02 10:12:44 PDT 2007',
1268 accessDate: 'Sat Oct 24 02:11:40 PDT 2009'
1269 }
1270 }
1271 },
1272 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
1273 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
1274 version: '0.2',
1275 creationDate: 'Wed Mar 14 11:09:05 PDT 2007',
1276 updateDate: 'Wed Mar 14 11:09:05 PDT 2007',
1277 accessDate: 'Sat Oct 24 02:11:48 PDT 2009',
1278 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
1279 versions: {
1280 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
1281 header: '####',
1282 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
1283 version: '0.2',
1284 creationDate: 'Wed Mar 14 11:09:05 PDT 2007',
1285 updateDate: 'Wed Mar 14 11:09:05 PDT 2007',
1286 accessDate: 'Sat Oct 24 02:11:48 PDT 2009'
1287 }
1288 }
1289 },
1290 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
1291 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
1292 version: '0.2',
1293 creationDate: 'Mon Apr 30 16:10:17 PDT 2007',
1294 updateDate: 'Mon Apr 30 16:13:27 PDT 2007',
1295 accessDate: 'Sat Oct 24 02:11:35 PDT 2009',
1296 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
1297 versions: {
1298 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
1299 header: '####',
1300 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
1301 version: '0.2',
1302 creationDate: 'Mon Apr 30 16:10:17 PDT 2007',
1303 updateDate: 'Mon Apr 30 16:10:17 PDT 2007',
1304 accessDate: 'Mon Apr 30 16:10:17 PDT 2007'
1305 },
1306 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
1307 header: '####',
1308 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
1309 version: '0.2',
1310 creationDate: 'Mon Apr 30 16:13:27 PDT 2007',
1311 updateDate: 'Mon Apr 30 16:13:27 PDT 2007',
1312 accessDate: 'Sat Oct 24 02:11:35 PDT 2009'
1313 }
1314 }
1315 },
1316 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
1317 data: 'xSjnJLMCEBBiOM2RxFm2EUCxMy9a2eexGsBj851cR/PsJlfG1lCh8HwD1i7HEWVFB2GBK9Pf+U7TpNSYsq9VY+AzBNz4p1aSg3Hswoou4OpCCgnBpeNLkr0q7KBmSVmSH+omECgWzbqux3LiqT7yEWxemVRA4ah4a09DvhB9bpVJiteBGg==',
1318 version: '0.3',
1319 creationDate: 'Wed Mar 21 08:29:06 PDT 2007',
1320 updateDate: 'Sun Oct 04 14:06:08 PDT 2009',
1321 accessDate: 'Sat Oct 24 02:11:33 PDT 2009',
1322 currentVersion: 'a999c255e435e85633f136d0464f29e6d41f87f46e6fb50ca63adeede9a6650a',
1323 versions: {
1324 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
1325 header: '####',
1326 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
1327 version: '0.2',
1328 creationDate: 'Wed Mar 21 08:29:06 PDT 2007',
1329 updateDate: 'Wed Mar 21 08:29:06 PDT 2007',
1330 accessDate: 'Sun Oct 04 14:05:49 PDT 2009'
1331 },
1332 'a999c255e435e85633f136d0464f29e6d41f87f46e6fb50ca63adeede9a6650a': {
1333 header: '####',
1334 data: 'xw9i2USOB2xkgG3MBp1+qq9e2nwapnEt0usRAVmUWXcGGLbXJi+ImdrFNGPg3TSZrTIXMdEbLmjxAcxpTWlBfd5NhBVDzY2q/stiNaUWfI8JAHdl7E2CQRHa9quVnxPzYytVbUP01xoUokBWKQnqHZduADt7OKcgLy5iheR0ECoFXT6lKcJtD8mV5TZqKlYHkhNR8FehkNrhX2BWfxDHtlxZQNOK6xBCHF9YQGk3PQqmeIAbvxMiN2sGCdH4pXAURHIcF4uayV96bmCa42r+i4h2p46BcNghSR84ipC6Fyh1y+oGyZ5GqaolmVQcZQ5UbCba57+r5OOSWqmpmbhyoZ8rPOa/ZYFiZDj9UqNl7Ny6fB7PqWjVs9oSLb3oLe3oqfrONvJ/WmttA5J/jztDYYN0peN4AAEiNQLnFZuoHp4S+Wxuf0c+99N+I0egIIgIw88+ssowwMY6Xrf6sxEmA7B6hXB5V7TO3J1DGkVr4Kw6NgxMrFVw1AlqNpBrxKdREYaGRmLwB8/jOC9tr2RzP6SPylXzeOk9/v3XikG0CZckPATqLG2otmZ0pVpJc5XwyKKhDAZWYEzPKXXZoLfdNoa4SAiGF7/otBtH8k1D8d2rDMlhigIjtYR8WvBxCdfvnFeD8w0zewymA1Fbj72Dv8eHtnnNYYsJiHldQimSgcaGkmyFr0oVPo/skLjRjBsQVbiE066eTAjqrcAfKK7pg295Mhgo1aU9cyFPfOha1yiM6BKulihLTMbCr2+KTdMGagVnBxKFmfWJBNbl1J/b5ztazo3A4rIOddUPmGj0uQpaOVLDaFIVvs+3d13JB3iyYOz1nAYlOptS0yzNEMlJMDX4F5gkABGFazoPPQ7PgQ5JUmRrO4BBnp4HvJHNY0Ix9LOUfaLcp/533C43fHTcofB0AVqpdnU2R4lPl9FkUsyeQ1vmY3Z7tE0ZNbM3rE1P26LlEfXg9xbSBzRwS5EOxZF2ZJv9h9a8VPPbMnEUt0dZrXhyUycHF4SfnKLmepZkHTnco64kY9Mc0vJzy5gPCF7z6SDzeA35SX2T25Rl6M+xKSeU1vCv5kPWDpacFhXX/aVJnSlgjYKEWzV4jTGdlg2RA+034JpbsJgDTIqdLYdC44EyZwocR7MObXf0OTprugDIM9AGHFlxPda+TO6Cg0mI7UMYEP/D7AU=',
1335 version: '0.3',
1336 previousVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
1337 previousVersionKey: 'tVHT9HgAaAzSOMZrMyvyTvuJW6P6cSGU0lUWky8NCtKipfN1BPGcX3sVgEf/PTXwKlNxTgpogRDGhDMIl01RHPaqAIXY+W4x/u3bdH/c2NTlJg==',
1338 creationDate: 'Sun Oct 04 14:06:08 PDT 2009',
1339 updateDate: 'Sun Oct 04 14:06:08 PDT 2009',
1340 accessDate: 'Sat Oct 24 02:11:33 PDT 2009'
1341 }
1342 }
1343 },
1344 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
1345 data: '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',
1346 version: '0.3',
1347 creationDate: 'Thu Feb 12 03:45:43 PST 2009',
1348 updateDate: 'Thu Feb 12 03:54:37 PST 2009',
1349 accessDate: 'Sat Oct 24 02:11:45 PDT 2009',
1350 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
1351 versions: {
1352 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
1353 header: '####',
1354 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
1355 version: '0.3',
1356 creationDate: 'Thu Feb 12 03:54:37 PST 2009',
1357 updateDate: 'Thu Feb 12 03:54:37 PST 2009',
1358 accessDate: 'Sat Oct 24 02:11:45 PDT 2009'
1359 },
1360 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
1361 header: '####',
1362 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
1363 version: '0.3',
1364 creationDate: 'Thu Feb 12 03:45:43 PST 2009',
1365 updateDate: 'Thu Feb 12 03:45:43 PST 2009',
1366 accessDate: 'Thu Feb 12 03:45:43 PST 2009'
1367 },
1368 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
1369 header: '####',
1370 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
1371 version: '0.3',
1372 creationDate: 'Thu Feb 12 03:47:39 PST 2009',
1373 updateDate: 'Thu Feb 12 03:47:39 PST 2009',
1374 accessDate: 'Thu Feb 12 03:47:39 PST 2009'
1375 }
1376 }
1377 },
1378 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
1379 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
1380 version: '0.2',
1381 creationDate: 'Wed Mar 14 07:51:17 PDT 2007',
1382 updateDate: 'Wed Apr 25 02:14:05 PDT 2007',
1383 accessDate: 'Sat Oct 24 02:11:43 PDT 2009',
1384 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
1385 versions: {
1386 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
1387 header: '####',
1388 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
1389 version: '0.2',
1390 creationDate: 'Wed Mar 14 07:51:17 PDT 2007',
1391 updateDate: 'Wed Mar 14 07:51:17 PDT 2007',
1392 accessDate: 'Wed Apr 25 01:37:27 PDT 2007'
1393 },
1394 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
1395 header: '####',
1396 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
1397 version: '0.2',
1398 creationDate: 'Wed Apr 25 01:39:26 PDT 2007',
1399 updateDate: 'Wed Apr 25 01:39:26 PDT 2007',
1400 accessDate: 'Wed Apr 25 01:39:26 PDT 2007'
1401 },
1402 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
1403 header: '####',
1404 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
1405 version: '0.2',
1406 creationDate: 'Wed Apr 25 02:14:05 PDT 2007',
1407 updateDate: 'Wed Apr 25 02:14:05 PDT 2007',
1408 accessDate: 'Sat Oct 24 02:11:43 PDT 2009'
1409 },
1410 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
1411 header: '####',
1412 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
1413 version: '0.2',
1414 creationDate: 'Wed Apr 25 01:51:49 PDT 2007',
1415 updateDate: 'Wed Apr 25 01:51:49 PDT 2007',
1416 accessDate: 'Wed Apr 25 01:51:49 PDT 2007'
1417 },
1418 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
1419 header: '####',
1420 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
1421 version: '0.2',
1422 creationDate: 'Wed Apr 25 02:01:21 PDT 2007',
1423 updateDate: 'Wed Apr 25 02:01:21 PDT 2007',
1424 accessDate: 'Wed Apr 25 02:01:21 PDT 2007'
1425 },
1426 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
1427 header: '####',
1428 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
1429 version: '0.2',
1430 creationDate: 'Wed Apr 25 01:59:57 PDT 2007',
1431 updateDate: 'Wed Apr 25 01:59:57 PDT 2007',
1432 accessDate: 'Wed Apr 25 01:59:57 PDT 2007'
1433 },
1434 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
1435 header: '####',
1436 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
1437 version: '0.2',
1438 creationDate: 'Wed Apr 25 01:38:17 PDT 2007',
1439 updateDate: 'Wed Apr 25 01:38:17 PDT 2007',
1440 accessDate: 'Wed Apr 25 01:38:17 PDT 2007'
1441 },
1442 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
1443 header: '####',
1444 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
1445 version: '0.2',
1446 creationDate: 'Wed Apr 25 01:56:58 PDT 2007',
1447 updateDate: 'Wed Apr 25 01:56:58 PDT 2007',
1448 accessDate: 'Wed Apr 25 01:56:58 PDT 2007'
1449 },
1450 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
1451 header: '####',
1452 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
1453 version: '0.2',
1454 creationDate: 'Wed Apr 25 01:58:33 PDT 2007',
1455 updateDate: 'Wed Apr 25 01:58:33 PDT 2007',
1456 accessDate: 'Wed Apr 25 01:58:33 PDT 2007'
1457 }
1458 }
1459 },
1460 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
1461 data: '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',
1462 version: '0.2',
1463 creationDate: 'Wed Mar 14 08:06:54 PDT 2007',
1464 updateDate: 'Tue Apr 17 10:23:41 PDT 2007',
1465 accessDate: 'Sat Oct 24 02:11:49 PDT 2009',
1466 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
1467 versions: {
1468 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
1469 header: '####',
1470 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
1471 version: '0.2',
1472 creationDate: 'Wed Mar 14 09:27:40 PDT 2007',
1473 updateDate: 'Wed Mar 14 09:27:40 PDT 2007',
1474 accessDate: 'Wed Mar 14 11:00:21 PDT 2007'
1475 },
1476 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
1477 header: '####',
1478 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
1479 version: '0.2',
1480 creationDate: 'Wed Mar 14 08:09:07 PDT 2007',
1481 updateDate: 'Wed Mar 14 08:09:07 PDT 2007',
1482 accessDate: 'Wed Mar 14 08:39:40 PDT 2007'
1483 },
1484 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
1485 header: '####',
1486 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
1487 version: '0.2',
1488 creationDate: 'Wed Mar 14 11:01:05 PDT 2007',
1489 updateDate: 'Wed Mar 14 11:01:05 PDT 2007',
1490 accessDate: 'Tue Apr 17 10:20:33 PDT 2007'
1491 },
1492 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
1493 header: '####',
1494 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
1495 version: '0.2',
1496 creationDate: 'Wed Mar 14 09:17:20 PDT 2007',
1497 updateDate: 'Wed Mar 14 09:17:20 PDT 2007',
1498 accessDate: 'Wed Mar 14 09:22:06 PDT 2007'
1499 },
1500 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
1501 header: '####',
1502 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
1503 version: '0.2',
1504 creationDate: 'Wed Mar 14 08:06:54 PDT 2007',
1505 updateDate: 'Wed Mar 14 08:06:54 PDT 2007',
1506 accessDate: 'Wed Mar 14 08:06:54 PDT 2007'
1507 },
1508 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
1509 header: '####',
1510 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
1511 version: '0.2',
1512 creationDate: 'Tue Apr 17 10:23:41 PDT 2007',
1513 updateDate: 'Tue Apr 17 10:23:41 PDT 2007',
1514 accessDate: 'Sat Oct 24 02:11:49 PDT 2009'
1515 },
1516 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
1517 header: '####',
1518 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
1519 version: '0.2',
1520 creationDate: 'Tue Apr 17 10:22:08 PDT 2007',
1521 updateDate: 'Tue Apr 17 10:22:08 PDT 2007',
1522 accessDate: 'Tue Apr 17 10:22:08 PDT 2007'
1523 }
1524 }
1525 },
1526 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
1527 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
1528 version: '0.2',
1529 creationDate: 'Wed Mar 14 08:36:20 PDT 2007',
1530 updateDate: 'Mon Jul 09 06:10:15 PDT 2007',
1531 accessDate: 'Sat Oct 24 02:11:17 PDT 2009',
1532 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
1533 versions: {
1534 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
1535 header: '####',
1536 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
1537 version: '0.2',
1538 creationDate: 'Wed Mar 14 08:51:02 PDT 2007',
1539 updateDate: 'Wed Mar 14 08:51:02 PDT 2007',
1540 accessDate: 'Wed Mar 14 08:51:02 PDT 2007'
1541 },
1542 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
1543 header: '####',
1544 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
1545 version: '0.2',
1546 creationDate: 'Mon Jul 09 06:10:15 PDT 2007',
1547 updateDate: 'Mon Jul 09 06:10:15 PDT 2007',
1548 accessDate: 'Sat Oct 24 02:11:17 PDT 2009'
1549 },
1550 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
1551 header: '####',
1552 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
1553 version: '0.2',
1554 creationDate: 'Wed Mar 21 04:56:43 PDT 2007',
1555 updateDate: 'Wed Mar 21 04:56:43 PDT 2007',
1556 accessDate: 'Wed Apr 25 00:59:58 PDT 2007'
1557 },
1558 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
1559 header: '####',
1560 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
1561 version: '0.2',
1562 creationDate: 'Sat May 19 02:26:44 PDT 2007',
1563 updateDate: 'Sat May 19 02:26:44 PDT 2007',
1564 accessDate: 'Mon Jul 09 06:08:39 PDT 2007'
1565 },
1566 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
1567 header: '####',
1568 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
1569 version: '0.2',
1570 creationDate: 'Wed Mar 14 08:38:54 PDT 2007',
1571 updateDate: 'Wed Mar 14 08:38:54 PDT 2007',
1572 accessDate: 'Wed Mar 14 08:38:54 PDT 2007'
1573 },
1574 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
1575 header: '####',
1576 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
1577 version: '0.2',
1578 creationDate: 'Wed Mar 14 08:36:20 PDT 2007',
1579 updateDate: 'Wed Mar 14 08:36:20 PDT 2007',
1580 accessDate: 'Wed Mar 14 08:38:12 PDT 2007'
1581 },
1582 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
1583 header: '####',
1584 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
1585 version: '0.2',
1586 creationDate: 'Wed Apr 25 01:04:29 PDT 2007',
1587 updateDate: 'Wed Apr 25 01:04:29 PDT 2007',
1588 accessDate: 'Sat May 19 02:22:01 PDT 2007'
1589 },
1590 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
1591 header: '####',
1592 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
1593 version: '0.2',
1594 creationDate: 'Wed Mar 14 08:52:12 PDT 2007',
1595 updateDate: 'Wed Mar 14 08:52:12 PDT 2007',
1596 accessDate: 'Wed Mar 21 04:16:29 PDT 2007'
1597 }
1598 }
1599 },
1600 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
1601 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
1602 version: '0.2',
1603 creationDate: 'Wed Mar 14 08:20:58 PDT 2007',
1604 updateDate: 'Wed Mar 14 08:47:01 PDT 2007',
1605 accessDate: 'Sat Oct 24 02:11:38 PDT 2009',
1606 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
1607 versions: {
1608 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
1609 header: '####',
1610 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
1611 version: '0.2',
1612 creationDate: 'Wed Mar 14 08:45:40 PDT 2007',
1613 updateDate: 'Wed Mar 14 08:45:40 PDT 2007',
1614 accessDate: 'Wed Mar 14 08:45:40 PDT 2007'
1615 },
1616 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
1617 header: '####',
1618 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
1619 version: '0.2',
1620 creationDate: 'Wed Mar 14 08:47:01 PDT 2007',
1621 updateDate: 'Wed Mar 14 08:47:01 PDT 2007',
1622 accessDate: 'Sat Oct 24 02:11:38 PDT 2009'
1623 },
1624 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
1625 header: '####',
1626 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
1627 version: '0.2',
1628 creationDate: 'Wed Mar 14 08:20:58 PDT 2007',
1629 updateDate: 'Wed Mar 14 08:20:58 PDT 2007',
1630 accessDate: 'Wed Mar 14 08:43:46 PDT 2007'
1631 }
1632 }
1633 },
1634 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
1635 data: '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',
1636 version: '0.2',
1637 creationDate: 'Wed Mar 14 05:35:58 PDT 2007',
1638 updateDate: 'Thu May 10 06:01:21 PDT 2007',
1639 accessDate: 'Sat Oct 24 02:11:31 PDT 2009',
1640 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
1641 versions: {
1642 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
1643 header: '####',
1644 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
1645 version: '0.2',
1646 creationDate: 'Wed Mar 14 05:35:58 PDT 2007',
1647 updateDate: 'Wed Mar 14 05:35:58 PDT 2007',
1648 accessDate: 'Wed Mar 14 05:35:58 PDT 2007'
1649 },
1650 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
1651 header: '####',
1652 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
1653 version: '0.2',
1654 creationDate: 'Wed Mar 14 11:24:49 PDT 2007',
1655 updateDate: 'Wed Mar 14 11:24:49 PDT 2007',
1656 accessDate: 'Wed Mar 14 11:24:49 PDT 2007'
1657 },
1658 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
1659 header: '####',
1660 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
1661 version: '0.2',
1662 creationDate: 'Wed Mar 14 09:41:15 PDT 2007',
1663 updateDate: 'Wed Mar 14 09:41:15 PDT 2007',
1664 accessDate: 'Wed Mar 14 09:41:15 PDT 2007'
1665 },
1666 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
1667 header: '####',
1668 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
1669 version: '0.2',
1670 creationDate: 'Wed Mar 14 11:25:28 PDT 2007',
1671 updateDate: 'Wed Mar 14 11:25:28 PDT 2007',
1672 accessDate: 'Thu May 10 06:00:47 PDT 2007'
1673 },
1674 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
1675 header: '####',
1676 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
1677 version: '0.2',
1678 creationDate: 'Wed Mar 14 06:46:36 PDT 2007',
1679 updateDate: 'Wed Mar 14 06:46:36 PDT 2007',
1680 accessDate: 'Wed Mar 14 09:40:01 PDT 2007'
1681 },
1682 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
1683 header: '####',
1684 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
1685 version: '0.2',
1686 creationDate: 'Thu May 10 06:01:21 PDT 2007',
1687 updateDate: 'Thu May 10 06:01:21 PDT 2007',
1688 accessDate: 'Sat Oct 24 02:11:31 PDT 2009'
1689 },
1690 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
1691 header: '####',
1692 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
1693 version: '0.2',
1694 creationDate: 'Wed Mar 14 09:43:29 PDT 2007',
1695 updateDate: 'Wed Mar 14 09:43:29 PDT 2007',
1696 accessDate: 'Wed Mar 14 11:23:51 PDT 2007'
1697 }
1698 }
1699 },
1700 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
1701 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
1702 version: '0.3',
1703 creationDate: 'Wed Mar 14 09:39:39 PDT 2007',
1704 updateDate: 'Wed Feb 13 06:29:04 PST 2008',
1705 accessDate: 'Sat Oct 24 02:11:28 PDT 2009',
1706 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
1707 versions: {
1708 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
1709 header: '####',
1710 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
1711 version: '0.2',
1712 creationDate: 'Wed Mar 14 09:39:39 PDT 2007',
1713 updateDate: 'Wed Mar 14 09:39:39 PDT 2007',
1714 accessDate: 'Tue Apr 17 10:09:44 PDT 2007'
1715 },
1716 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
1717 header: '####',
1718 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
1719 version: '0.2',
1720 creationDate: 'Tue Apr 17 10:12:39 PDT 2007',
1721 updateDate: 'Tue Apr 17 10:12:39 PDT 2007',
1722 accessDate: 'Wed Feb 13 06:27:04 PST 2008'
1723 },
1724 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
1725 header: '####',
1726 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
1727 version: '0.3',
1728 creationDate: 'Wed Feb 13 06:29:04 PST 2008',
1729 updateDate: 'Wed Feb 13 06:29:04 PST 2008',
1730 accessDate: 'Sat Oct 24 02:11:28 PDT 2009'
1731 },
1732 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
1733 header: '####',
1734 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
1735 version: '0.3',
1736 creationDate: 'Wed Feb 13 06:28:28 PST 2008',
1737 updateDate: 'Wed Feb 13 06:28:28 PST 2008',
1738 accessDate: 'Wed Feb 13 06:28:28 PST 2008'
1739 },
1740 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
1741 header: '####',
1742 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
1743 version: '0.2',
1744 creationDate: 'Tue Apr 17 10:11:33 PDT 2007',
1745 updateDate: 'Tue Apr 17 10:11:33 PDT 2007',
1746 accessDate: 'Tue Apr 17 10:11:33 PDT 2007'
1747 }
1748 }
1749 },
1750 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
1751 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
1752 version: '0.2',
1753 creationDate: 'Wed Mar 14 10:43:29 PDT 2007',
1754 updateDate: 'Wed Mar 14 10:43:29 PDT 2007',
1755 accessDate: 'Sat Oct 24 02:11:19 PDT 2009',
1756 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
1757 versions: {
1758 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
1759 header: '####',
1760 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
1761 version: '0.2',
1762 creationDate: 'Wed Mar 14 10:43:29 PDT 2007',
1763 updateDate: 'Wed Mar 14 10:43:29 PDT 2007',
1764 accessDate: 'Sat Oct 24 02:11:19 PDT 2009'
1765 }
1766 }
1767 }
1768 }
1769 }
1770 }
1771
1772
1773
1774 },
1775
1776 //-------------------------------------------------------------------------
1777
1778 'test_test_offline_copy_data': {
1779 users:{
1780 'catchAllUser': {
1781 __masterkey_test_value__: 'masterkey',
1782 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
1783 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
1784 },
1785 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
1786 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
1787 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
1788 version: '0.2',
1789 maxNumberOfRecords: '100',
1790 userDetails: '{"records":{"index":{"8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13":"0"},"data":"Ki9chN/ker5c+7zB5NinstllVq1Vs+N5pezZIohKVVa15VLSIyre3DRilRoldy/94LbGaEM3SZsMlf28hYbWySln3ekNMIB+MItaYb8urw+8U6n8+QaRMAClHXukfi8te2d1OIlgjbrBQNMmzBorjIs="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"YgSYIsDeVT87bfiASQqXA2E9"},"version":"0.1"}',
1791 statistics: '6Kupec1ZD7Dw0WzK7pPesnLE',
1792 userDetailsVersion: '0.3',
1793 records: {
1794 '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13': {
1795 data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
1796 // data: 'bXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
1797 version: '0.3',
1798 creationDate: 'Tue May 05 01:28:36 PDT 2009',
1799 updateDate: 'Tue May 05 01:28:36 PDT 2009',
1800 accessDate: 'Tue May 05 01:28:36 PDT 2009',
1801 currentVersion: 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d',
1802 versions: {
1803 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d': {
1804 header: '####',
1805 data: 'Pc18C1A9NwNlecbOtOOAEymNZD5oq20ZvPqMfiCyNhkcmaN9sEnifF31epZSjpDw4XM4ex3HFhhITttXlCrossDVYB8z00k6XsFruCkdwFRmBjb2PdrdZFAkGQeS/8xTarYWgiflkfGocGqVm6EUq1gh8QLE173Jzo15LOSuzuSS90BTMvcsqzzRrIEe+9jwF9/ehLyQ5yYxNImFGQQ2jkW0KiZsjyEbQAGry7B1/AiSUBaGYHYzcB3bFgXnzC3ecPwL+ENZ+azpTd143WneuVMUJrWNp3S+9ZRzboRzcYV6Ax3nOLPS7LTc+e9j9s4CrPvc1L6pG23AzNByDWst0JrqhN37yp67EVVrFQfUDWcKgZyyA/M82q1TVScx+I4A+g9ASC+PdQ3+M5+EOtEfClkgYJFqzXqwPKYwBv4CBKxikS2Vt8x40271kjmVYyGQOIRTo1UKn6u07TS5hxdEgEI+WdukG52813USiD8bQFbN0r4VhjFSqKMAJoItjqvafBNBl+OXYQ1p1zRCXP7wHS4/F7mvrK98gSuIsBgfL+/q9rExXaxIZJNSbs1HGAXR1TxYSvyKZvLa',
1806 version: '0.3',
1807 creationDate: 'Tue May 05 01:28:36 PDT 2009',
1808 updateDate: 'Tue May 05 01:28:36 PDT 2009',
1809 accessDate: 'Tue May 05 01:28:36 PDT 2009'
1810 }
1811 }
1812 }
1813 }
1814 }
1815 }
1816 },
1817
1818 //-------------------------------------------------------------------------
1819
1820 'test_test_offline_copy_data_withExtraVersion': {
1821 users:{
1822 'catchAllUser': {
1823 __masterkey_test_value__: 'masterkey',
1824 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
1825 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
1826 },
1827 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
1828 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
1829 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
1830 version: '0.2',
1831 maxNumberOfRecords: '100',
1832 userDetails: '{"records":{"index":{"75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53":"0"},"data":"YjlNzXUO9m0EXdi5fUguA6RjR5jc2mwuHkpMsHAheExR2zpoV6OJx8tBTdUGqDBAlbIn6xUx2TT+dzgjic/XubgKNsv6JpTvnfiW6ZMWiebKXVigoZw7L5EvmcHjVLI8aoIhVEj4ADwkh9qHm0Kt1zFGQPwwJfo="},"directLogins":{"index":{},"data":"4W5csD8DxlxeXVRROk7wVbXi"},"preferences":{"data":"/DjOoFcgquxUbW5ye2LrpsKM"},"oneTimePasswords":{"data":"DEqkd74lLAGtG4YKRPniBNBU"},"version":"0.1"}',
1833 statistics: 'EkRr9wEXi/WOlZfCXphn9kfx',
1834 userDetailsVersion: '0.3',
1835 records: {
1836 '75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53': {
1837 data: '/gtNfde5l2J9eeg+rlBHZtqO4RDaWNQwaMEluOVowKdUlGAYjo9FU0NwKsA9CM3ST4sTYl0mylP3C/AGybO8/9sTCkEn20wi0slharA61Rk8uB2lNjCICZB4l3ZGvD4AHKucu8YQzxpWop5dTN8f4us5eJ2VjvJPLqUzSKZL4g+6MiKbjQ==',
1838 version: '0.3',
1839 creationDate: 'Tue May 05 18:47:53 CEST 2009',
1840 updateDate: 'Tue May 05 18:48:59 CEST 2009',
1841 accessDate: 'Tue May 05 18:48:59 CEST 2009',
1842 currentVersion: '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b',
1843 versions: {
1844 '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564': {
1845 header: '####',
1846 data: 'MZGx+tQAecxJNl6UbWHIM8g416Qa8DfWtGo7f2vLkPBbhsr20xnZ233oPqIGceG5/6WMssQd9c8U81urISK+4Ar8zHGUxTdIYLZaDq33Q0uF5vO7OsaBcjL7m+tX7zB+e/eu0ABbqvt+saMsZKKSdIZv2KNbAg5VTiL7GjWuowM23tWgiUBgX3eO5fnUUQWVkBygk0qy2O45oNfb1XcbsGMCfS4YPF9GB/wGSQKG8keMoy1ZWZh4nG+Pdx2ymIrYKLv8T+i7jtWEbyhvEglb7TadCMBBF0pnkYvG3F29skWooZC92dy5213o+3/uSKi0od5tAbvSYZHjT5hDulUtmjRFGq4ZRERLqvrZs9Sg8G2mjtf8Ta99Hob8WLxyGF9x7s1LcLPERtdsP9qCD+I0WtwrDiodl/sPQ/5s3G2S+M/YejKXBvG3AWwoO1gkdhec3+d3meFNvCr0hKNzotrHmDLC4tGyZIaAcBmPQ8xSD5KmNJJFU+V0QIdiEYKnPjo95oSmKyK1UtIoPrWCahfYSKXh+aW53XnzY4JKHRER9vWwdJzz',
1847 version: '0.3',
1848 creationDate: 'Tue May 05 18:47:53 CEST 2009',
1849 updateDate: 'Tue May 05 18:47:53 CEST 2009',
1850 accessDate: 'Tue May 05 18:47:53 CEST 2009'
1851 },
1852 '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7': {
1853 header: '####',
1854 data: 'Y38v4jhKwcsW8LDTigIhtdLJ2zgv+1rSutqyu0AilBQeSTe4D0rnapZZTW/mNnD5IGpWKFoEl8+WGj1zvGzleNdkOa08nWJEYDNe2h0+FjBSHBUAgH5fraezomRWzJ/Z5HHFiZuFfpjt2BHd0Y3Not6AuL3aBgjjkEai90r2o59Xr70maUwo1UqmtVg3gvX067MC3hlqhNIp390J8LFiSj8Z4US9x/WzVR5Xx069+0PFMBwipq9WJPrcfTPwvP6xVa+J8BCJk3HtboRutq1ZhhHpibm+TY3Xl3gFTTCHWDZCSJ4Rm1dWkyqpx51u/AVg2TC+ljFLKv7hq3euVZNMLNMY2BqoCkcb+w6dFLDs3WfPAW0aQN2P++GFa/eVpN90YxAeXufjsXKaArTMjGWKiHqyU1iVVI8N1QEiFYjjBV1GvkJxog5PjtAzJF++qwHDIa+gJ+NnOfenVF0wIRMCEnpGyvbg3SkUoenKFoHO0IcSP2CW2RWV/GAmiEZEuVD393mKi5B6fpjdO9JVPNyz0i0kW++dtzInwPnglhOAY1ywT0ExOBLIEr8=',
1855 version: '0.3',
1856 previousVersion: '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564',
1857 previousVersionKey: 'f45/Sx3jMC8CgdT8cjfcC4ApA8xMXABFO48jiTh5VjJfTlVqw3NnHRO2KDBIhy0znPvP2AKlpKQHruW8LQno7YLyhEIXh4ChjMUjJsFFwB/LUg==',
1858 creationDate: 'Tue May 05 18:48:11 CEST 2009',
1859 updateDate: 'Tue May 05 18:48:11 CEST 2009',
1860 accessDate: 'Tue May 05 18:48:11 CEST 2009'
1861 },
1862 '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b': {
1863 header: '####',
1864 data: 'tkiW41JHOfbYOt2KHx1HtDJEzxbfVS1Y2HJQqdQZ73zhvxnkWLw/X6FMiBexLeoKXO1H9NIWS884MzEO782vg8QRxTizg66Yye+q1Hox+QsaEoaD4UQ54XV1duTOB/XS5P0P9DFvtIz9msEu8GJrvizAdxu/7FG2b5XfENDkwqIzydI7JMfGC0JzDnfGvYkWqoL8jx3Joxa7TNqN4he4v771Ho1ZoUv3Pp7ZGwBU+btl6Q9mcycSf5KXdTw+6nDjfQh8qyts/u7O5xPFh2Yn8zS48x95I4SA4yFKtERU3pLAxIkcZWVb17xT8xlbPESreZ0RyYSR0CgW0wPMxkLHH1uqWycTa7yIxUhyn+JK9jCl4eDa/KUSGbN1yb6pOyjGuev1vHEZv3bOmO52RVVIdMHTe3LezCKY8xpDqtQKSfAvFg1TmabugXePXB+KvPbDDWI5otDEIwLYhDFcSn2FyqUEATSzeU2o1uXO+ffbU3QBrwr27tsreughWSP7905FQbEEshsRUc2Xt92WhTnVM6W74Y0bMLWjTrXbu+hNsjtFYYN6gtezcltnB58MVw==',
1865 version: '0.3',
1866 previousVersion: '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7',
1867 previousVersionKey: 'XtJ8Ub99GXIkxErIPr0HaIrRqlAO0Naa/tPwUA51K2D5R6R3CR6QbHd3GpkCnu+y+bcEIRYrQqgabi3LROYT+1SZ9B9FctX6FyaTjYEazFdCvg==',
1868 creationDate: 'Tue May 05 18:48:59 CEST 2009',
1869 updateDate: 'Tue May 05 18:48:59 CEST 2009',
1870 accessDate: 'Tue May 05 18:48:59 CEST 2009'
1871 }
1872 }
1873 }
1874 }
1875 }
1876 }
1877 },
1878
1879 //-------------------------------------------------------------------------
1880 'syntaxFix': ""
1881}
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js
new file mode 100644
index 0000000..e805e34
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js
@@ -0,0 +1,128 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.DragAndDrop');
30
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup();
33
34Clipperz.Tests.DragAndDrop.Tester = function(args) {
35 args = args || {};
36
37 Clipperz.Tests.DragAndDrop.Tester.superclass.constructor.call(this, args);
38 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39
40 return this;
41};
42
43Clipperz.Base.extend(Clipperz.Tests.DragAndDrop.Tester, Object, {
44
45 'toString': function() {
46 return "Clipperz.Tests.DragAndDrop.Tester";
47 },
48
49 //-------------------------------------------------------------------------
50
51 'user': function () {
52 return this._user;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'run': function () {
58 var deferredResult;
59 var proxy;
60 varcardDialogController;
61 varcardDialogComponent;
62
63 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
64
65 deferredResult = new Clipperz.Async.Deferred("DragAndDrop_test.init", {trace:false});
66 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
67 deferredResult.addMethod(this.user(), 'login');
68 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
69 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
70 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
71 cardDialogController.run();
72
73 cardDialogController.showPasswordTooltip('**********', MochiKit.DOM.getElement('Clipperz_PM_Components_actionLink_63'));
74 }, this));
75 deferredResult.callback();
76
77 return deferredResult;
78 },
79
80 //=========================================================================
81
82 'saveChanges': function () {
83 return this.user().saveChanges();
84 },
85
86 //-------------------------------------------------------------------------
87
88 'hasPendingChanges': function () {
89 return this.user().hasPendingChanges();
90 },
91
92 //-------------------------------------------------------------------------
93
94 'revertChanges': function () {
95 return this.user().revertChanges();
96 },
97
98 //=========================================================================
99 __syntaxFix__: "syntax fix"
100});
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121init = function () {
122 vartester;
123
124 tester = new Clipperz.Tests.DragAndDrop.Tester();
125 tester.run();
126};
127
128MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html b/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html
new file mode 100644
index 0000000..7cc0961
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html
@@ -0,0 +1,133 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Card Dialog EDITING - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
78 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
85
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
95
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script>
105
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
109
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
112
113 <script type='text/javascript' src='./User.data.js'></script>
114 <script type='text/javascript' src='./CardDialogEditing_test.js'></script>
115<script>
116 Clipperz_IEisBroken = false;
117</script>
118
119<!--[if IE]><script>
120Clipperz_IEisBroken = true;
121</script><![endif]-->
122
123 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
124 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
125 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
126
127</head>
128<body>
129
130<div id="tableWrapper"></div>
131
132</body>
133</html>
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js b/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js
new file mode 100644
index 0000000..dac8b45
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js
@@ -0,0 +1,977 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29testData = {
30
31 //-------------------------------------------------------------------------
32
33 'simpleLogin_001': {
34 'users': [
35 {
36 'username': "joe",
37 'passphrase': "eoj",
38 'version': "0.2",
39 'connectionVersion':"0.2",
40 'records':{
41 'record 1': {
42 'notes':"Some notes here",
43 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"}
46 ],
47 'directLogins':{
48 "record 1 direct login": {
49 'configuration':"",
50 'bindings':[
51 ],
52 'favicon':"http://www.example.com/favicon.ico"
53 }
54 }
55 }
56 },
57 'otp':[
58 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321"
60 ]
61 }
62 ]
63 },
64
65 //-------------------------------------------------------------------------
66
67 'joe_clipperz_offline_copy_data': {
68 users:{
69 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2',
78 maxNumberOfRecords: '100',
79 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"jufmL1KVY0YBl8MSaL413hGtw12I/+sFnumcfeVku9RRMBmXaXCfE/vYnraxZyPxJxVS3qFRWDKsSGR3pScdACSwlBD+mzjifRn2SCfXWutD1/oJiqiMvq3YFzwyZJiXx+oS5u8DOTieQT9HZYt0pUmAod9QHiq2NAkueVjvRkZI1saRlWGtNXCaJIHwpuFJpHBDSD//6D9DYeTdVUeFEbej+4oNYpBCkyE1G2OL6q50YRBYp9yARRiy9juKHRWFvZiSeMGEJQS0f2gaP+xZkb9Z4qrfDgAZ1F7oDbPksr2SOYlSsm0bqa6c+7Wtopdo63Urf7Ze3Wg9n8TGBk6H88boseR8e3sHudlmtO1oLxcB9p3z/NTceF6SvWyJWTxHeMe6O72dZVmSnZlXhD/IJamRt13HLk3g05d8oXfrXM3iMhIGQ+EsXMxZfKdXlZpyYtjWD5tcQTKz7M5Qo3SFmdkwDu4jH5ke+bD8CeluDcMaHF6KHfdV8nEsmsjGwrH6lqSCT/9kBO5ETqUJKloOhJpFpNS/EN7nxjXF/QbqnUmWV4wngdyYmk9goNZNfZv7C2ouiyys55/QEfGsIsvEPPSfO670oJuncTyfFngFj2tdh2JpJ5vytuoRNLOm7XPM3hDCvZCOpUnjbm+jt4AvdOGU7ID8a2mtZFjb2noP5emAxTg6MO6f3+44eTkUcbCDskO5fe6jd0pTdODk21Ilp7WUjFwxEdJG8tRrGYpLooProJExamL7WShm/S/nhJL4+euW+1UIDjcZJA+a7aGdMSC63qBvrEsNyf57SDBk/o2eNJHs2sndCzgvK42IKGKcipq9D1Gyos9JQsA3My9ARMt68V/5FfzOkgPO6mblOsQMoTyQj/OCLzITEBfqA5IufhljSEkD3CLkfkeVwVf1NB2SsTPXJFChnynfsK7cMFy0O2XBNByCRTQDqBDBYo673tI1KTGnT4gLSAwCt96lq8UkEdt51jjkAJcvBXkbswuw3hvhtzLJ302hkN9CIHJrEN0oss5mWlxIxYrCyqE3ABME3FCR9r+V7exuIaQn6mdJTkMcRbYmVQQkexsROh2cdx8I/tuMN4ECWEAL948k9vEPZfgaQirWnrTtHoxLzNAUBDSQfzYXd8yr0T4vAHLnXaUalWPgLamJJ3eR+LDFcDQVvFkaomsF3RpOIS5fswTBFuRKGKEBSIINc9AyC4DtkSmDMTF2S0TgpnGdK94ZS8C/PM8WEsX738echa5qZG5qG0f+koOUUrbaORcDqaktCuDmsgFTYiUv1JxFskTvS/t/EM2Y0MEKVLZBsoG+4WXz4XEE0VJFoI9glaYll96WH/iMbaVXRnDwjyE62CAk/8DXIf//MJQVyO6ElFsvCrDfH03yLpCJhqwHv+mD5sRctVaq6Cp5Ts3bzdFeiLCX9rhSaqdG5AuMk4dCInlywxrsOvBfNaDBjX7NGCULri6px2T53FNiH6ineVjr9TfgY2uoMyevLiQsGd3GHS4wnxiUfIyz7/Yav5an4o82cHhMVOLvfKwF8C2dJQDg9woJ3ju1ha66UA2XGScJVd93w3OWco78+giXBE96R3CebxgaWQ5Zif6nI+FJnw6OipaRgd7EyrLrQTWadvTiYLfDknlsxFZd4XVs33/3xxF3RyoVsIFO7cpEX/BLVB69v+1TJvLdiyGwSl5FUKbrcrXycZ67uTKtHyAI/vrzwwoQxYV8e32xW86blEjH4pq/Zrijm1wGw7IrD9fYVgEO7nnWpE/ac85LrDaJpGOdZ+slcVWM6THHR9boKJGLtuc8V81gDVNtZ/f4Hx5YXZWKIIfpe57BybWejdQ8ZACWK+mXOGczyXJ88B4nIvaKnRlhSszQryAZzSqJry2k3t1v73BzL48TZWJ6yu1rFmqAUk2V5DCA4XnyHfPuiG8hZfTuu1YXQ+iBgbyDipTwozQqyTv3SxLBPTFxKZLuabMn7ZTo/kLXGfVO/2va58bv6kzW6WjwZ0D481N1Nyd1kZUw1lyxXklcAzZqaHUiIsy+/5DgV/qULYFqEBMNMA7QvBfRN4VZRlnNiemgzkBQXj+JGJOWZMz5cvss291rj1fAe91s10nkZoaddDrvfgfjTq6n9XLSyGSmnrIDMLVc9+YuDtuaQ4gwuiLG2X57Jzrc/Xy7jdZ82G1j+cfT/8Pvb40i1K9aid0Z3xl/tm7jBAqQ91Ehkbo6c8jUVPaQsRcfTumtsNf+Xa5PJmQtEGEPCUlGN6F7eFB5eOLXQFdsLRL1x+SzhS7k3aDri9sTMwYQij26AexwwzAPqcOOkkfbYf0lov5Gxx0LhsZAetDZCRFlxjDRDS8jE8dKBBXkWFazF8K2rdQXKNlclwezCEDBwUWhoJs/H5ndJ38MpSPfKo1YsVvlxi4QFyOTDPJIstCCvYnCjj1r7SrkRrbcuevITRTxD4FKgPCdsYFlGfhS1zWb23DWYWo6fPQ1/zlnN01gZStxsZKepB3NnxbTSjBgTSmzG6RzZajv6BtqivtvOa1hI2KZQtVGCDU2+NGmfbJ5TTJehYiTEPeBF9TfLRP9rktQTUngj2ohv+1TDL0jL3YWiSA9TJzYonsincEVy1aRUeGVazWF2Rrq2o4hCBp12BfuMGHOdVkg9rMXdusyl2y75YyEkcBNMz4zi8i1lVhjUg16rCR48uKJ9QO2KBbjoGTx13uxIXTR8ufXx6mW7iW3qVx+6k7BQGKlMo1G64O8HQ2UrboS/tCqlP0W+7XB2C3EaZMqfKeYcuzM4MLkM6CT2GKYmJPyevXLKE749BM8zRQUcrWieAxmyD+g0QQ4T1fl0RTNEFB1/0BIg3fQQHCLGUTahXwt0EluG9iNPVgmFwwBHybH6gmIEZ4xnD8I7QPwgYY3JF407NdLkHjOuXrP+GODGEvX49MMaUigUUO2fkdw9EJbaidhx6j1EsFpQrz4Lt/5sAu5c9B/365TXtnNnmaPkaFj1q+3ezVXUroimRqxZ9BMaTm7J1hjubO+Dxjb2QlR/UApvQ0ty8aZpmIrMi0xjfoodIMiH6IYdw3VRZSqup7irWWpnJhef2qqtcpoxdiYZaFyf5u2XpZqEnAJpTupqOg+qJN/7aQt6ZmP7POFPwUwzwAsfTYk2EwMlTVAXrawZZEYu2JZ4kIjazo1LgyuuWTieEuONnye8Hr9p70RjwWUdlErlPSCKKn6JRdsM2no13F3151cfgx8I02J9vDuiNa3vfJfmRnBOly5jq6Wlnm2rJN6YYQHwbikoq3lJvkX5ZANDRKFlMWKK42+fXLBuofAZShFt6xvlY384aYsv3EcR42GOLrgYPQy0a7lr/FS4mM2ErNwNYnCz/xTuPBjgXXplbAnyA3jpKdPN1EfUM1oA4kZjECmkXZOuyEQxrndS9eOGbPM6S131zpdWEw9dWSZdkSI34+OkLfAKf6W6z4G4Z+cMRrkYLHs+BavJOum4XTjyyXHIKhQiqz9mgEf+ulodXi+LNsbq1eCcGPWrGg+GNwN1SjJHZm78gidyrlEF6xuPCaZRvGQtk59nuJULOZWkC3Ns/EcFiAql8cu37Lp842fsHHeCVOq0e8ZII4TPg9HKPwDD4HLSg4frBzyeZwK0nN30C5ATCxWdL4Q60cKtZyIEM7Kn1a/vifsAbe019Ui3ovTOCYiTCAdOLaAL/NdpgWA/fDNOsTlPvnEYkq+4+bV3Wyye9ddxICD4TnC2yvXvjw4C/WnYYceJy5R4KamIJueEGIHGp22/0DSF3H4ji3QoUDiFB/H+CA8A2q9LO9q0NYcf2P5q2MfdJGu4bd49g68mltj35pRnGQaafflXY9VmMfrlAbBYfUnsKOb3DOUpq8asveE41/6WkGcXFIuSABcbBf0cHIfBn41wRWQhoCm/JL8pfqEZC/paBdFBRW4FjKkxhbg4BPvBL0aQyGGkU8eH8tr8nm4YN1HMFF/s3s8+9FPoBxPuXLoGSg7Rvdz+g=="},"version":"0.1"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3',
82 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
85 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
87 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
88 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 }
99 }
100 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
103 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
105 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
106 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
114 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
115 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
116 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
122 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
123 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
124 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
130 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
131 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
132 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####',
135 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
136 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
138 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
139 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
140 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####',
143 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
144 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
146 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
147 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
148 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
154 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
155 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
156 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
162 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
163 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
164 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
170 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
171 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
172 }
173 }
174 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '0/BjzyY6jeh71hwgASQphLMgnLz6WJJPg7sDskLKo5gCumpebgHBPqN0OPyHqTq4Lyt7Um++ckx2VA4yoX4cojXC7FBnscHtN18RlVNRvkfhhFPWBZhFwuVZxlFNb/IueDSjKR3dJahbTqao2AU3HXp0xOdsO5Mb2CfMz1/C4rtDuv5ee7GJNEv2hb2tBTzxbB8PZ/TKYZhlfgV3rJ2Hc509OeX/PuD8oYB7sUnB9UhDZP7pVY0Vz3LP/dFUf1cPGFh7bnxxYNphpJ2SxhIUdgxpmP6UCFxdLbCBXv13+7OlhCaO2eGfsO4Qch996otkSrVxfTvOTLuwiwSqU7hLlvOSzm9in69Rf35ZC7bKcZIdZkTNPeV0a+dR6j3LY7dBvIzd08OtBSqOdQqo/6isG8vaQPLVcWkFFZ//iHGgjTIduSoyzMb/y9cr8J1Qj1uTayUVAHQywCYdKgT4UccLoyt96vKHRcPCw6iepEfSrc3aZOtTg/aS3j2CGTih0i0gfrA4EbeQtIfobthsbTF6Oq5xjrIAMv2LRiJ+8JPj6xw8ODvM8SUN/3UxlYKsqDpWOW4tOztQAMSijoGtBswIl+mLr2p50Cul4n8ENfrilyAX4AcxUFSbH6tVd19ErQLsj+T2H5qhIF0Ifo5NxL9bj+Gx/5ul6dGH6Et9dvaHv+CZ3FKc7wrvItd6GXexc0SC16VfEOUps8yBahEHvNYAo/r5UG+wDCMhstHzEjiSV7TJ5ozjf+C2N+5A81TpJS+zfXhuiyupburyjYX8KQfXSvc28FG9CsgD9u9NcUuqC8L0K6MTB7k8RPSrG9xcBowqFDaH3/afLBsKWHEx87TiaZ7GbxKKmiINJk833pNZMYt36dr0fT0AH6WkvD4iSIWcFjvAHrW0CUBjOkhooAxjLDwNS4xBcgL0uGf61ygYBUH9zV+JqC3pullYzc7gL6Z1uKTdB9+Rzq/1NfZGUjVrsIepYO6k3Jf2j77qRNofSVtLr7VudUv297mIypV4jFNG/RoPFtQ2WSbHZIYIVepPCqWkQQ3VaaBZd8NToEYPjeSP7FQCrIjDtH5JVc649wgkEHdLS/q/lsToyCQh/47fiaEU/OJUX6UrzLG50J8+b+ijzIE3A3hZJf6nBnUbcUsEN1WzNHama57tMsWCUoxfcsZjEeSk8CzUjEFvxToKpESwRX7jDS7uWyRjuIHE56nuy7Rhzy7kP3hjE7eZQGMA7h3yxItDxa0hjvUO46IjZpmfyLIftSd323J9K7y9x3q0OGs6cNMNll+M8eSwHgooJbAGYjftIYVQ7t3l19LKEpnemXuObFFJQMvu6KQFRkHS3A2OROzC7hy3w5nSZP9Nqvygvc8Nj5x2IlHlK+pZeQi9E9WU6mGKIPzAOjSZg1FRLULUmahWgXGvJVIoVbHL1WX0/+g1BVsVcEZEAviRczTaFYVrH3zUIb0hql9p5EmHXwINnWMpbL1oh2LEsOUIpRCzjeBX1om6QCwyrXKzE5WkKcsQ7WbVvJf2q8Vdj3r3I8D9Kr+a7QqnAKm1GdwS+e5PcapxDzyhIAw0AsrOyWpIHFKvoJGl9/CWiD6Q+WxLDjG/KC3ms5P6hxY2Oxyakmmp0JGMtSIpOIV4cUyxfnFQ0LVX+vcrM9DpwZNHYLfyEVgg68xpLkUhUSHqYQhHgMe9oyFrzjmnU+EAzBY2vn7ZRrzxEowFipZpmlxFb81V9KRLT2l+3sUZ2yym7Y81HNdY4u1NKw2a3kwNryk0lID5FlbqvswxDJ60aWKFl2jrRW+EUoAX0mmGLk4lw1TYMKimngJap2ukwFky5/yn5KwCq4GjTkxzD35A52hFbDq5juINpyuFKb5X6sTkzxmIQ6d+1ePO6+kkN5RrZwjM2022BDoKJ95OyaR6kqUsIikDrgxHQUD6LR/2RMZapGa0B9klNlPm2phmQtAy3HLWfByXxRTHv7CP0keJl0f43LCHx/XPglb+QCs7mkgBIlp55xWugdKiBgMxzBkpjYWIXaaRkJcFrd8VmAwrXuRBvxVFzXh9/jHxuUMYv4WPaNX0SIhiNzaJsQCj5GRc4ftGD6Ot5rOaYjOxVM4yiFRzJMCgjCJPkL8EkU4l3M0GP3udgCfVqoHVFAAKmgdHB4o+hR4F8JA8U9+OCAMdZ+U0TL0oCcZPvQqVKi0b+5dePa8xTLYzOAuO7KF2TvKIujYqkumvg3zauUxxq7Ncklv+ddruQd3KAJ+H7rB9+g/6mTUpdyhNs91BD+QO0q3AYqmtTjSb6eJ2cmz7h6hA4xdg1Pel/sn+B3dePy7BVXLe/G2p5W34L0ZItuAJlIUo8JqE7IJ+BDJ2HPHMT4t/QIde6A76LDvKzalpZ5k5DXwnwGIj4DUdMXgYB8GdtTAhusOraNCNXTCyqU+EchYrO6o9UOURzd8wWj49jce/XROvWtKBuVbAXDNZzcIR8ALmpNTJKv0fz2Y/9/yxxvKN1dpBkLj+MpAw2++NEyylGhMC5C5f5m8pBApYziN84s4O3JQ3khW/1UttQl4=',
177 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
179 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
180 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
188 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
189 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
190 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
196 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
197 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
198 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
204 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
205 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
206 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
212 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
213 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
214 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
220 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
221 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
222 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
228 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
229 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
230 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
236 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
237 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
238 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
244 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
245 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
246 }
247 }
248 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
253 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
254 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
262 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
263 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
264 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
270 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
271 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
272 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
278 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
279 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
280 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
286 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
287 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
288 }
289 }
290 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
293 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
295 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
296 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
304 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
305 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
306 }
307 }
308 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
313 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
314 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
322 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
323 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
324 }
325 }
326 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
331 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
332 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
340 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
341 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
342 }
343 }
344 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
349 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
350 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
358 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
359 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
360 }
361 }
362 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
365 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
367 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
368 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
376 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
377 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
378 }
379 }
380 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
385 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
386 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
394 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
395 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
396 }
397 }
398 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 CEST 2007',
403 updateDate: 'Tue May 01 01:13:27 CEST 2007',
404 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####',
409 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
410 version: '0.2',
411 creationDate: 'Tue May 01 01:10:17 CEST 2007',
412 updateDate: 'Tue May 01 01:10:17 CEST 2007',
413 accessDate: 'Tue May 01 01:10:17 CEST 2007'
414 },
415 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
416 header: '####',
417 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
418 version: '0.2',
419 creationDate: 'Tue May 01 01:13:27 CEST 2007',
420 updateDate: 'Tue May 01 01:13:27 CEST 2007',
421 accessDate: 'Mon Jan 19 16:10:02 CET 2009'
422 }
423 }
424 },
425 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
426 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
427 version: '0.2',
428 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
429 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
430 accessDate: 'Mon Jan 19 16:10:01 CET 2009',
431 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
432 versions: {
433 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
434 header: '####',
435 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
436 version: '0.2',
437 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
438 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
439 accessDate: 'Mon Jan 19 16:10:01 CET 2009'
440 }
441 }
442 },
443 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
444 data: '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',
445 version: '0.3',
446 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
447 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
448 accessDate: 'Thu Feb 12 12:54:37 CET 2009',
449 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
450 versions: {
451 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
452 header: '####',
453 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
454 version: '0.3',
455 creationDate: 'Thu Feb 12 12:54:37 CET 2009',
456 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
457 accessDate: 'Thu Feb 12 12:54:37 CET 2009'
458 },
459 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
460 header: '####',
461 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
462 version: '0.3',
463 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
464 updateDate: 'Thu Feb 12 12:45:43 CET 2009',
465 accessDate: 'Thu Feb 12 12:45:43 CET 2009'
466 },
467 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
468 header: '####',
469 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
470 version: '0.3',
471 creationDate: 'Thu Feb 12 12:47:39 CET 2009',
472 updateDate: 'Thu Feb 12 12:47:39 CET 2009',
473 accessDate: 'Thu Feb 12 12:47:39 CET 2009'
474 }
475 }
476 },
477 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
478 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
479 version: '0.2',
480 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
481 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
482 accessDate: 'Mon Jan 19 16:10:12 CET 2009',
483 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
484 versions: {
485 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
486 header: '####',
487 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
488 version: '0.2',
489 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
490 updateDate: 'Wed Mar 14 15:51:17 CET 2007',
491 accessDate: 'Wed Apr 25 10:37:27 CEST 2007'
492 },
493 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
494 header: '####',
495 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
496 version: '0.2',
497 creationDate: 'Wed Apr 25 10:39:26 CEST 2007',
498 updateDate: 'Wed Apr 25 10:39:26 CEST 2007',
499 accessDate: 'Wed Apr 25 10:39:26 CEST 2007'
500 },
501 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
502 header: '####',
503 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
504 version: '0.2',
505 creationDate: 'Wed Apr 25 11:14:05 CEST 2007',
506 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
507 accessDate: 'Mon Jan 19 16:10:12 CET 2009'
508 },
509 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
510 header: '####',
511 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
512 version: '0.2',
513 creationDate: 'Wed Apr 25 10:51:49 CEST 2007',
514 updateDate: 'Wed Apr 25 10:51:49 CEST 2007',
515 accessDate: 'Wed Apr 25 10:51:49 CEST 2007'
516 },
517 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
518 header: '####',
519 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
520 version: '0.2',
521 creationDate: 'Wed Apr 25 11:01:21 CEST 2007',
522 updateDate: 'Wed Apr 25 11:01:21 CEST 2007',
523 accessDate: 'Wed Apr 25 11:01:21 CEST 2007'
524 },
525 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
526 header: '####',
527 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
528 version: '0.2',
529 creationDate: 'Wed Apr 25 10:59:57 CEST 2007',
530 updateDate: 'Wed Apr 25 10:59:57 CEST 2007',
531 accessDate: 'Wed Apr 25 10:59:57 CEST 2007'
532 },
533 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
534 header: '####',
535 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
536 version: '0.2',
537 creationDate: 'Wed Apr 25 10:38:17 CEST 2007',
538 updateDate: 'Wed Apr 25 10:38:17 CEST 2007',
539 accessDate: 'Wed Apr 25 10:38:17 CEST 2007'
540 },
541 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
542 header: '####',
543 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
544 version: '0.2',
545 creationDate: 'Wed Apr 25 10:56:58 CEST 2007',
546 updateDate: 'Wed Apr 25 10:56:58 CEST 2007',
547 accessDate: 'Wed Apr 25 10:56:58 CEST 2007'
548 },
549 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
550 header: '####',
551 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
552 version: '0.2',
553 creationDate: 'Wed Apr 25 10:58:33 CEST 2007',
554 updateDate: 'Wed Apr 25 10:58:33 CEST 2007',
555 accessDate: 'Wed Apr 25 10:58:33 CEST 2007'
556 }
557 }
558 },
559 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
560 data: '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',
561 version: '0.2',
562 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
563 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
564 accessDate: 'Mon Jan 19 16:10:23 CET 2009',
565 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
566 versions: {
567 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
568 header: '####',
569 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
570 version: '0.2',
571 creationDate: 'Wed Mar 14 17:27:40 CET 2007',
572 updateDate: 'Wed Mar 14 17:27:40 CET 2007',
573 accessDate: 'Wed Mar 14 19:00:21 CET 2007'
574 },
575 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
576 header: '####',
577 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
578 version: '0.2',
579 creationDate: 'Wed Mar 14 16:09:07 CET 2007',
580 updateDate: 'Wed Mar 14 16:09:07 CET 2007',
581 accessDate: 'Wed Mar 14 16:39:40 CET 2007'
582 },
583 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
584 header: '####',
585 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
586 version: '0.2',
587 creationDate: 'Wed Mar 14 19:01:05 CET 2007',
588 updateDate: 'Wed Mar 14 19:01:05 CET 2007',
589 accessDate: 'Tue Apr 17 19:20:33 CEST 2007'
590 },
591 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
592 header: '####',
593 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
594 version: '0.2',
595 creationDate: 'Wed Mar 14 17:17:20 CET 2007',
596 updateDate: 'Wed Mar 14 17:17:20 CET 2007',
597 accessDate: 'Wed Mar 14 17:22:06 CET 2007'
598 },
599 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
600 header: '####',
601 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
602 version: '0.2',
603 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
604 updateDate: 'Wed Mar 14 16:06:54 CET 2007',
605 accessDate: 'Wed Mar 14 16:06:54 CET 2007'
606 },
607 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
608 header: '####',
609 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
610 version: '0.2',
611 creationDate: 'Tue Apr 17 19:23:41 CEST 2007',
612 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
613 accessDate: 'Mon Jan 19 16:10:23 CET 2009'
614 },
615 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
616 header: '####',
617 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
618 version: '0.2',
619 creationDate: 'Tue Apr 17 19:22:08 CEST 2007',
620 updateDate: 'Tue Apr 17 19:22:08 CEST 2007',
621 accessDate: 'Tue Apr 17 19:22:08 CEST 2007'
622 }
623 }
624 },
625 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
626 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
627 version: '0.2',
628 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
629 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
630 accessDate: 'Mon Jan 19 16:09:28 CET 2009',
631 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
632 versions: {
633 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
634 header: '####',
635 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
636 version: '0.2',
637 creationDate: 'Wed Mar 14 16:51:02 CET 2007',
638 updateDate: 'Wed Mar 14 16:51:02 CET 2007',
639 accessDate: 'Wed Mar 14 16:51:02 CET 2007'
640 },
641 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
642 header: '####',
643 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
644 version: '0.2',
645 creationDate: 'Mon Jul 09 15:10:15 CEST 2007',
646 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
647 accessDate: 'Mon Jan 19 16:09:28 CET 2009'
648 },
649 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
650 header: '####',
651 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
652 version: '0.2',
653 creationDate: 'Wed Mar 21 12:56:43 CET 2007',
654 updateDate: 'Wed Mar 21 12:56:43 CET 2007',
655 accessDate: 'Wed Apr 25 09:59:58 CEST 2007'
656 },
657 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
658 header: '####',
659 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
660 version: '0.2',
661 creationDate: 'Sat May 19 11:26:44 CEST 2007',
662 updateDate: 'Sat May 19 11:26:44 CEST 2007',
663 accessDate: 'Mon Jul 09 15:08:39 CEST 2007'
664 },
665 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
666 header: '####',
667 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
668 version: '0.2',
669 creationDate: 'Wed Mar 14 16:38:54 CET 2007',
670 updateDate: 'Wed Mar 14 16:38:54 CET 2007',
671 accessDate: 'Wed Mar 14 16:38:54 CET 2007'
672 },
673 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
674 header: '####',
675 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
676 version: '0.2',
677 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
678 updateDate: 'Wed Mar 14 16:36:20 CET 2007',
679 accessDate: 'Wed Mar 14 16:38:12 CET 2007'
680 },
681 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
682 header: '####',
683 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
684 version: '0.2',
685 creationDate: 'Wed Apr 25 10:04:29 CEST 2007',
686 updateDate: 'Wed Apr 25 10:04:29 CEST 2007',
687 accessDate: 'Sat May 19 11:22:01 CEST 2007'
688 },
689 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
690 header: '####',
691 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
692 version: '0.2',
693 creationDate: 'Wed Mar 14 16:52:12 CET 2007',
694 updateDate: 'Wed Mar 14 16:52:12 CET 2007',
695 accessDate: 'Wed Mar 21 12:16:29 CET 2007'
696 }
697 }
698 },
699 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
700 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
701 version: '0.2',
702 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
703 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
704 accessDate: 'Mon Jan 19 16:10:06 CET 2009',
705 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
706 versions: {
707 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
708 header: '####',
709 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
710 version: '0.2',
711 creationDate: 'Wed Mar 14 16:45:40 CET 2007',
712 updateDate: 'Wed Mar 14 16:45:40 CET 2007',
713 accessDate: 'Wed Mar 14 16:45:40 CET 2007'
714 },
715 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
716 header: '####',
717 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
718 version: '0.2',
719 creationDate: 'Wed Mar 14 16:47:01 CET 2007',
720 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
721 accessDate: 'Mon Jan 19 16:10:06 CET 2009'
722 },
723 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
724 header: '####',
725 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
726 version: '0.2',
727 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
728 updateDate: 'Wed Mar 14 16:20:58 CET 2007',
729 accessDate: 'Wed Mar 14 16:43:46 CET 2007'
730 }
731 }
732 },
733 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
734 data: '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',
735 version: '0.2',
736 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
737 updateDate: 'Thu May 10 15:01:21 CEST 2007',
738 accessDate: 'Mon Jan 19 16:09:54 CET 2009',
739 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
740 versions: {
741 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
742 header: '####',
743 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
744 version: '0.2',
745 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
746 updateDate: 'Wed Mar 14 13:35:58 CET 2007',
747 accessDate: 'Wed Mar 14 13:35:58 CET 2007'
748 },
749 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
750 header: '####',
751 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
752 version: '0.2',
753 creationDate: 'Wed Mar 14 19:24:49 CET 2007',
754 updateDate: 'Wed Mar 14 19:24:49 CET 2007',
755 accessDate: 'Wed Mar 14 19:24:49 CET 2007'
756 },
757 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
758 header: '####',
759 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
760 version: '0.2',
761 creationDate: 'Wed Mar 14 17:41:15 CET 2007',
762 updateDate: 'Wed Mar 14 17:41:15 CET 2007',
763 accessDate: 'Wed Mar 14 17:41:15 CET 2007'
764 },
765 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
766 header: '####',
767 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
768 version: '0.2',
769 creationDate: 'Wed Mar 14 19:25:28 CET 2007',
770 updateDate: 'Wed Mar 14 19:25:28 CET 2007',
771 accessDate: 'Thu May 10 15:00:47 CEST 2007'
772 },
773 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
774 header: '####',
775 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
776 version: '0.2',
777 creationDate: 'Wed Mar 14 14:46:36 CET 2007',
778 updateDate: 'Wed Mar 14 14:46:36 CET 2007',
779 accessDate: 'Wed Mar 14 17:40:01 CET 2007'
780 },
781 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
782 header: '####',
783 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
784 version: '0.2',
785 creationDate: 'Thu May 10 15:01:21 CEST 2007',
786 updateDate: 'Thu May 10 15:01:21 CEST 2007',
787 accessDate: 'Mon Jan 19 16:09:54 CET 2009'
788 },
789 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
790 header: '####',
791 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
792 version: '0.2',
793 creationDate: 'Wed Mar 14 17:43:29 CET 2007',
794 updateDate: 'Wed Mar 14 17:43:29 CET 2007',
795 accessDate: 'Wed Mar 14 19:23:51 CET 2007'
796 }
797 }
798 },
799 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
800 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
801 version: '0.3',
802 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
803 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
804 accessDate: 'Mon Jan 19 16:09:41 CET 2009',
805 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
806 versions: {
807 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
808 header: '####',
809 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
810 version: '0.2',
811 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
812 updateDate: 'Wed Mar 14 17:39:39 CET 2007',
813 accessDate: 'Tue Apr 17 19:09:44 CEST 2007'
814 },
815 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
816 header: '####',
817 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
818 version: '0.2',
819 creationDate: 'Tue Apr 17 19:12:39 CEST 2007',
820 updateDate: 'Tue Apr 17 19:12:39 CEST 2007',
821 accessDate: 'Wed Feb 13 15:27:04 CET 2008'
822 },
823 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
824 header: '####',
825 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
826 version: '0.3',
827 creationDate: 'Wed Feb 13 15:29:04 CET 2008',
828 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
829 accessDate: 'Mon Jan 19 16:09:41 CET 2009'
830 },
831 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
832 header: '####',
833 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
834 version: '0.3',
835 creationDate: 'Wed Feb 13 15:28:28 CET 2008',
836 updateDate: 'Wed Feb 13 15:28:28 CET 2008',
837 accessDate: 'Wed Feb 13 15:28:28 CET 2008'
838 },
839 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
840 header: '####',
841 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
842 version: '0.2',
843 creationDate: 'Tue Apr 17 19:11:33 CEST 2007',
844 updateDate: 'Tue Apr 17 19:11:33 CEST 2007',
845 accessDate: 'Tue Apr 17 19:11:33 CEST 2007'
846 }
847 }
848 },
849 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
850 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
851 version: '0.2',
852 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
853 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
854 accessDate: 'Mon Jan 19 16:09:30 CET 2009',
855 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
856 versions: {
857 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
858 header: '####',
859 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
860 version: '0.2',
861 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
862 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
863 accessDate: 'Mon Jan 19 16:09:30 CET 2009'
864 }
865 }
866 }
867 }
868 }
869 }
870 },
871
872 //-------------------------------------------------------------------------
873
874 'test_test_offline_copy_data': {
875 users:{
876 'catchAllUser': {
877 __masterkey_test_value__: 'masterkey',
878 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
879 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
880 },
881 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
882 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
883 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
884 version: '0.2',
885 maxNumberOfRecords: '100',
886 userDetails: '{"records":{"index":{"8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13":"0"},"data":"Ki9chN/ker5c+7zB5NinstllVq1Vs+N5pezZIohKVVa15VLSIyre3DRilRoldy/94LbGaEM3SZsMlf28hYbWySln3ekNMIB+MItaYb8urw+8U6n8+QaRMAClHXukfi8te2d1OIlgjbrBQNMmzBorjIs="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"YgSYIsDeVT87bfiASQqXA2E9"},"version":"0.1"}',
887 statistics: '6Kupec1ZD7Dw0WzK7pPesnLE',
888 userDetailsVersion: '0.3',
889 records: {
890 '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13': {
891 data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
892 // data: 'bXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
893 version: '0.3',
894 creationDate: 'Tue May 05 01:28:36 PDT 2009',
895 updateDate: 'Tue May 05 01:28:36 PDT 2009',
896 accessDate: 'Tue May 05 01:28:36 PDT 2009',
897 currentVersion: 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d',
898 versions: {
899 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d': {
900 header: '####',
901 data: 'Pc18C1A9NwNlecbOtOOAEymNZD5oq20ZvPqMfiCyNhkcmaN9sEnifF31epZSjpDw4XM4ex3HFhhITttXlCrossDVYB8z00k6XsFruCkdwFRmBjb2PdrdZFAkGQeS/8xTarYWgiflkfGocGqVm6EUq1gh8QLE173Jzo15LOSuzuSS90BTMvcsqzzRrIEe+9jwF9/ehLyQ5yYxNImFGQQ2jkW0KiZsjyEbQAGry7B1/AiSUBaGYHYzcB3bFgXnzC3ecPwL+ENZ+azpTd143WneuVMUJrWNp3S+9ZRzboRzcYV6Ax3nOLPS7LTc+e9j9s4CrPvc1L6pG23AzNByDWst0JrqhN37yp67EVVrFQfUDWcKgZyyA/M82q1TVScx+I4A+g9ASC+PdQ3+M5+EOtEfClkgYJFqzXqwPKYwBv4CBKxikS2Vt8x40271kjmVYyGQOIRTo1UKn6u07TS5hxdEgEI+WdukG52813USiD8bQFbN0r4VhjFSqKMAJoItjqvafBNBl+OXYQ1p1zRCXP7wHS4/F7mvrK98gSuIsBgfL+/q9rExXaxIZJNSbs1HGAXR1TxYSvyKZvLa',
902 version: '0.3',
903 creationDate: 'Tue May 05 01:28:36 PDT 2009',
904 updateDate: 'Tue May 05 01:28:36 PDT 2009',
905 accessDate: 'Tue May 05 01:28:36 PDT 2009'
906 }
907 }
908 }
909 }
910 }
911 }
912 },
913
914 //-------------------------------------------------------------------------
915
916 'test_test_offline_copy_data_withExtraVersion': {
917 users:{
918 'catchAllUser': {
919 __masterkey_test_value__: 'masterkey',
920 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
921 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
922 },
923 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
924 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
925 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
926 version: '0.2',
927 maxNumberOfRecords: '100',
928 userDetails: '{"records":{"index":{"75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53":"0"},"data":"YjlNzXUO9m0EXdi5fUguA6RjR5jc2mwuHkpMsHAheExR2zpoV6OJx8tBTdUGqDBAlbIn6xUx2TT+dzgjic/XubgKNsv6JpTvnfiW6ZMWiebKXVigoZw7L5EvmcHjVLI8aoIhVEj4ADwkh9qHm0Kt1zFGQPwwJfo="},"directLogins":{"index":{},"data":"4W5csD8DxlxeXVRROk7wVbXi"},"preferences":{"data":"/DjOoFcgquxUbW5ye2LrpsKM"},"oneTimePasswords":{"data":"DEqkd74lLAGtG4YKRPniBNBU"},"version":"0.1"}',
929 statistics: 'EkRr9wEXi/WOlZfCXphn9kfx',
930 userDetailsVersion: '0.3',
931 records: {
932 '75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53': {
933 data: '/gtNfde5l2J9eeg+rlBHZtqO4RDaWNQwaMEluOVowKdUlGAYjo9FU0NwKsA9CM3ST4sTYl0mylP3C/AGybO8/9sTCkEn20wi0slharA61Rk8uB2lNjCICZB4l3ZGvD4AHKucu8YQzxpWop5dTN8f4us5eJ2VjvJPLqUzSKZL4g+6MiKbjQ==',
934 version: '0.3',
935 creationDate: 'Tue May 05 18:47:53 CEST 2009',
936 updateDate: 'Tue May 05 18:48:59 CEST 2009',
937 accessDate: 'Tue May 05 18:48:59 CEST 2009',
938 currentVersion: '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b',
939 versions: {
940 '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564': {
941 header: '####',
942 data: 'MZGx+tQAecxJNl6UbWHIM8g416Qa8DfWtGo7f2vLkPBbhsr20xnZ233oPqIGceG5/6WMssQd9c8U81urISK+4Ar8zHGUxTdIYLZaDq33Q0uF5vO7OsaBcjL7m+tX7zB+e/eu0ABbqvt+saMsZKKSdIZv2KNbAg5VTiL7GjWuowM23tWgiUBgX3eO5fnUUQWVkBygk0qy2O45oNfb1XcbsGMCfS4YPF9GB/wGSQKG8keMoy1ZWZh4nG+Pdx2ymIrYKLv8T+i7jtWEbyhvEglb7TadCMBBF0pnkYvG3F29skWooZC92dy5213o+3/uSKi0od5tAbvSYZHjT5hDulUtmjRFGq4ZRERLqvrZs9Sg8G2mjtf8Ta99Hob8WLxyGF9x7s1LcLPERtdsP9qCD+I0WtwrDiodl/sPQ/5s3G2S+M/YejKXBvG3AWwoO1gkdhec3+d3meFNvCr0hKNzotrHmDLC4tGyZIaAcBmPQ8xSD5KmNJJFU+V0QIdiEYKnPjo95oSmKyK1UtIoPrWCahfYSKXh+aW53XnzY4JKHRER9vWwdJzz',
943 version: '0.3',
944 creationDate: 'Tue May 05 18:47:53 CEST 2009',
945 updateDate: 'Tue May 05 18:47:53 CEST 2009',
946 accessDate: 'Tue May 05 18:47:53 CEST 2009'
947 },
948 '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7': {
949 header: '####',
950 data: 'Y38v4jhKwcsW8LDTigIhtdLJ2zgv+1rSutqyu0AilBQeSTe4D0rnapZZTW/mNnD5IGpWKFoEl8+WGj1zvGzleNdkOa08nWJEYDNe2h0+FjBSHBUAgH5fraezomRWzJ/Z5HHFiZuFfpjt2BHd0Y3Not6AuL3aBgjjkEai90r2o59Xr70maUwo1UqmtVg3gvX067MC3hlqhNIp390J8LFiSj8Z4US9x/WzVR5Xx069+0PFMBwipq9WJPrcfTPwvP6xVa+J8BCJk3HtboRutq1ZhhHpibm+TY3Xl3gFTTCHWDZCSJ4Rm1dWkyqpx51u/AVg2TC+ljFLKv7hq3euVZNMLNMY2BqoCkcb+w6dFLDs3WfPAW0aQN2P++GFa/eVpN90YxAeXufjsXKaArTMjGWKiHqyU1iVVI8N1QEiFYjjBV1GvkJxog5PjtAzJF++qwHDIa+gJ+NnOfenVF0wIRMCEnpGyvbg3SkUoenKFoHO0IcSP2CW2RWV/GAmiEZEuVD393mKi5B6fpjdO9JVPNyz0i0kW++dtzInwPnglhOAY1ywT0ExOBLIEr8=',
951 version: '0.3',
952 previousVersion: '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564',
953 previousVersionKey: 'f45/Sx3jMC8CgdT8cjfcC4ApA8xMXABFO48jiTh5VjJfTlVqw3NnHRO2KDBIhy0znPvP2AKlpKQHruW8LQno7YLyhEIXh4ChjMUjJsFFwB/LUg==',
954 creationDate: 'Tue May 05 18:48:11 CEST 2009',
955 updateDate: 'Tue May 05 18:48:11 CEST 2009',
956 accessDate: 'Tue May 05 18:48:11 CEST 2009'
957 },
958 '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b': {
959 header: '####',
960 data: 'tkiW41JHOfbYOt2KHx1HtDJEzxbfVS1Y2HJQqdQZ73zhvxnkWLw/X6FMiBexLeoKXO1H9NIWS884MzEO782vg8QRxTizg66Yye+q1Hox+QsaEoaD4UQ54XV1duTOB/XS5P0P9DFvtIz9msEu8GJrvizAdxu/7FG2b5XfENDkwqIzydI7JMfGC0JzDnfGvYkWqoL8jx3Joxa7TNqN4he4v771Ho1ZoUv3Pp7ZGwBU+btl6Q9mcycSf5KXdTw+6nDjfQh8qyts/u7O5xPFh2Yn8zS48x95I4SA4yFKtERU3pLAxIkcZWVb17xT8xlbPESreZ0RyYSR0CgW0wPMxkLHH1uqWycTa7yIxUhyn+JK9jCl4eDa/KUSGbN1yb6pOyjGuev1vHEZv3bOmO52RVVIdMHTe3LezCKY8xpDqtQKSfAvFg1TmabugXePXB+KvPbDDWI5otDEIwLYhDFcSn2FyqUEATSzeU2o1uXO+ffbU3QBrwr27tsreughWSP7905FQbEEshsRUc2Xt92WhTnVM6W74Y0bMLWjTrXbu+hNsjtFYYN6gtezcltnB58MVw==',
961 version: '0.3',
962 previousVersion: '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7',
963 previousVersionKey: 'XtJ8Ub99GXIkxErIPr0HaIrRqlAO0Naa/tPwUA51K2D5R6R3CR6QbHd3GpkCnu+y+bcEIRYrQqgabi3LROYT+1SZ9B9FctX6FyaTjYEazFdCvg==',
964 creationDate: 'Tue May 05 18:48:59 CEST 2009',
965 updateDate: 'Tue May 05 18:48:59 CEST 2009',
966 accessDate: 'Tue May 05 18:48:59 CEST 2009'
967 }
968 }
969 }
970 }
971 }
972 }
973 },
974
975 //-------------------------------------------------------------------------
976 'syntaxFix': ""
977}
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js b/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js
new file mode 100644
index 0000000..e2b21bc
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js
@@ -0,0 +1,127 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.CardDialogNew');
30
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup();
33
34Clipperz.Tests.CardDialogNew.Tester = function(args) {
35 args = args || {};
36
37 Clipperz.Tests.CardDialogNew.Tester.superclass.constructor.call(this, args);
38 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39
40 return this;
41};
42
43Clipperz.Base.extend(Clipperz.Tests.CardDialogNew.Tester, Object, {
44
45 'toString': function() {
46 return "Clipperz.Tests.CardDialogNew.Tester";
47 },
48
49 //-------------------------------------------------------------------------
50
51 'user': function () {
52 return this._user;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'run': function () {
58 var deferredResult;
59 var proxy;
60 varcardDialogController;
61 varcardDialogComponent;
62
63 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
64
65 deferredResult = new Clipperz.Async.Deferred("cardDialogNew_test.init", {trace:false});
66 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
67 deferredResult.addMethod(this.user(), 'login');
68 // deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
69 deferredResult.addMethod(this.user(), 'createNewRecord');
70 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
71 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
72 cardDialogController.run();
73 }, this));
74 deferredResult.callback();
75
76 return deferredResult;
77 },
78
79 //=========================================================================
80
81 'saveChanges': function () {
82 return this.user().saveChanges();
83 },
84
85 //-------------------------------------------------------------------------
86
87 'hasPendingChanges': function () {
88 return this.user().hasPendingChanges();
89 },
90
91 //-------------------------------------------------------------------------
92
93 'revertChanges': function () {
94 return this.user().revertChanges();
95 },
96
97 //=========================================================================
98 __syntaxFix__: "syntax fix"
99});
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120init = function () {
121 vartester;
122
123 tester = new Clipperz.Tests.CardDialogNew.Tester();
124 tester.run();
125};
126
127MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/index.html b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
new file mode 100644
index 0000000..1e0061a
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
@@ -0,0 +1,117 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Card Dialog NEW - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
74 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
78
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
88
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
91
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
94
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
96
97 <script type='text/javascript' src='./User.data.js'></script>
98 <script type='text/javascript' src='./cardDialogNew_test.js'></script>
99<script>
100 Clipperz_IEisBroken = false;
101</script>
102
103<!--[if IE]><script>
104Clipperz_IEisBroken = true;
105</script><![endif]-->
106
107 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
108 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
109 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
110
111</head>
112<body>
113
114<div id="tableWrapper"></div>
115
116</body>
117</html>
diff --git a/frontend/gamma/tests/tests/Components/FullApp/README.txt b/frontend/gamma/tests/tests/Components/FullApp/README.txt
new file mode 100644
index 0000000..476aa3a
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/FullApp/README.txt
@@ -0,0 +1 @@
ln -s ../../../../../context/images . \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Components/FullApp/User.data.js b/frontend/gamma/tests/tests/Components/FullApp/User.data.js
new file mode 100644
index 0000000..b76ccad
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/FullApp/User.data.js
@@ -0,0 +1,1044 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29testData = {
30
31 //-------------------------------------------------------------------------
32
33 'testData': {
34 users:{
35 'catchAllUser': {
36 __masterkey_test_value__: 'masterkey',
37 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
38 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
39 },
40
41 /* tt/tt - empty, just created, account*/
42 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
43 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
44 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
45 version: '0.2',
46 maxNumberOfRecords: '100',
47 userDetails: '{"records":{"index":{},"data":"q/wNeY/xf7Sujn5CIxEYPRSF"},"directLogins":{"index":{},"data":"qcVwiiyOYeDHFZq5T06iF1Wp"},"preferences":{"data":"7ONKfKQk9GYGnlRxFgTgAd4J"},"oneTimePasswords":{"data":"GD66ZNSIqkRl1UxhwyrsSm5r"},"version":"0.1"}',
48 statistics: 'tfQF+BrjAQUWyiXWOMkWApmq',
49 userDetailsVersion: '0.3',
50 records: {
51
52 }
53 },
54
55 /* tt/tt - account with "wrong" direct login*/
56 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
57 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
58 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
59 version: '0.2',
60 maxNumberOfRecords: '100',
61 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"1"},"data":"/+RHG+JLrFhZLYga2H9hsPyugT5bbiPwmNgY/RqE2g90FXfsCOvJ6TnfHX6ufeVfJ5+jUq/mRhWMlKdIqROSBLRL5EbL7i881EyKMNE24zpzUWm9zN6HcATPO2iNvDjsZjv2dEP9QWtAabw4Hc7UB+39WQ=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":1},"data":"ZF6BZYAVIJi3xrCPs6XWHwZDveEonG/5WJVKwIXbCGa5fr1myopvpqYbWI09tPCCktlMKP/X/SiIyBxlq7Z953VpOHWx0AYqTpRnw8PfJ+0BJDEblBFCZ8ZZfkZXcfYmNoY7"},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}',
62 statistics: 'XhiWkdDyHzuviv5bdxOY/2Q5',
63 userDetailsVersion: '0.3',
64 records: {
65 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': {
66 data: '93QXl+c+JmQo4WTl4rYLYb/oHehjntAroteeHd6HqrUiXYoi+02GYrYcKfvE5wgMWvOwvQ4kVdUv5ksa3gJaUzhrpY5GLM3EV3agEkQ6yuKwHgfmAQvES1c6tcw15lNTzGiZ7PHhBrW5I5H6Le0Mf10uW1DOyu6gFl+W5OarbBBGyQmRmASy+CW2l3/lY5pOFxUq3qlkwW/o4KrSiwKOFh3HDvxOQKwovm0v3puLu+NsuL5rz5blUIZpj+CsOmZUhtU5FC5s6iO2L1uj3w8+Yxu279p249H1bv1zxo1zSBpP507uuRH8dKOLsu7JI6PO+UC8PLqVhPU7fHhDhNleurE7AsUo6eHocG0DhxCAm3xeobm1K2iPd0iRprcuRXmwa8HWRDJHTItbQr9D+cnQTT7/DwneRdQzpMaVZHZcKqtAzz07jboy98plrigu03tV2MkXt2veIMLBofxxHqgZ0NJhcfrVta4FlJsrd1vO9RUkoHl+qPJqQZIVGZzoT0rdHS/nLd614EHJSfRYIl+drUEUchIidbRnMzvPTBo2s6bVfUPcQksVop4E85wMo15ah2BHzUe4vjkmM+Ki8ecUVH8jRR5fmZhCGpBFML5U7o+rERYABFuwwRC9FfCXMtmClHc2LypP+iu+lI/VycdHg/m8skQVeCDBv892vqehUs1CpeVAxMtYOJcFtm6roQNPxJe1EI/j4PAi3SEYPCFev1F7u1g4bw4cG5jCGJx6U3qTTYMX5A06dHf4iSSOUeCsrP5U+VJY0KLhU3E66DzOxNIrIyYN6iOJxKCbhH7ILfGdWAV3MlZZOpVoSIqiR7oZo2PwovtudF5tOy9lhz7SEFYLvuQy8r4mqFC7qMVnXJRrBPDZcQDTdXLG33YV6dWX17QpGrpyvPhX5/UDv8E7zc8PdO1YfJmzL1rpArlIXF1EOsLa6BqjQp5bkIlHKugQMjnn3tf4sYK0OhPskbKidfNm59NedQODEoUr5NGwmjSAqTCokt1D7q0K3vMK',
67 version: '0.3',
68 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
69 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
70 accessDate: 'Wed Jan 20 16:53:47 CET 2010',
71 currentVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741',
72 versions: {
73 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': {
74 header: '####',
75 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv',
76 version: '0.3',
77 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
78 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
79 accessDate: 'Wed Jan 20 16:53:47 CET 2010'
80 }
81 }
82 }
83 }
84 },
85*/
86 /* tt/tt with "fixed" direct login*/
87 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
88 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
89 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
90 version: '0.2',
91 maxNumberOfRecords: '100',
92 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"0"},"data":"K6sV3xYDTHn1PDHmbVhG3PogarwMtHCliSEGaJ5eev/RQv7MW9TCP5efsjATRT4eheX7JkXAoLo+sgMVr2fTyu7f7K0IEYp3mCi27T/TmtTM3b8FoaVfmXWEjN0FGx7N6gK6+lZxhFueRxsOha1+fTLDBg=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":"0"},"data":"9aUwb/5nIlAOPKz62xTwylK0dilpWVVEJBag5+LydmBwWxTmlfcB+OO6jGnMgDrjif3LVhWFjfKVSoZs5hSpPvhsSDPaLf5vQhF4igRaQpWI9QhBdfmv3QvZ57ei/gfcal346F4="},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}',
93 statistics: 'GHHkZjW0QLdUq6CPnVuDLh86',
94 userDetailsVersion: '0.3',
95 records: {
96 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': {
97 data: 'SOcANZTLo4dsjpsPghF2+TndV9+1uYhGjup3StEa1kiFHHzDK6kDZkKwjhP0mxFgixlQHZBnvgsW/xdHGXdmj1RHtaNdHlte7W1Wq5MHbH4XE9bJzQAvQmop8OETgGz7Khp4BbUMVLIXhxoJmP3rMx7ulQHds+WN+S5u+iB73y5nkJwfOXrXDjwwlL1vER92XHE1VJZAjkYRB/xes6SLcITaG9LYVSGSVAhtLIzkmrAvPHPIpZSOI4NQnAMEVPllwtMlWQBEeerN7PIKImyaUd9zPzP+v0S1V+kUyioizScsDdVuaNKa+yqwFKvYYy61nobv3Mg+Fo3EGqY7GOiO7AklRTreZoOkZAdogQlA1DZuIBNSbpcMvm5MoP+PsU3HFSb/Vioo+QEcgTWqVyDNuFGZpkOI2iIBuQCwLmsCwB1JaE/1cCd1fEpOWyiFep0vxwi0ZrtRZQowQd2Ua3UIoaG5u5WoYEMYoH7FFi6Djda4Rf4gxed8rPLE+cNTI/p67OKlbAfr8iz3YZknaH+CXp9pPr7V7xXBCWNxo5DnFPeeqqrxjTAbkeg/Rp2hJeN7/zi0TSWKDUTXfkuUNyewHOHb7M+MIvC1F1CtmqLuU3h8RDINYgPtZTtTk68YBmOG88xYTtClr4kKxmp1scrV3nJ7af+IGoVKZpRAwBJYT3HV33vzO9W35zl14eZ0vVuNoHMNsh9uDxjCwRyPtQzVpQuTIYnHHoO5R17XyIfe599BOSBAGimciprURN3llC2H8YhRtMilQRYvEDVsC+mVZmGAeEdQ5o/AehnpBuVKErRBzotWe6bNMkIQqWfwCLQFBb6ap1gT5hbacrJM4AlaPgOdQsyX9npd3yN/tzjVA1IqWLnoaEXq9EfWXhBuT+juMfSQ2Y8bPbpBKZmWWL06T2fVkaZJN0VFtBXGi0XRFJngPskApLunZOfBYq831jSi8/Z937QVTQKWwOz6rLE8covE3mxJ53gDVcOlvqD9s/NGXbmnt2GnlWhVKpzhTIJ812Hr050/2AI9ZmWnv+ypSqeQ3l0BFh4D+xfk5NRv+dKbxANheZnfZMhR6u8F+jX/W3hUtNCIMQc2vLSQ',
98 version: '0.3',
99 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
100 updateDate: 'Wed Jan 20 16:54:56 CET 2010',
101 accessDate: 'Wed Jan 20 16:54:56 CET 2010',
102 currentVersion: 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d',
103 versions: {
104 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': {
105 header: '####',
106 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv',
107 version: '0.3',
108 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
109 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
110 accessDate: 'Wed Jan 20 16:54:26 CET 2010'
111 },
112 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d': {
113 header: '####',
114 data: 'ky36e85TGmGQ+O9FXAhHRXEz5eBQogwuyAEgjpsHaSUM22TowYEw/NkWMg4oT4M2DGIYoTyXatvea859F3kMWM5hUe16PaG9J8HzQcEnaTRmi5oe0cMJAlg6pl7ypLt9kUiqDoMIM4lM/eKO8E/bRZWnU1EsxjehYjQQUoeoSyyTAOhHlLfXS99TzCXFrJjO5rAgaJ7iAjNOcQ8Bm6ECau5ao9AVd5hqgMDEmLJhRwygcGHSTek3i3I4o0jIImcqpfNko/4SbEC4p7+V5Rggr1IG5DkeYfKuyqxgulJbtdkcWxAqPReKXUOkmSGlRTje8rjTTLx1Jv7QCc0hLDYc5pLd8j/G7mOwLG1nLTMeNekljKNCTLAhQ+ccDDq35Jv1cNhmA/icmRlMkztbsR7tzqFs+drQ',
115 version: '0.3',
116 previousVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741',
117 previousVersionKey: 'aLMGf0ucGPaKLVv+AunJaZWDg+gGncnBu2Bf7QseH3ma/jcMOZCNHNd44mNPKfZPyoXYZi6/ToxkJh6Nu8PmOL/SsHTlf8FBZxrNm1i7ZS2b3A==',
118 creationDate: 'Wed Jan 20 16:54:56 CET 2010',
119 updateDate: 'Wed Jan 20 16:54:56 CET 2010',
120 accessDate: 'Wed Jan 20 16:54:56 CET 2010'
121 }
122 }
123 }
124 }
125 },
126*/
127
128 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129
130 /* joe/clipperz*/
131 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
132 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
133 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
134 version: '0.2',
135 maxNumberOfRecords: '100',
136 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"17","6dadcd7ab23ece757d6990ce237bdebb68b2df0281c78cc1483d913318112162":"18"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","6e218e5d129105c20ac499307b260eb76bb2e753f6c319e17efdb848675c5fa2":"20","75f306bd520b483e86a1b436d94159020197df0155ab9058fb86586925223dc7":"21"},"data":"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"},"preferences":{"data":"fwQt+Wxhev563xviKvItHr3k5MC7ciMmEayJZ7HfwTcWPqaF5Syf1czPlMQiDQzEgWWs4BmQqB0QCDDMi3VyGCrSzAtIMR4afVdRyQ=="},"oneTimePasswords":{"data":"8WhmNFYrgxqzrJwMx+goddfLb2wlXnREHH77BKpL8h4ZalAwNOAt0yoBMECtlnNcve8ufjGAXL80dgUgtqsTn8fpx7+WDL5fNynv5ve9mJq/qgqctQO+pvnLuvs4867NXYInHr84f+t8f0lyfYRQdpDJfem9ECrn5MrpQ1rvwB2PVKcU0f+VPGhu673QeDbqzF+95JfxF9Tnv1PAePL1EGahUYuxTED4y4fcVmsHKl9yZXcsuheM7ecik93cqOVSlnuN+s5c2KWqjgDdLzUjG2dDHcuY97v7JT7Pns4ad5C9i2dYLtNrSHG7QLw6RBS/EnBwGzK+sWFQFCU8u0qSeFb0eGRjvVb9SfIXSeTqAJK3JC+OLAVGiey34jFckykeQjy5nPjhSpqWWhZdpezvZHno3YCXSGkLqbazL6xtesNaZZAbHBKdrwIOuTdhMwArfX/na/gavciFM0zwGb13w6JX3Ar3iTqhnBR20zmv5vcZwIOjf36LSfSNnjT4sWE1Az+FQPmMPQi4ODHfLSJbwYQhwqM5Wq2yXHpKDf/e2RpBZ5JsUkDEyoGmglcLF+pXwk4Mn9LuNOztxXCRWaZ3M/5uVk4xXOqJax1IlnA4nlu+3N0orF5ipRwd7BfmQekiYyp69m9SJA=="},"version":"0.1"}',
137 statistics: 's6W+Nlk1/14i/BN4u7qN8oTc',
138 userDetailsVersion: '0.3',
139 records: {
140 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
141 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
142 version: '0.2',
143 creationDate: 'Wed Mar 14 07:46:44 PDT 2007',
144 updateDate: 'Wed Mar 14 07:46:44 PDT 2007',
145 accessDate: 'Fri Jan 08 12:38:42 PST 2010',
146 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
147 versions: {
148 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
149 header: '####',
150 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
151 version: '0.2',
152 creationDate: 'Wed Mar 14 07:46:44 PDT 2007',
153 updateDate: 'Wed Mar 14 07:46:44 PDT 2007',
154 accessDate: 'Fri Jan 08 12:38:42 PST 2010'
155 }
156 }
157 },
158 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
159 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
160 version: '0.3',
161 creationDate: 'Fri Oct 17 07:49:20 PDT 2008',
162 updateDate: 'Mon Oct 27 00:58:49 PDT 2008',
163 accessDate: 'Tue Jan 05 01:16:38 PST 2010',
164 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
165 versions: {
166 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
167 header: '####',
168 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
169 version: '0.3',
170 creationDate: 'Fri Oct 17 08:00:31 PDT 2008',
171 updateDate: 'Fri Oct 17 08:00:31 PDT 2008',
172 accessDate: 'Fri Oct 17 08:00:31 PDT 2008'
173 },
174 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
175 header: '####',
176 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
177 version: '0.3',
178 creationDate: 'Fri Oct 17 07:49:20 PDT 2008',
179 updateDate: 'Fri Oct 17 07:49:20 PDT 2008',
180 accessDate: 'Fri Oct 17 07:54:23 PDT 2008'
181 },
182 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
183 header: '####',
184 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
185 version: '0.3',
186 creationDate: 'Fri Oct 17 08:00:13 PDT 2008',
187 updateDate: 'Fri Oct 17 08:00:13 PDT 2008',
188 accessDate: 'Fri Oct 17 08:00:13 PDT 2008'
189 },
190 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
191 header: '####',
192 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
193 version: '0.3',
194 creationDate: 'Fri Oct 17 07:59:31 PDT 2008',
195 updateDate: 'Fri Oct 17 07:59:31 PDT 2008',
196 accessDate: 'Fri Oct 17 07:59:31 PDT 2008'
197 },
198 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
199 header: '####',
200 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
201 version: '0.3',
202 creationDate: 'Mon Oct 27 00:58:49 PDT 2008',
203 updateDate: 'Mon Oct 27 00:58:49 PDT 2008',
204 accessDate: 'Tue Jan 05 01:16:38 PST 2010'
205 },
206 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
207 header: '####',
208 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
209 version: '0.3',
210 creationDate: 'Fri Oct 17 07:57:17 PDT 2008',
211 updateDate: 'Fri Oct 17 07:57:17 PDT 2008',
212 accessDate: 'Fri Oct 17 07:57:17 PDT 2008'
213 },
214 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
215 header: '####',
216 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
217 version: '0.3',
218 creationDate: 'Fri Oct 17 07:58:00 PDT 2008',
219 updateDate: 'Fri Oct 17 07:58:00 PDT 2008',
220 accessDate: 'Fri Oct 17 07:58:00 PDT 2008'
221 },
222 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
223 header: '####',
224 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
225 version: '0.3',
226 creationDate: 'Fri Oct 17 08:01:59 PDT 2008',
227 updateDate: 'Fri Oct 17 08:01:59 PDT 2008',
228 accessDate: 'Mon Oct 27 00:57:58 PDT 2008'
229 }
230 }
231 },
232 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
233 data: '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',
234 version: '0.3',
235 creationDate: 'Wed Mar 14 06:53:11 PDT 2007',
236 updateDate: 'Fri Oct 30 10:52:54 PDT 2009',
237 accessDate: 'Sat Jan 23 02:24:21 PST 2010',
238 currentVersion: '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5',
239 versions: {
240 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
241 header: '####',
242 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
243 version: '0.2',
244 creationDate: 'Tue Apr 17 10:13:41 PDT 2007',
245 updateDate: 'Tue Apr 17 10:13:41 PDT 2007',
246 accessDate: 'Tue Apr 17 10:13:41 PDT 2007'
247 },
248 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
249 header: '####',
250 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
251 version: '0.2',
252 creationDate: 'Wed Mar 14 06:53:11 PDT 2007',
253 updateDate: 'Wed Mar 14 06:53:11 PDT 2007',
254 accessDate: 'Wed Mar 14 07:24:35 PDT 2007'
255 },
256 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
257 header: '####',
258 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
259 version: '0.2',
260 creationDate: 'Wed Mar 14 07:33:00 PDT 2007',
261 updateDate: 'Wed Mar 14 07:33:00 PDT 2007',
262 accessDate: 'Tue Apr 17 10:12:56 PDT 2007'
263 },
264 '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda': {
265 header: '####',
266 data: '9rcbGeLFjW1cwULSScOa5zfb9BZqoSi8IvarxwjLVz+4VqApsBZnwJsxJHq/L9zV3SRYlAQRRLNy3lhpO/fJAOg4RNp68KdtA+IZfCsn1MzwfOoBrnTTELPKxDim4US9xQNdJp5ffWoLB8demEL2YkSNTrPVr5crvVPyepuRCzdqUoe6Dba05tR6Ju7/+d9K/cfJg+KI/ziSUSVlOTsIahGkipvMwYzhCOqjljJvdeF6XLLCh7F70lFvpW5vtv5jNmpkgvAhfxgovIZ3tav0WDc+DEdFNHNsCtFhwRYsb1dH5Ry01M8g4vS7PDkuCNYOvjL9bS2Wmy/lVulM9dYdB/d/gKWTjbqgre/IR1TPPdtfiVBo2J9PUvM8P/c2LmQrf63OwjWT74N0D7q/NuVn1KXzREQiyMi6ezzujzJolpNVUNkJFlnSHl+EqnfFiiR5ALZ7Nts4uWLe4Vpn0XmyvHoAVDBK3fw7e3n0tIG4x6k95guIWRKdDpYLOTHOe9jKJbc6KxdGmt21/5pX4KdeWavwirKRcXW6ReJIOVF+KREEZZOGWu7UKWgqgdaMuvxO472zzXzxTBvnpOmnxl/oIkhs23OPxHEwHXX8gXnyA60hd2tthCfmzfI48wWkO40cUTFnqO8htWRXwbUa9gYTjYWDTmoIyK9AgO+PfBLNqx3JzJYAymDcw39ItO2lIcEBkZ4=',
267 version: '0.3',
268 previousVersion: '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544',
269 previousVersionKey: 'RDzOj7LWZcdVg5KmmIT5VXM0cUFeC9tC3n0IXDfNpj12cq0w3k1rpBYbt4eSEkOcdM7Va07FPNdZY4Pd65xBo2MGc56Ka1pX3wW4jTxz350qtw==',
270 creationDate: 'Fri Sep 11 05:54:50 PDT 2009',
271 updateDate: 'Fri Sep 11 05:54:50 PDT 2009',
272 accessDate: 'Fri Sep 11 05:54:50 PDT 2009'
273 },
274 '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549': {
275 header: '####',
276 data: '0ck0NbHAOYieUs5c1U6xSMf3pj743aIv1nnBnB7f4vsvKpMiYleQwr4SwY1W6vhg+3sLnO9C0CCD8Brt4V1wScz/STp4oB3hoy31W4dsAFsUyAWFJ8MrYDsZW3jotIPVbMKxu+4Yp051iDPcFKimDhfAu1zVyiVE9llNj3tP6d9gukUNfGZ5CvFmEXcheHB8t81Z2tgeO70EELFUn7uqKJwh5xCqTeogPtsifmCjgx8Yo6hi19vl2TDAaX0HquFO3WcIAL185tzYZ5rU23BYwxD7hVfan7lngSVq614MsEB3EX9WiHRoissSSajNkKTlTW8zsNj3VlUXKMQiJ2aA9Pi+/Yt9sNAbmyTl6T5TNN4QSquLPLyxO4p+OIjra1WPdmVsCti7fOyGirogfJF0XhZg4imvGXK0c6lPZIlg/OEnoDSTiHXlOYpSgaEw1Js5HZ+390XY0KYPtpsZlY+oeVS4p29HN7x3CEairuIldEsZrk4whiVcwzlnmw3n8wiewumus4eRh9w0CIwJELKeMiz5cX4bX8+AKS+u8O1W0GwKlEGTj/joA/M=',
277 version: '0.3',
278 previousVersion: 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd',
279 previousVersionKey: 'moIwxP20kmN6f/+pgb8pJNqsLUz8Qo2BvcAFnXBmiX2E4oL1pakM9iq0e3IAiNLApmID2TwyAxhsmKj422R9uWXsUFd84LRRt6lMKa3/u1dC1w==',
280 creationDate: 'Sun Oct 04 14:05:10 PDT 2009',
281 updateDate: 'Sun Oct 04 14:05:10 PDT 2009',
282 accessDate: 'Fri Oct 30 10:52:36 PDT 2009'
283 },
284 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
285 header: '####',
286 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
287 version: '0.2',
288 creationDate: 'Wed Mar 14 07:26:35 PDT 2007',
289 updateDate: 'Wed Mar 14 07:26:35 PDT 2007',
290 accessDate: 'Wed Mar 14 07:26:35 PDT 2007'
291 },
292 '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043': {
293 header: '####',
294 data: 'jt/CbXS+TEjH/jPrstH7cQZGK3yse470grrhdAOdWoGVtFMmL7fMJZQOKm5IQSrMHFEsH3PoSs99Rr4ui/u71vUb6s/TIsjyv7yihnCYVsOEJOPcnL2wynciILV8p48Lky1wGztW+oSynYOG0CGYDofFhF/MNCBsG1EcTqW7Cf+8rUiS4nA4ZRZVv3HsZp6rCabJsAoK1pmf5tXGJHPjS6xdy1A9ea4bV5Gad0pu8IXvjbZTrDymHem0t8C+oZ7uJ/mG9cFVcNykXoO/TDP0goD6KvTqtdY3VWNNTAERycAW6jFtdMv2W/AFNmnYatZ+EbSbj6/RyGaNnRv/ceBitMh73HRr1EVtZw0wPthMBXwnlPbpkfUwWPBHYpwImligm62/6YBhxDgnMZta7TSi8apT',
295 version: '0.3',
296 previousVersion: 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521',
297 previousVersionKey: '8BbhE8C41VX8B8m3TbfLz4bgSfE01IAUl8Zlu2YFdEhpw1erqInN1eRE6WLyBB5MxckmJpbn6VSizqbFbi/3Id5p/fibHKmbmNp6xu7iIo5zzA==',
298 creationDate: 'Fri May 22 03:30:43 PDT 2009',
299 updateDate: 'Fri May 22 03:30:43 PDT 2009',
300 accessDate: 'Fri May 22 03:31:39 PDT 2009'
301 },
302 '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544': {
303 header: '####',
304 data: 'XKsPGp4MeuvDrgikcjbMnmw/Gz74sTfyP3lLylbrtEZJ3aGSjRvE7s9o3Ya9GKRhYxNQ0dXT0vM6xIE6r/dMt8PwU+/5dNtRhCGPAHvKmEEGb6EBwR7gUDxQLyFTAYX8ut+CpyNJLQa2pHoEl5aNUTjk6blYrKp0GHKt2Q3PZrjIn78rcOLcKY5bx4OK0h9rN0G8mOFQ0g29knKyaykv8dja/Uy5XBeshKnVT7YRHk1nRuwz69ZcX+1Z2qzfw5sxJx+fDK+otWVpjzDP02qqn7ju/r3GgSnW8p/ghBeurUCLdQiS+fFAevhOwCkZGjPMntG3Q4qVt42VxIiiuvfShdaSsNMOW9Uziew3XwOYL9mNIOSdPSjtry4sKrAh3XNmfuJjWTy+69Iyi85CtQ6xMFilANgSBfTqThUePCrEkv9ZBbvpRovuuljlxqZ3gUmtvwy9a3ACAr8SMGWX0ydQjKyvZhoGRCBM+ZC7zCe/JmIpdklvNd/+HqUgS2iAnf3CeH4gUPQVizFR04Ysgj00xO6v4bdY2bYVKIxunygBGNzySi8DeSREu/rUKWgx0KY7S+Gg/jqFMYpE9oy8CxUCmSLeNrnxUgprPqKrr72yue0kBGVoYyJwhXo4MG+LPV0rtVp8b2GeHE9fYmyEZO2Ke93SrHjezS6CnWQsvjYsFYCLdLtEGwo3mpS46DF69LlO53k=',
305 version: '0.3',
306 previousVersion: '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447',
307 previousVersionKey: 'eEvij0YZ1r+5cNNpleVHE+kjCZlSggZuE+3Kum9b/11JGHTgQ3bY/o5amM+4+FPaiCU0Zd6MWFAI4dPscyvAS9in6WdTOm7z3fQ3uqYAtHghPw==',
308 creationDate: 'Fri Sep 11 05:54:01 PDT 2009',
309 updateDate: 'Fri Sep 11 05:54:01 PDT 2009',
310 accessDate: 'Fri Sep 11 05:54:01 PDT 2009'
311 },
312 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
313 header: '####',
314 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
315 version: '0.2',
316 creationDate: 'Wed Mar 14 07:30:09 PDT 2007',
317 updateDate: 'Wed Mar 14 07:30:09 PDT 2007',
318 accessDate: 'Wed Mar 14 07:30:09 PDT 2007'
319 },
320 '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': {
321 header: '####',
322 data: 't4ohy1/z6oUzyQLtqQoumRzcLCnaYjL/+WQGwE6yIXaGEhCWywe0aIVusPKLcsfYTCXVU1/dXtuucaZoMw7PMSOUx9awTp14NmShaT/9VKChZf1TLi0CO2jOUGsvO4DHlNAQhJhas431l83F+h5+hrkqX8j5kIhzpwlroGEjkml0fswmmwDyHbSTgVEyErZc+b3V+9oUCwzYvd9ITHh8uWLa6j+GuwZTZAk2FY7Vzoh9K46WO3/qCz1pJ8JVkcffun9alK8qzK0Wp05mMLIrt+WHFFTKrG9zpBkcswkbwhJ5ZnakfYLJ8GPH7fKnAid1FGW0Owms058smDBmFO20HyH+ho7SL80Q689W+Jx0+nkUKvxWtq9BWLW6Z3ClDZOVITeg35gQVr6aRzZ+VZwbAy++',
323 version: '0.3',
324 previousVersion: '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043',
325 previousVersionKey: 'i4e0h4QhuN0B39drNLsOWruy+R64siKHWxc9YXgpoCPitWL/ika1MVCRX7CJC7lH5WD9yzx6l9isAy/Hb3nUIEp97VcFKG4S0gOaZkdWNZ/U5Q==',
326 creationDate: 'Fri May 22 03:31:46 PDT 2009',
327 updateDate: 'Fri May 22 03:31:46 PDT 2009',
328 accessDate: 'Mon Jun 15 15:20:17 PDT 2009'
329 },
330 '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447': {
331 header: '####',
332 data: 'LDAixBQ/CEqQX35jio3aAXG+Py4wNylXI1mQJ5IDxnpqmkFZfOXCaScpwIkQwQzEOjh9p3cOShzrBm6r234HKxgg0ufFnkTWbQSjCgekfVEqiBFi2rWSj5v6a5LMANLwtCz0b2IPr6Z8LSPddgao7P0nwBdCiKJAnY/uGdvSn67WSFhAUGAIs5ZKIZQf8Zi+cA3hd+Xlv1W/2+OXLaIPTkD1bCuQo5qEiAoOl5mXngWOmQ2kTGpC7Hfkknm/uzDeiZTe8VpGjqKTwB/tl64LU5OD26DMpihnVeQNqMpYndEJO7Yu9Zodv8WMyYmVlrw1UzTB4BLTL337vVm5uBiUjAfJIwJx3b3fXxdEiWFuK8uwOXAO2X9OOKfLPuowOj21B/+zRLum3Dti23IfHab5KwSq72sB/vjpl/KVbcGsWZET4VTCZvO04T6Emjb2UBLFLIgInZ9tqN4RXSKz0Uj4n+pitmFSDleuPtL8EzEESX6FtmT/IVdr5AGNjv93wIk5CgeoK2YiNlpTb+CHbcA5HPn+TH9T4999mWrJh5hxZ1vGYxlAd1AveMCgA3y/Wl+kZKMnUatXPM0deUS1GnzpoRXtI0dUi6J5sOHxeahZL0TQbCbHcKkoaSJklMl5YEVaLXyakO4ATKyNcsPfDQrPvWfra1I59RI3seStv2Q0bs14Zco+0opvKN71R/HxjF/etUU=',
333 version: '0.3',
334 previousVersion: 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b',
335 previousVersionKey: '3JAEXzigeX/PwpA42+K/CPSpP40EO/j++M6pB0NF71EfKCApWSWy89flo0KbrckF+mUAjyY2hLYBc/F+Q2vgGNhAZqq0vo3wcUpFjFktqgRZ4A==',
336 creationDate: 'Mon Jun 15 15:21:15 PDT 2009',
337 updateDate: 'Mon Jun 15 15:21:15 PDT 2009',
338 accessDate: 'Fri Sep 11 05:53:23 PDT 2009'
339 },
340 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
341 header: '####',
342 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
343 version: '0.2',
344 creationDate: 'Tue Apr 17 10:17:52 PDT 2007',
345 updateDate: 'Tue Apr 17 10:17:52 PDT 2007',
346 accessDate: 'Fri May 22 03:27:59 PDT 2009'
347 },
348 '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5': {
349 header: '####',
350 data: '8mmpKGrkSqiLyreEtGdKN9EXeb47uEN+XkSXEhdIxkMkmvR0A/AGtKjG1o6bbSXfPzAtfrMfJJxwyhWcRVqcikzc0KwINua4X+1Grf7QG2IOYYFqujmLyCwClGSRaannCAbio7+YI2PlDrlMrwB38RvMde6zrMfZzl2O75nkVX3DH+5IHJpwwYeukTSAu5EQR17oed+xoSHkKCQG3ToTsbnGPwZSGM0D+aiTXVW+PJD8D8LvDEU8i3EHQ9E02+d3dKPV/3FGRDgvwLIIjHU0qX5khYJ9PjqSgAxOhRKFwnG1kJn6NG1rvsXYgefJORElib/xijoCM9EJkUZ9e340WwhfZa1GbV7gLEbVn2aeaLcaTjhtPz9pL9WQOklChvdi/0XaHRrgflHogqC0qUQ63lA2CFOXwR9EXspZIi+zLzgAaEMGN0NlnbGHjAiVz6SVU/RUkh3DkKmMuGNS1n93spVbMMLZgcT5zxBFzT6jARvC8qKaxe9UlbMIH8ZCXMrq26V/sEZrxmPT3FZB+dmmqA9lLEBFEcw927uu1U3kZwXhQArQCN3MbEQ=',
351 version: '0.3',
352 previousVersion: '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549',
353 previousVersionKey: 'gxQ13UMdZF0F7chGySUkuhxxSJ7CU2wubdG0tijs2G9uxYEY6ADjVX6zi3nrft7ggnLM8LyuFtZqj1wMX3pMUsbxZq0v2vfpVaYZ9cN1pahwMQ==',
354 creationDate: 'Fri Oct 30 10:52:54 PDT 2009',
355 updateDate: 'Fri Oct 30 10:52:54 PDT 2009',
356 accessDate: 'Sat Jan 23 02:24:21 PST 2010'
357 },
358 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
359 header: '####',
360 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
361 version: '0.2',
362 creationDate: 'Wed Mar 14 07:27:35 PDT 2007',
363 updateDate: 'Wed Mar 14 07:27:35 PDT 2007',
364 accessDate: 'Wed Mar 14 07:27:35 PDT 2007'
365 },
366 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888': {
367 header: '####',
368 data: 'ZRJXJ72ZBH01gAML0R7n42fI0WjdbVXzyZH7H5MP2RgtGuVvfdadVK9+U8mzdf1Et9DoKrHhZUp9baeREPO/Fk0r2IO8NmKv/8+rMkK6x4qeWnI8ZAJfQemGtqke/VcTn4KGAyTeV8arzXn/whsLpp/xN087NdDw9dP8PLb43Yk8TNC1m2d85FUagSh4NOI3rmcbHAiCOQpqHBPBoJY1Vf4Pxu949TEUm6kT6Rl0n/sb3PSLu4LSa6+WiGZJ4mgE+3XZyfozrJsvGoTYSkim3MTwhrCLEVaDMTq4Ei6FyG+TeV95Q9Ei8HHwBqdp0fxUxavNe67Oo4m+ECiRvZ24b5+Nz6POBjXfn+61yCyIhz3SV3IaYIF3rgXRZA1q2sax8kRGtoG7ONxczUqGyQ5S6Lht',
369 version: '0.3',
370 previousVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
371 previousVersionKey: 'ZbGA3id5JTGeRjVUR/LkntSGjPDEbZbNrQxc4SiQDdlDO3dJNVpfRp69PSk6vqEiZ4r/6OKvE+fl2TtPadJQ82fP7WsULtrSkYryQL+CQvz0VA==',
372 creationDate: 'Fri May 22 03:28:11 PDT 2009',
373 updateDate: 'Fri May 22 03:28:11 PDT 2009',
374 accessDate: 'Fri May 22 03:29:03 PDT 2009'
375 },
376 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521': {
377 header: '####',
378 data: '6TAJAQ4qE5l2SybVzeEqQxYZgVow0MKzl8xwfoE0HeuSr8uJlszGas5NaJL1SFI5sDDwIJzbtIBE/yjaNwWw18+JzswIWmkLW+kTIAtJKjNtWnaGlDJMTA4OIo5gj2Vqq4o1VngzMTk/DV6f5ob3/HxN+YpE4r1u2SUVeADbjcyjRmYE9ygvuvQ5AuU3u2hzmstI582kBlksLPGhX6nJfAPCrSkdphNj28T393p5w82/FFCFNHKjgKN/xI3Rotq7rObFaNid1tmHvozKLYeLQQfjglJ2rRDQDTOJONRVJEObDFV5bmaY4z3XljO2nbQ4iMK5CrTFAYTYNph3/WOQWjZHWmAXaHMYvBSlICvF99C530sOGQYIaBWKFuOv/pNuCZh/tBNVcI4pU1dz438/7LQf',
379 version: '0.3',
380 previousVersion: 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127',
381 previousVersionKey: 'U2Z+xaFl6o4XH/8DktJimjP3+1PaYRf1mZPW0sulAOykDH0LY2U+kbBj+mfNV8rVAJlA7O8LYl8AlUNZUTS+036MiIinpD0Tmhkc91rFkMYgbw==',
382 creationDate: 'Fri May 22 03:30:03 PDT 2009',
383 updateDate: 'Fri May 22 03:30:03 PDT 2009',
384 accessDate: 'Fri May 22 03:30:36 PDT 2009'
385 },
386 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd': {
387 header: '####',
388 data: 'zqOJI8Qken5hwXQ4MFRzfnB5tnROjMhg9mw+aYwwvI8VV8aADoyPuaRi6bdxy4LP45PqVR9G2iXFT+h/WaBql+rz1AA5AVz54cpd2gdDh8Eec/PJXyL3SfXW1PQoO3bwhW6rkR5cNQf8xKxlmGWLvE88AXT65tV/RdYJE574aVEZexzo/40X60weCl1ZITl8IH97eug5URe1lSBFsy5sjo+SE09FqtnmnGy4O2LL+0XSR7xJqiJihv80msEgk3lTbwUEiGWm3OiDnvLk0GjaMy3+EGV2/rHZuICMJkD4ge6cIBc/h00ZCFnXN4bX+OC/KpEFgtnPgQ+duVpsVNdYmNwxSavyFs/UnFFDTDIPZxEKhRHFTW9zaqu2jVTZd4+/ro6TSYSlEN6F/jtiL06nM/F14Bp/dYuqBZfc+N3vx+72jj6IOKTHtqvlj6jdSZseN8olODT2IGI/fsjR79biVCIOODAaF6DCd32ClvoenCVPTIhMc2AfuKTbleiquk95nN4lgpZbMzrrvWHPJD0oKXHo8X1GJd19QCj+IhzCTx1Ap1JPOTMIG+reaxxwicGjH5Iios5DmA4gjsRWj9BVr+QmMJmY4KTpyRG1lVYovm78VWf0nzyGLNx5sgWrRyYLOI75m0zUdNGDUpKGSyqrIuEwOrI36uRr71MvJ0ui1HXBkDbPIvrQ01UyocO1paeHyTk=',
389 version: '0.3',
390 previousVersion: '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda',
391 previousVersionKey: 'zOAbF4q8A+LjWfMMXHRHH2DmzdToA6a2U12y0G6cyAm5tvz1BrrAcgk/5dx0yvFF+ZSxuOOfnvCPVBN2kT75otq44tVEg+FSJ4khcC6HThCluA==',
392 creationDate: 'Fri Sep 11 05:56:02 PDT 2009',
393 updateDate: 'Fri Sep 11 05:56:02 PDT 2009',
394 accessDate: 'Sun Oct 04 14:04:58 PDT 2009'
395 },
396 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
397 header: '####',
398 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
399 version: '0.2',
400 creationDate: 'Tue Apr 17 10:15:09 PDT 2007',
401 updateDate: 'Tue Apr 17 10:15:09 PDT 2007',
402 accessDate: 'Tue Apr 17 10:17:01 PDT 2007'
403 },
404 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b': {
405 header: '####',
406 data: 'Al9KSfdnvVJW+GPqYbIGXNDb4KefUjtkNTJbk0zlBsyeZc+eoDDLJKy3ukugFfDFDmX+g0U3lp1UIsRQB7JHEZ+NWKPJu/hyvbTmwuVFZUnGEZMhMOIqc6nECN+VFCllxV7QBKpdcRJ3E3fiYP4fV0v8wquOD1dfsMs26f3y2fOQLNS0+UpDe0GoRw2R3+lbot3qlftdO6vb5+LYjZEjdSI/G2fPQ3VsS8N0KLLNVHQxix4xn4Qn78i/ImlxbtyoKNLP4ZIaXZ9ELuGvV+yKaQVOVTwxpJOWKMu1Do55cMwdFjxU7Gid03xEYEaZpClcsrbwdGgkJo2+WnpC/L9G4I9X5L+sVISbO49PaZ9DMdQJAlY5QCIjokPchYUp9Vr9u4KcgbAw9FrLQAMSRLnWhf0bLr0mv2ioTOlQKPFBkTIuMnsyglD856ZYQOIHl48+K5HvUZYZqI5UJjPXdrmzycD/Yxt878pSnkkfeyX0Cr/7Rwfq/zOPN5XJcwsO6j9ubuXjnIos0E/SG1BOKrLY+sE7SXzWOqhpzkApb6ILaGhtHNOHmYAckpPAqCe85g/XPZsmWjsABB64Gwg9oviC2ew/IDXigNXGtY8tbQmAny58QPfRihT5HxCRMFP2pA1Xh2WU1vEXtP8=',
407 version: '0.3',
408 previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7',
409 previousVersionKey: 'B0wCj/b+UZP07a7VlnKVl/wtiaFzCmPux+T4tBFQati+nSNQCHUQM2XAQ3n1VWeewIyLjKlVI6W7SXRZnCxlcOdqBLDymDkhKfL0FIvmHNKmig==',
410 creationDate: 'Mon Jun 15 15:20:54 PDT 2009',
411 updateDate: 'Mon Jun 15 15:20:54 PDT 2009',
412 accessDate: 'Mon Jun 15 15:20:54 PDT 2009'
413 },
414 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127': {
415 header: '####',
416 data: 'mZNwCsPrEohGEYglwUcTQNPDGJWoQRcRDIoWJ482qFJu617UU3Y0hML3CZ+ALtITVpnZl6mGZ3nHCpigt5naJmvwjyV9O7SVkGjc7mrzvjQSP2jrlXGXVIPqjsywDgG74bmaOPLEstQ9Sb2UPGIdinYdDglvQsIaFHQaWHO9bSYLjitfuS+qH2erK/QhqJQ56LxSpcnF5pevfuKZVAkrfhYAhIxqSQ15lZ3QSHxJfT8pQntR8QWL65RetkX/c9eydWyPqVFKqCTghU18p2Omz74UEakBBh3o6DxeTw90UY4YM1tRmsalS3oYG00BFDfDD3mEVZNSrqsxdCikqUSEGvq82whYxsFTj/5fHVLoJybYg5MfpLR+iW8O94g9p2d3jx2mTeNNjOZp+Q5/Wc4rKS7r',
417 version: '0.3',
418 previousVersion: 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888',
419 previousVersionKey: 'RFTIyzDM9GP+QklGI/YfTgxB64iqyF7+c7bZntSZlFFDkiVN7pJbToZjl47c272J4dPXFxkORR2o+pIyYDdRvKQZQ/oHXp9aZi5BDKGwHYkl8w==',
420 creationDate: 'Fri May 22 03:29:12 PDT 2009',
421 updateDate: 'Fri May 22 03:29:12 PDT 2009',
422 accessDate: 'Fri May 22 03:29:51 PDT 2009'
423 }
424 }
425 },
426 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
427 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
428 version: '0.3',
429 creationDate: 'Wed Mar 14 10:39:35 PDT 2007',
430 updateDate: 'Mon Oct 27 01:16:14 PDT 2008',
431 accessDate: 'Tue Jan 05 01:38:41 PST 2010',
432 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
433 versions: {
434 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
435 header: '####',
436 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
437 version: '0.2',
438 creationDate: 'Wed Mar 14 10:39:55 PDT 2007',
439 updateDate: 'Wed Mar 14 10:39:55 PDT 2007',
440 accessDate: 'Mon Oct 27 01:07:56 PDT 2008'
441 },
442 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
443 header: '####',
444 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
445 version: '0.3',
446 creationDate: 'Mon Oct 27 01:09:11 PDT 2008',
447 updateDate: 'Mon Oct 27 01:09:11 PDT 2008',
448 accessDate: 'Mon Oct 27 01:15:58 PDT 2008'
449 },
450 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
451 header: '####',
452 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
453 version: '0.2',
454 creationDate: 'Wed Mar 14 10:39:35 PDT 2007',
455 updateDate: 'Wed Mar 14 10:39:35 PDT 2007',
456 accessDate: 'Wed Mar 14 10:39:35 PDT 2007'
457 },
458 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
459 header: '####',
460 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
461 version: '0.3',
462 creationDate: 'Mon Oct 27 01:16:14 PDT 2008',
463 updateDate: 'Mon Oct 27 01:16:14 PDT 2008',
464 accessDate: 'Tue Jan 05 01:38:41 PST 2010'
465 }
466 }
467 },
468 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
469 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
470 version: '0.2',
471 creationDate: 'Wed Mar 14 08:01:24 PDT 2007',
472 updateDate: 'Wed Mar 14 08:01:24 PDT 2007',
473 accessDate: 'Tue Jan 05 01:38:39 PST 2010',
474 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
475 versions: {
476 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
477 header: '####',
478 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
479 version: '0.2',
480 creationDate: 'Wed Mar 14 08:01:24 PDT 2007',
481 updateDate: 'Wed Mar 14 08:01:24 PDT 2007',
482 accessDate: 'Tue Jan 05 01:38:39 PST 2010'
483 }
484 }
485 },
486 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
487 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
488 version: '0.2',
489 creationDate: 'Tue Apr 17 07:36:08 PDT 2007',
490 updateDate: 'Tue Apr 17 07:36:08 PDT 2007',
491 accessDate: 'Wed Feb 03 06:28:13 PST 2010',
492 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
493 versions: {
494 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
495 header: '####',
496 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
497 version: '0.2',
498 creationDate: 'Tue Apr 17 07:36:08 PDT 2007',
499 updateDate: 'Tue Apr 17 07:36:08 PDT 2007',
500 accessDate: 'Wed Feb 03 06:28:13 PST 2010'
501 }
502 }
503 },
504 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
505 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
506 version: '0.2',
507 creationDate: 'Mon Apr 02 10:12:44 PDT 2007',
508 updateDate: 'Mon Apr 02 10:12:44 PDT 2007',
509 accessDate: 'Tue Jan 05 01:38:40 PST 2010',
510 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
511 versions: {
512 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
513 header: '####',
514 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
515 version: '0.2',
516 creationDate: 'Mon Apr 02 10:12:44 PDT 2007',
517 updateDate: 'Mon Apr 02 10:12:44 PDT 2007',
518 accessDate: 'Tue Jan 05 01:38:40 PST 2010'
519 }
520 }
521 },
522 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
523 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
524 version: '0.2',
525 creationDate: 'Wed Mar 14 11:09:05 PDT 2007',
526 updateDate: 'Wed Mar 14 11:09:05 PDT 2007',
527 accessDate: 'Tue Jan 05 01:38:42 PST 2010',
528 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
529 versions: {
530 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
531 header: '####',
532 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
533 version: '0.2',
534 creationDate: 'Wed Mar 14 11:09:05 PDT 2007',
535 updateDate: 'Wed Mar 14 11:09:05 PDT 2007',
536 accessDate: 'Tue Jan 05 01:38:42 PST 2010'
537 }
538 }
539 },
540 '6dadcd7ab23ece757d6990ce237bdebb68b2df0281c78cc1483d913318112162': {
541 data: 'u9H4/IGgoAZuCAc7IsjHXbWl9RlIcyWJQuF+upwUgeQ1asbr4SX0WtB5KIfcS91N2nCaNHbHJfr+fVAjZeo0rRd+6PGkmnMLwcluvanKN+5VnfG69Xp6Drs61xq7yxl+SD5AUiU77OcE7be2dRJC449CPA==',
542 version: '0.3',
543 creationDate: 'Mon Dec 14 02:33:48 PST 2009',
544 updateDate: 'Mon Dec 14 02:33:48 PST 2009',
545 accessDate: 'Tue Jan 05 01:38:43 PST 2010',
546 currentVersion: 'b5d9271386eb38764c1d80c2792eb985d47909f2e0dddd16047f1a6415b70508',
547 versions: {
548 'b5d9271386eb38764c1d80c2792eb985d47909f2e0dddd16047f1a6415b70508': {
549 header: '####',
550 data: 'g84GdVAIChqt5x2dNYsVR52cAtNqtO9NBRf3ljXQymtSLYEKgIep0jkzRTlni9fj2Np/MJ1qQg0uGn3qyjukHC8t7n1L52q5OxkrF6ffuYAlP/E8+NQo4Bm3UxmGEsmD8mbH3kVCi8LOJx0ZGaE5SqwafO4GWz5j8YX+dOfuhz2pKdpU6NaSrkCb21RJN+vOmAs5LQ8TfCLc1hd9FPxU6w3H9ys+Y5D6K3XP1cP1PU5N3vTFeq+Yl7n15xOPTsO3e88vPFtINpVjrv8h+VRy1U63MOWXkrHWwdUPKIBWx3nqg+H3dDH+lONWvrfriIMJKlQGF6jzfJFBV6yMArbi6lBlgPMOFIo5Pt4DYkHQvon7JlSC3JbHCIA=',
551 version: '0.3',
552 creationDate: 'Mon Dec 14 02:33:48 PST 2009',
553 updateDate: 'Mon Dec 14 02:33:48 PST 2009',
554 accessDate: 'Tue Jan 05 01:38:43 PST 2010'
555 }
556 }
557 },
558 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
559 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
560 version: '0.2',
561 creationDate: 'Mon Apr 30 16:10:17 PDT 2007',
562 updateDate: 'Mon Apr 30 16:13:27 PDT 2007',
563 accessDate: 'Tue Jan 05 01:38:42 PST 2010',
564 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
565 versions: {
566 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
567 header: '####',
568 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
569 version: '0.2',
570 creationDate: 'Mon Apr 30 16:10:17 PDT 2007',
571 updateDate: 'Mon Apr 30 16:10:17 PDT 2007',
572 accessDate: 'Mon Apr 30 16:10:17 PDT 2007'
573 },
574 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
575 header: '####',
576 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
577 version: '0.2',
578 creationDate: 'Mon Apr 30 16:13:27 PDT 2007',
579 updateDate: 'Mon Apr 30 16:13:27 PDT 2007',
580 accessDate: 'Tue Jan 05 01:38:42 PST 2010'
581 }
582 }
583 },
584 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
585 data: 'xSjnJLMCEBBiOM2RxFm2EUCxMy9a2eexGsBj851cR/PsJlfG1lCh8HwD1i7HEWVFB2GBK9Pf+U7TpNSYsq9VY+AzBNz4p1aSg3Hswoou4OpCCgnBpeNLkr0q7KBmSVmSH+omECgWzbqux3LiqT7yEWxemVRA4ah4a09DvhB9bpVJiteBGg==',
586 version: '0.3',
587 creationDate: 'Wed Mar 21 08:29:06 PDT 2007',
588 updateDate: 'Sun Oct 04 14:06:08 PDT 2009',
589 accessDate: 'Tue Jan 05 01:38:39 PST 2010',
590 currentVersion: 'a999c255e435e85633f136d0464f29e6d41f87f46e6fb50ca63adeede9a6650a',
591 versions: {
592 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
593 header: '####',
594 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
595 version: '0.2',
596 creationDate: 'Wed Mar 21 08:29:06 PDT 2007',
597 updateDate: 'Wed Mar 21 08:29:06 PDT 2007',
598 accessDate: 'Sun Oct 04 14:05:49 PDT 2009'
599 },
600 'a999c255e435e85633f136d0464f29e6d41f87f46e6fb50ca63adeede9a6650a': {
601 header: '####',
602 data: 'xw9i2USOB2xkgG3MBp1+qq9e2nwapnEt0usRAVmUWXcGGLbXJi+ImdrFNGPg3TSZrTIXMdEbLmjxAcxpTWlBfd5NhBVDzY2q/stiNaUWfI8JAHdl7E2CQRHa9quVnxPzYytVbUP01xoUokBWKQnqHZduADt7OKcgLy5iheR0ECoFXT6lKcJtD8mV5TZqKlYHkhNR8FehkNrhX2BWfxDHtlxZQNOK6xBCHF9YQGk3PQqmeIAbvxMiN2sGCdH4pXAURHIcF4uayV96bmCa42r+i4h2p46BcNghSR84ipC6Fyh1y+oGyZ5GqaolmVQcZQ5UbCba57+r5OOSWqmpmbhyoZ8rPOa/ZYFiZDj9UqNl7Ny6fB7PqWjVs9oSLb3oLe3oqfrONvJ/WmttA5J/jztDYYN0peN4AAEiNQLnFZuoHp4S+Wxuf0c+99N+I0egIIgIw88+ssowwMY6Xrf6sxEmA7B6hXB5V7TO3J1DGkVr4Kw6NgxMrFVw1AlqNpBrxKdREYaGRmLwB8/jOC9tr2RzP6SPylXzeOk9/v3XikG0CZckPATqLG2otmZ0pVpJc5XwyKKhDAZWYEzPKXXZoLfdNoa4SAiGF7/otBtH8k1D8d2rDMlhigIjtYR8WvBxCdfvnFeD8w0zewymA1Fbj72Dv8eHtnnNYYsJiHldQimSgcaGkmyFr0oVPo/skLjRjBsQVbiE066eTAjqrcAfKK7pg295Mhgo1aU9cyFPfOha1yiM6BKulihLTMbCr2+KTdMGagVnBxKFmfWJBNbl1J/b5ztazo3A4rIOddUPmGj0uQpaOVLDaFIVvs+3d13JB3iyYOz1nAYlOptS0yzNEMlJMDX4F5gkABGFazoPPQ7PgQ5JUmRrO4BBnp4HvJHNY0Ix9LOUfaLcp/533C43fHTcofB0AVqpdnU2R4lPl9FkUsyeQ1vmY3Z7tE0ZNbM3rE1P26LlEfXg9xbSBzRwS5EOxZF2ZJv9h9a8VPPbMnEUt0dZrXhyUycHF4SfnKLmepZkHTnco64kY9Mc0vJzy5gPCF7z6SDzeA35SX2T25Rl6M+xKSeU1vCv5kPWDpacFhXX/aVJnSlgjYKEWzV4jTGdlg2RA+034JpbsJgDTIqdLYdC44EyZwocR7MObXf0OTprugDIM9AGHFlxPda+TO6Cg0mI7UMYEP/D7AU=',
603 version: '0.3',
604 previousVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
605 previousVersionKey: 'tVHT9HgAaAzSOMZrMyvyTvuJW6P6cSGU0lUWky8NCtKipfN1BPGcX3sVgEf/PTXwKlNxTgpogRDGhDMIl01RHPaqAIXY+W4x/u3bdH/c2NTlJg==',
606 creationDate: 'Sun Oct 04 14:06:08 PDT 2009',
607 updateDate: 'Sun Oct 04 14:06:08 PDT 2009',
608 accessDate: 'Tue Jan 05 01:38:39 PST 2010'
609 }
610 }
611 },
612 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
613 data: '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',
614 version: '0.3',
615 creationDate: 'Thu Feb 12 03:45:43 PST 2009',
616 updateDate: 'Thu Feb 12 03:54:37 PST 2009',
617 accessDate: 'Tue Jan 05 01:38:39 PST 2010',
618 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
619 versions: {
620 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
621 header: '####',
622 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
623 version: '0.3',
624 creationDate: 'Thu Feb 12 03:54:37 PST 2009',
625 updateDate: 'Thu Feb 12 03:54:37 PST 2009',
626 accessDate: 'Tue Jan 05 01:38:39 PST 2010'
627 },
628 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
629 header: '####',
630 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
631 version: '0.3',
632 creationDate: 'Thu Feb 12 03:45:43 PST 2009',
633 updateDate: 'Thu Feb 12 03:45:43 PST 2009',
634 accessDate: 'Thu Feb 12 03:45:43 PST 2009'
635 },
636 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
637 header: '####',
638 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
639 version: '0.3',
640 creationDate: 'Thu Feb 12 03:47:39 PST 2009',
641 updateDate: 'Thu Feb 12 03:47:39 PST 2009',
642 accessDate: 'Thu Feb 12 03:47:39 PST 2009'
643 }
644 }
645 },
646 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
647 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
648 version: '0.2',
649 creationDate: 'Wed Mar 14 07:51:17 PDT 2007',
650 updateDate: 'Wed Apr 25 02:14:05 PDT 2007',
651 accessDate: 'Tue Jan 05 01:38:39 PST 2010',
652 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
653 versions: {
654 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
655 header: '####',
656 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
657 version: '0.2',
658 creationDate: 'Wed Mar 14 07:51:17 PDT 2007',
659 updateDate: 'Wed Mar 14 07:51:17 PDT 2007',
660 accessDate: 'Wed Apr 25 01:37:27 PDT 2007'
661 },
662 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
663 header: '####',
664 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
665 version: '0.2',
666 creationDate: 'Wed Apr 25 01:39:26 PDT 2007',
667 updateDate: 'Wed Apr 25 01:39:26 PDT 2007',
668 accessDate: 'Wed Apr 25 01:39:26 PDT 2007'
669 },
670 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
671 header: '####',
672 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
673 version: '0.2',
674 creationDate: 'Wed Apr 25 02:14:05 PDT 2007',
675 updateDate: 'Wed Apr 25 02:14:05 PDT 2007',
676 accessDate: 'Tue Jan 05 01:38:39 PST 2010'
677 },
678 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
679 header: '####',
680 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
681 version: '0.2',
682 creationDate: 'Wed Apr 25 01:51:49 PDT 2007',
683 updateDate: 'Wed Apr 25 01:51:49 PDT 2007',
684 accessDate: 'Wed Apr 25 01:51:49 PDT 2007'
685 },
686 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
687 header: '####',
688 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
689 version: '0.2',
690 creationDate: 'Wed Apr 25 02:01:21 PDT 2007',
691 updateDate: 'Wed Apr 25 02:01:21 PDT 2007',
692 accessDate: 'Wed Apr 25 02:01:21 PDT 2007'
693 },
694 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
695 header: '####',
696 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
697 version: '0.2',
698 creationDate: 'Wed Apr 25 01:59:57 PDT 2007',
699 updateDate: 'Wed Apr 25 01:59:57 PDT 2007',
700 accessDate: 'Wed Apr 25 01:59:57 PDT 2007'
701 },
702 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
703 header: '####',
704 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
705 version: '0.2',
706 creationDate: 'Wed Apr 25 01:38:17 PDT 2007',
707 updateDate: 'Wed Apr 25 01:38:17 PDT 2007',
708 accessDate: 'Wed Apr 25 01:38:17 PDT 2007'
709 },
710 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
711 header: '####',
712 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
713 version: '0.2',
714 creationDate: 'Wed Apr 25 01:56:58 PDT 2007',
715 updateDate: 'Wed Apr 25 01:56:58 PDT 2007',
716 accessDate: 'Wed Apr 25 01:56:58 PDT 2007'
717 },
718 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
719 header: '####',
720 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
721 version: '0.2',
722 creationDate: 'Wed Apr 25 01:58:33 PDT 2007',
723 updateDate: 'Wed Apr 25 01:58:33 PDT 2007',
724 accessDate: 'Wed Apr 25 01:58:33 PDT 2007'
725 }
726 }
727 },
728 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
729 data: '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',
730 version: '0.2',
731 creationDate: 'Wed Mar 14 08:06:54 PDT 2007',
732 updateDate: 'Tue Apr 17 10:23:41 PDT 2007',
733 accessDate: 'Tue Jan 05 01:38:42 PST 2010',
734 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
735 versions: {
736 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
737 header: '####',
738 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
739 version: '0.2',
740 creationDate: 'Wed Mar 14 09:27:40 PDT 2007',
741 updateDate: 'Wed Mar 14 09:27:40 PDT 2007',
742 accessDate: 'Wed Mar 14 11:00:21 PDT 2007'
743 },
744 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
745 header: '####',
746 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
747 version: '0.2',
748 creationDate: 'Wed Mar 14 08:09:07 PDT 2007',
749 updateDate: 'Wed Mar 14 08:09:07 PDT 2007',
750 accessDate: 'Wed Mar 14 08:39:40 PDT 2007'
751 },
752 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
753 header: '####',
754 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
755 version: '0.2',
756 creationDate: 'Wed Mar 14 11:01:05 PDT 2007',
757 updateDate: 'Wed Mar 14 11:01:05 PDT 2007',
758 accessDate: 'Tue Apr 17 10:20:33 PDT 2007'
759 },
760 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
761 header: '####',
762 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
763 version: '0.2',
764 creationDate: 'Wed Mar 14 09:17:20 PDT 2007',
765 updateDate: 'Wed Mar 14 09:17:20 PDT 2007',
766 accessDate: 'Wed Mar 14 09:22:06 PDT 2007'
767 },
768 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
769 header: '####',
770 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
771 version: '0.2',
772 creationDate: 'Wed Mar 14 08:06:54 PDT 2007',
773 updateDate: 'Wed Mar 14 08:06:54 PDT 2007',
774 accessDate: 'Wed Mar 14 08:06:54 PDT 2007'
775 },
776 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
777 header: '####',
778 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
779 version: '0.2',
780 creationDate: 'Tue Apr 17 10:23:41 PDT 2007',
781 updateDate: 'Tue Apr 17 10:23:41 PDT 2007',
782 accessDate: 'Tue Jan 05 01:38:42 PST 2010'
783 },
784 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
785 header: '####',
786 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
787 version: '0.2',
788 creationDate: 'Tue Apr 17 10:22:08 PDT 2007',
789 updateDate: 'Tue Apr 17 10:22:08 PDT 2007',
790 accessDate: 'Tue Apr 17 10:22:08 PDT 2007'
791 }
792 }
793 },
794 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
795 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
796 version: '0.2',
797 creationDate: 'Wed Mar 14 08:36:20 PDT 2007',
798 updateDate: 'Mon Jul 09 06:10:15 PDT 2007',
799 accessDate: 'Tue Jan 05 01:38:40 PST 2010',
800 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
801 versions: {
802 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
803 header: '####',
804 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
805 version: '0.2',
806 creationDate: 'Wed Mar 14 08:51:02 PDT 2007',
807 updateDate: 'Wed Mar 14 08:51:02 PDT 2007',
808 accessDate: 'Wed Mar 14 08:51:02 PDT 2007'
809 },
810 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
811 header: '####',
812 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
813 version: '0.2',
814 creationDate: 'Mon Jul 09 06:10:15 PDT 2007',
815 updateDate: 'Mon Jul 09 06:10:15 PDT 2007',
816 accessDate: 'Tue Jan 05 01:38:40 PST 2010'
817 },
818 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
819 header: '####',
820 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
821 version: '0.2',
822 creationDate: 'Wed Mar 21 04:56:43 PDT 2007',
823 updateDate: 'Wed Mar 21 04:56:43 PDT 2007',
824 accessDate: 'Wed Apr 25 00:59:58 PDT 2007'
825 },
826 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
827 header: '####',
828 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
829 version: '0.2',
830 creationDate: 'Sat May 19 02:26:44 PDT 2007',
831 updateDate: 'Sat May 19 02:26:44 PDT 2007',
832 accessDate: 'Mon Jul 09 06:08:39 PDT 2007'
833 },
834 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
835 header: '####',
836 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
837 version: '0.2',
838 creationDate: 'Wed Mar 14 08:38:54 PDT 2007',
839 updateDate: 'Wed Mar 14 08:38:54 PDT 2007',
840 accessDate: 'Wed Mar 14 08:38:54 PDT 2007'
841 },
842 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
843 header: '####',
844 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
845 version: '0.2',
846 creationDate: 'Wed Mar 14 08:36:20 PDT 2007',
847 updateDate: 'Wed Mar 14 08:36:20 PDT 2007',
848 accessDate: 'Wed Mar 14 08:38:12 PDT 2007'
849 },
850 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
851 header: '####',
852 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
853 version: '0.2',
854 creationDate: 'Wed Apr 25 01:04:29 PDT 2007',
855 updateDate: 'Wed Apr 25 01:04:29 PDT 2007',
856 accessDate: 'Sat May 19 02:22:01 PDT 2007'
857 },
858 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
859 header: '####',
860 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
861 version: '0.2',
862 creationDate: 'Wed Mar 14 08:52:12 PDT 2007',
863 updateDate: 'Wed Mar 14 08:52:12 PDT 2007',
864 accessDate: 'Wed Mar 21 04:16:29 PDT 2007'
865 }
866 }
867 },
868 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
869 data: 'CPY8iR/pjIj9RJQLodhZzqAHNxzEvqIrpTemeMh+7RmJ5TfWVJ9n8dJuEntoOd3NbNYP9mGEzytvBKxTFtQ8xxD/c03RfdQwMFuYAaCrHdNineK/hzeETNF6siCdiUFnCgyluUT8eLtMKOPvZJKpP3iei5GNnQJMbeLvM/yRmnLyNiHFBPgi8fx9bYLE4XqPP+e6RgFC1UkKJLeeVgGY+qid1LycKqEklQc6OH9JzLFPKUeu56xINyOzPrR4hPJg0fKIboy7EkPnXXn6bXWUsqzcFNBvubdDi4VPeKcEbcR2JDGACInJNDxVO7EobRzvycrT0UQnWPgRgj3cBKZPBrXN7ntdt8C7ceokHhEcmW3u7C96lMYFIm4cCeN5bGpJe8Hw4kc+zOT3RnDFqNTCg5nW6TTYbdOWOkZ9PpizPB094Etiz0bIoH9uUomMqKYGZagXBm0b7O8irSh9hXKdS58jH+UisXy03Vvf2hNZceIM6rpyLRhPhM9n3B5AaUD6X4JGyaTy9odGxKpCqzLeDqYo2wWfVtV3822uJqdrO8c1HHM5CSAQZm7ni9U9kwHAHIdt/UwuGDORmNBchEgv02tE8qnoAD7lWeB92VSv84J+NQ+v8js7/AgQFLjXdjuCGY5ouzriURf2HIA2NIy1dnfX9UiAqNn4bP9upU/8UAILSoHVou7zdINCDgWCupJkA+Dbl2nl4PC2rFpAfqDCPlV3L3UAqIU5V/SxchN8vdkdOLE0xjMn5dHvud5fUMZgXSF3Q/h1Ouf+4EU81Fgc/cjy9WLYGEk+dFLOCy2CQDlBfsQZBD1vvfg8UACcjK/f7DjGF9NZAGzFeSBNB+a66uZhGpd5MOhtJGm8CCITh/883QaRTxKqaVfPe+VtCTYYtVeZWTGAut01fFae1iNTSkgN2rlK38boZ2DbiRaA9jDvhTuH7IISLlBNUCeIkfTrWEMVndoj53lApX2eJ79DvmtB+WHuh1AklO1SOZ3eOXDw4oWpFFuBNO8HqKccPRce4HI3KFE6AVFzDoIT82MnxbfcsSpbtZyhZPTlZ2+mUd2e3HETD50KAkr9TFAa3geJi4rCfnlf95c2vb6D43wUrE+X6+44C/FqCvtym3yH9F4Fy79gFrZk+303KpcfcwheNLT3yLqgGe0FoJToSUPrZkgQb2MFh12B3X+uHClM6EoZInn1vSQSaNQvg4a6W3KT5WVhszgfKXdGFieil9LFZtf5TIX/xVGHuUtmgPrJMadjoZDSF6XW',
870 version: '0.3',
871 creationDate: 'Wed Mar 14 08:20:58 PDT 2007',
872 updateDate: 'Fri Dec 18 09:50:20 PST 2009',
873 accessDate: 'Tue Jan 05 01:38:41 PST 2010',
874 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
875 versions: {
876 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
877 header: '####',
878 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
879 version: '0.2',
880 creationDate: 'Wed Mar 14 08:45:40 PDT 2007',
881 updateDate: 'Wed Mar 14 08:45:40 PDT 2007',
882 accessDate: 'Wed Mar 14 08:45:40 PDT 2007'
883 },
884 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
885 header: '####',
886 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
887 version: '0.2',
888 creationDate: 'Wed Mar 14 08:47:01 PDT 2007',
889 updateDate: 'Wed Mar 14 08:47:01 PDT 2007',
890 accessDate: 'Tue Jan 05 01:38:41 PST 2010'
891 },
892 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
893 header: '####',
894 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
895 version: '0.2',
896 creationDate: 'Wed Mar 14 08:20:58 PDT 2007',
897 updateDate: 'Wed Mar 14 08:20:58 PDT 2007',
898 accessDate: 'Wed Mar 14 08:43:46 PDT 2007'
899 }
900 }
901 },
902 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
903 data: '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',
904 version: '0.2',
905 creationDate: 'Wed Mar 14 05:35:58 PDT 2007',
906 updateDate: 'Thu May 10 06:01:21 PDT 2007',
907 accessDate: 'Tue Jan 05 01:38:37 PST 2010',
908 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
909 versions: {
910 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
911 header: '####',
912 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
913 version: '0.2',
914 creationDate: 'Wed Mar 14 05:35:58 PDT 2007',
915 updateDate: 'Wed Mar 14 05:35:58 PDT 2007',
916 accessDate: 'Wed Mar 14 05:35:58 PDT 2007'
917 },
918 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
919 header: '####',
920 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
921 version: '0.2',
922 creationDate: 'Wed Mar 14 11:24:49 PDT 2007',
923 updateDate: 'Wed Mar 14 11:24:49 PDT 2007',
924 accessDate: 'Wed Mar 14 11:24:49 PDT 2007'
925 },
926 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
927 header: '####',
928 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
929 version: '0.2',
930 creationDate: 'Wed Mar 14 09:41:15 PDT 2007',
931 updateDate: 'Wed Mar 14 09:41:15 PDT 2007',
932 accessDate: 'Wed Mar 14 09:41:15 PDT 2007'
933 },
934 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
935 header: '####',
936 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
937 version: '0.2',
938 creationDate: 'Wed Mar 14 11:25:28 PDT 2007',
939 updateDate: 'Wed Mar 14 11:25:28 PDT 2007',
940 accessDate: 'Thu May 10 06:00:47 PDT 2007'
941 },
942 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
943 header: '####',
944 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
945 version: '0.2',
946 creationDate: 'Wed Mar 14 06:46:36 PDT 2007',
947 updateDate: 'Wed Mar 14 06:46:36 PDT 2007',
948 accessDate: 'Wed Mar 14 09:40:01 PDT 2007'
949 },
950 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
951 header: '####',
952 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
953 version: '0.2',
954 creationDate: 'Thu May 10 06:01:21 PDT 2007',
955 updateDate: 'Thu May 10 06:01:21 PDT 2007',
956 accessDate: 'Tue Jan 05 01:38:37 PST 2010'
957 },
958 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
959 header: '####',
960 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
961 version: '0.2',
962 creationDate: 'Wed Mar 14 09:43:29 PDT 2007',
963 updateDate: 'Wed Mar 14 09:43:29 PDT 2007',
964 accessDate: 'Wed Mar 14 11:23:51 PDT 2007'
965 }
966 }
967 },
968 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
969 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
970 version: '0.3',
971 creationDate: 'Wed Mar 14 09:39:39 PDT 2007',
972 updateDate: 'Wed Feb 13 06:29:04 PST 2008',
973 accessDate: 'Tue Jan 05 01:19:18 PST 2010',
974 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
975 versions: {
976 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
977 header: '####',
978 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
979 version: '0.2',
980 creationDate: 'Wed Mar 14 09:39:39 PDT 2007',
981 updateDate: 'Wed Mar 14 09:39:39 PDT 2007',
982 accessDate: 'Tue Apr 17 10:09:44 PDT 2007'
983 },
984 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
985 header: '####',
986 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
987 version: '0.2',
988 creationDate: 'Tue Apr 17 10:12:39 PDT 2007',
989 updateDate: 'Tue Apr 17 10:12:39 PDT 2007',
990 accessDate: 'Wed Feb 13 06:27:04 PST 2008'
991 },
992 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
993 header: '####',
994 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
995 version: '0.3',
996 creationDate: 'Wed Feb 13 06:29:04 PST 2008',
997 updateDate: 'Wed Feb 13 06:29:04 PST 2008',
998 accessDate: 'Tue Jan 05 01:19:18 PST 2010'
999 },
1000 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
1001 header: '####',
1002 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
1003 version: '0.3',
1004 creationDate: 'Wed Feb 13 06:28:28 PST 2008',
1005 updateDate: 'Wed Feb 13 06:28:28 PST 2008',
1006 accessDate: 'Wed Feb 13 06:28:28 PST 2008'
1007 },
1008 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
1009 header: '####',
1010 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
1011 version: '0.2',
1012 creationDate: 'Tue Apr 17 10:11:33 PDT 2007',
1013 updateDate: 'Tue Apr 17 10:11:33 PDT 2007',
1014 accessDate: 'Tue Apr 17 10:11:33 PDT 2007'
1015 }
1016 }
1017 },
1018 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
1019 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
1020 version: '0.2',
1021 creationDate: 'Wed Mar 14 10:43:29 PDT 2007',
1022 updateDate: 'Wed Mar 14 10:43:29 PDT 2007',
1023 accessDate: 'Fri Jan 08 12:44:56 PST 2010',
1024 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
1025 versions: {
1026 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
1027 header: '####',
1028 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
1029 version: '0.2',
1030 creationDate: 'Wed Mar 14 10:43:29 PDT 2007',
1031 updateDate: 'Wed Mar 14 10:43:29 PDT 2007',
1032 accessDate: 'Fri Jan 08 12:44:56 PST 2010'
1033 }
1034 }
1035 }
1036 }
1037 }
1038 }
1039
1040 },
1041
1042 //-------------------------------------------------------------------------
1043 'syntaxFix': ""
1044}
diff --git a/frontend/gamma/tests/tests/Components/FullApp/index.html b/frontend/gamma/tests/tests/Components/FullApp/index.html
new file mode 100644
index 0000000..d42d112
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/FullApp/index.html
@@ -0,0 +1,243 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Clipperz - online password manager - debug</title>
32 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
33
34
35 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
36 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
37 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
38
39 <link rel="shortcut icon" href="./clipperz.ico" />
40
41 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
42 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
43
44<script>
45 Clipperz_IEisBroken = false;
46 Clipperz_normalizedNewLine = '\n';
47 Clipperz_dumpUrl = "/dump/";
48</script>
49
50<!--[if IE]><script>
51Clipperz_IEisBroken = true;
52Clipperz_normalizedNewLine = '\x0d\x0a';
53</script><![endif]-->
54
55
56 <script type='text/javascript' src='../../../../js/bookmarklet.js'></script>
57 <script type='text/javascript' src='../../../../js/bookmarklet_ie.js'></script>
58
59 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script>
60 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script>
61 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script>
62 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script>
63 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script>
64 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script>
65 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script>
66 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script>
67 <script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script>
68 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script>
69 <script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script>
70 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script>
71 <script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script>
72 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.JSON.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
112 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
113 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
114 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
115 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
116 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
117 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
118 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
119 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
120 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
121 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
122 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
123 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
124 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script>
125 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
126 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
127 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
128 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js'></script>
129 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
130 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
131 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
132 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
133 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
134 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
135 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/WizardController.js'></script>
136 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/Page.js'></script>
137 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PageHeader.js'></script>
138 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PageFooter.js'></script>
139 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginPage.js'></script>
140 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginForm.js'></script>
141 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginProgress.js'></script>
142 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AppPage.js'></script>
143 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UserInfoBox.js'></script>
144 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TabSidePanel.js'></script>
145 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script>
146 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script>
147 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TextColumnManager.js'></script>
148 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script>
149 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js'></script>
150 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script>
151 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script>
152 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js'></script>
153 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script>
154 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script>
155 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js'></script>
156 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AccountPanel.js'></script>
157 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DataPanel.js'></script>
158 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ToolsPanel.js'></script>
159 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script>
160 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
161 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
162 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
163 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script>
164 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script>
165 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script>
166 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
167 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script>
168 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js'></script>
169 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script>
170 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script>
171 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/LoginController.js'></script>
172 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/AppController.js'></script>
173 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script>
174 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script>
175 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script>
176 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js'></script>
177 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
178 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script>
179 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js'></script>
180
181 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js'></script>
182 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/questionMark.js'></script>
183 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/info.js'></script>
184
185 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/store.js'></script>
186 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/protect.js'></script>
187 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/directLogin.js'></script>
188 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/share.js'></script>
189
190 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Star/normal.js'></script>
191
192 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/look.js'></script>
193 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/download.js'></script>
194
195 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/open.js'></script>
196 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/close.js'></script>
197
198 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js'></script>
199 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Logo/normal.js'></script>
200
201 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/GraphicFunctions.js'></script>
202 <!-- script type='text/javascript' src='../../../../js/main.js'></script -->
203
204 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
205 <script type='text/javascript' src='./User.data.js'></script>
206 <script type='text/javascript' src='./main_test.js'></script>
207
208
209</head>
210<body>
211<div id="mainDiv">
212 <div id="loading">
213 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a>
214 <h5 class="clipperzPayoff">keep it to yourself!</h5>
215 <h2>loading ...</h2>
216 </div>
217
218
219
220</div>
221<div id="applicationVersionType" class="LIVE"></div>
222
223<!-- -->
224<div id="javaScriptAlert">
225 <div class="mask"></div>
226 <div class="message">
227 <div class="header"></div>
228 <div class="body">
229 <div class="alertLogo"></div>
230 <div class="alert">
231 <h1>Attention!</h1>
232 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
233 <h3>Javascript is required to access Clipperz.</h3>
234 <h5>Please enable scripting or upgrade your browser.</h5>
235 </div>
236 </div>
237 <div class="footer"></div>
238 </div>
239</div>
240<!-- -->
241
242</body>
243</html>
diff --git a/frontend/gamma/tests/tests/Components/FullApp/main_test.js b/frontend/gamma/tests/tests/Components/FullApp/main_test.js
new file mode 100644
index 0000000..fa21581
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/FullApp/main_test.js
@@ -0,0 +1,114 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29function _pm_logEvent(anEvent) {
30 //console.log("####", anEvent);
31
32 anEvent.preventDefault();
33}
34
35function handleGenericDeferredError(anError) {
36 var result;
37
38 if (anError instanceof MochiKit.Async.CancelledError) {
39 result = anError;
40 } else {
41MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
42//console.log(anError);
43 result = new MochiKit.Async.CancelledError(anError);
44 }
45
46 return result;
47}
48
49
50Clipperz.PM.RunTime = {};
51
52
53function run() {
54 var shouldShowRegistrationForm;
55 var useCompactDesign;
56 var controllerParameters;
57 //var iPhoneDesign;
58
59 //MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent);
60 //MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent);
61 //MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent);
62
63 controllerParameters = {};
64
65 MochiKit.DOM.removeElement('javaScriptAlert');
66 Clipperz.PM.Strings.Languages.initSetup();
67
68 if (window.location.search.indexOf('registration') != -1) {
69 shouldShowRegistrationForm = true;
70 } else {
71 shouldShowRegistrationForm = false;
72 }
73
74 if (window.location.search.indexOf('autocomplete') != -1) {
75 controllerParameters['autocomplete'] = 'on'
76 }
77
78 //if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) {
79 // iPhoneDesign = true;
80 //} else {
81 // iPhoneDesign = false;
82 //}
83
84 if (window.location.search.indexOf('compact') != -1) {
85 useCompactDesign = true;
86 } else {
87 useCompactDesign = false;
88 }
89
90 if (useCompactDesign == true) {
91 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters);
92 //} else if (iPhoneDesign == true) {
93 // Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController();
94 } else {
95 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters);
96 }
97
98 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm);
99
100//Clipperz.log("HASH: " + window.location.hash);
101 //if (window.location.hash != "") {
102 // window.location.hash = ""
103 //}
104//Clipperz.log("HASH cleaned");
105 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'})
106 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
107}
108
109Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
110
111var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
112proxy.dataStore().setupWithEncryptedData(testData['testData']);
113
114MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js b/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js
new file mode 100644
index 0000000..1c06468
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js
@@ -0,0 +1,119 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.GridLayout');
30
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup();
33
34Clipperz.Tests.GridLayout.Tester = function(args) {
35 args = args || {};
36
37 Clipperz.Tests.GridLayout.Tester.superclass.constructor.call(this, args);
38 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
40
41 return this;
42};
43
44Clipperz.Base.extend(Clipperz.Tests.GridLayout.Tester, Object, {
45
46 'toString': function() {
47 return "Clipperz.Tests.GridLayout.Tester";
48 },
49
50 //-------------------------------------------------------------------------
51
52 'user': function () {
53 return this._user;
54 },
55
56 //-------------------------------------------------------------------------
57
58 'run': function () {
59 var deferredResult;
60 var proxy;
61 varcardDialogController;
62 varcardDialogComponent;
63 varcomponent;
64 varfilterController;
65 var cardsController;
66
67 filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
68 cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':filterController});
69
70 component = new Clipperz.Tests.GridLayout.TestPageComponent({element:MochiKit.DOM.getElement('component')});
71
72 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
73
74 deferredResult = new Clipperz.Async.Deferred("GridLayout_test.init", {trace:false});
75 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
76 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
77 deferredResult.addMethod(this.user(), 'login');
78
79 deferredResult.addMethod(cardsController,'run', {slot:component.slotNamed('cardList'), user:this.user()});
80 // deferredResult.addMethod(xxxxController,'run', {slot:component.slotNamed('cardGrid'), user:this.user()});
81
82 deferredResult.callback();
83
84 return deferredResult;
85 },
86
87 //=========================================================================
88
89 'saveChanges': function () {
90 return this.user().saveChanges();
91 },
92
93 //-------------------------------------------------------------------------
94
95 'hasPendingChanges': function () {
96 return this.user().hasPendingChanges();
97 },
98
99 //-------------------------------------------------------------------------
100
101 'revertChanges': function () {
102 return this.user().revertChanges();
103 },
104
105 //=========================================================================
106 __syntaxFix__: "syntax fix"
107});
108
109
110
111
112init = function () {
113 vartester;
114
115 tester = new Clipperz.Tests.GridLayout.Tester();
116 tester.run();
117};
118
119MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js b/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js
new file mode 100644
index 0000000..a98f041
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js
@@ -0,0 +1,102 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.GridLayout');
30
31Clipperz.Tests.GridLayout.TestPageComponent = function(args) {
32 args = args || {};
33 Clipperz.Tests.GridLayout.TestPageComponent.superclass.constructor.call(this, args);
34
35 this._element = args.element || null;
36
37 this._slots = {
38 'cardList' : this.getId('cardList'),
39 'cardGrid' : this.getId('cardGrid')
40 };
41
42 this.render();
43
44
45 return this;
46}
47
48//=============================================================================
49
50Clipperz.Base.extend(Clipperz.Tests.GridLayout.TestPageComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
51
52 //-------------------------------------------------------------------------
53
54 'toString': function () {
55 return "Clipperz.Tests.GridLayout.TestPageComponent component";
56 },
57
58 //-------------------------------------------------------------------------
59
60 'renderSelf': function(/*aContainer, aPosition*/) {
61 this.append(this.element(), [
62 {tag:'ul', cls:'testTabs', style:'', children:[
63 {tag:'li', id:this.getId('list'), children:[{tag:'span', html:'list'}]},
64 {tag:'li', id:this.getId('grid'), children:[{tag:'span', html:'grid'}]}
65 ]},
66 {tag:'ul', cls:'testPanels', children:[
67 {tag:'li', id:this.getId('listPanel'), children:[
68 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[
69 {tag:'div', id:this.getId('cardList'), cls:'gridComponent cardGrid'}
70 ]}
71 ]},
72 {tag:'li', id:this.getId('gridPanel'), children:[
73 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[
74 // {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}
75 {tag:'h1', html:"Ciao"}
76 ]}
77 ]}
78 ]}
79 ]);
80
81 // this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'});
82 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'});
83
84 new Clipperz.PM.UI.Common.Controllers.TabPanelController({
85 component:this,
86 configuration: {
87 'LIST': {
88 tab:'list',
89 panel:'listPanel'
90 },
91 'GRID': {
92 tab:'grid',
93 panel:'gridPanel'
94 }
95 }
96 });
97 },
98
99 //-------------------------------------------------------------------------
100
101 __syntaxFix__: "syntax fix"
102});
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/User.data.js b/frontend/gamma/tests/tests/Components/GridLayout/User.data.js
new file mode 100644
index 0000000..6fec8c9
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/GridLayout/User.data.js
@@ -0,0 +1,977 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29testData = {
30
31 //-------------------------------------------------------------------------
32
33 'simpleLogin_001': {
34 'users': [
35 {
36 'username': "joe",
37 'passphrase': "eoj",
38 'version': "0.2",
39 'connectionVersion':"0.2",
40 'records':{
41 'record 1': {
42 'notes':"Some notes here",
43 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"}
46 ],
47 'directLogins':{
48 "record 1 direct login": {
49 'configuration':"",
50 'bindings':[
51 ],
52 'favicon':"http://www.example.com/favicon.ico"
53 }
54 }
55 }
56 },
57 'otp':[
58 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321"
60 ]
61 }
62 ]
63 },
64
65 //-------------------------------------------------------------------------
66
67 'joe_clipperz_offline_copy_data': {
68 users:{
69 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2',
78 maxNumberOfRecords: '100',
79 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"jufmL1KVY0YBl8MSaL413hGtw12I/+sFnumcfeVku9RRMBmXaXCfE/vYnraxZyPxJxVS3qFRWDKsSGR3pScdACSwlBD+mzjifRn2SCfXWutD1/oJiqiMvq3YFzwyZJiXx+oS5u8DOTieQT9HZYt0pUmAod9QHiq2NAkueVjvRkZI1saRlWGtNXCaJIHwpuFJpHBDSD//6D9DYeTdVUeFEbej+4oNYpBCkyE1G2OL6q50YRBYp9yARRiy9juKHRWFvZiSeMGEJQS0f2gaP+xZkb9Z4qrfDgAZ1F7oDbPksr2SOYlSsm0bqa6c+7Wtopdo63Urf7Ze3Wg9n8TGBk6H88boseR8e3sHudlmtO1oLxcB9p3z/NTceF6SvWyJWTxHeMe6O72dZVmSnZlXhD/IJamRt13HLk3g05d8oXfrXM3iMhIGQ+EsXMxZfKdXlZpyYtjWD5tcQTKz7M5Qo3SFmdkwDu4jH5ke+bD8CeluDcMaHF6KHfdV8nEsmsjGwrH6lqSCT/9kBO5ETqUJKloOhJpFpNS/EN7nxjXF/QbqnUmWV4wngdyYmk9goNZNfZv7C2ouiyys55/QEfGsIsvEPPSfO670oJuncTyfFngFj2tdh2JpJ5vytuoRNLOm7XPM3hDCvZCOpUnjbm+jt4AvdOGU7ID8a2mtZFjb2noP5emAxTg6MO6f3+44eTkUcbCDskO5fe6jd0pTdODk21Ilp7WUjFwxEdJG8tRrGYpLooProJExamL7WShm/S/nhJL4+euW+1UIDjcZJA+a7aGdMSC63qBvrEsNyf57SDBk/o2eNJHs2sndCzgvK42IKGKcipq9D1Gyos9JQsA3My9ARMt68V/5FfzOkgPO6mblOsQMoTyQj/OCLzITEBfqA5IufhljSEkD3CLkfkeVwVf1NB2SsTPXJFChnynfsK7cMFy0O2XBNByCRTQDqBDBYo673tI1KTGnT4gLSAwCt96lq8UkEdt51jjkAJcvBXkbswuw3hvhtzLJ302hkN9CIHJrEN0oss5mWlxIxYrCyqE3ABME3FCR9r+V7exuIaQn6mdJTkMcRbYmVQQkexsROh2cdx8I/tuMN4ECWEAL948k9vEPZfgaQirWnrTtHoxLzNAUBDSQfzYXd8yr0T4vAHLnXaUalWPgLamJJ3eR+LDFcDQVvFkaomsF3RpOIS5fswTBFuRKGKEBSIINc9AyC4DtkSmDMTF2S0TgpnGdK94ZS8C/PM8WEsX738echa5qZG5qG0f+koOUUrbaORcDqaktCuDmsgFTYiUv1JxFskTvS/t/EM2Y0MEKVLZBsoG+4WXz4XEE0VJFoI9glaYll96WH/iMbaVXRnDwjyE62CAk/8DXIf//MJQVyO6ElFsvCrDfH03yLpCJhqwHv+mD5sRctVaq6Cp5Ts3bzdFeiLCX9rhSaqdG5AuMk4dCInlywxrsOvBfNaDBjX7NGCULri6px2T53FNiH6ineVjr9TfgY2uoMyevLiQsGd3GHS4wnxiUfIyz7/Yav5an4o82cHhMVOLvfKwF8C2dJQDg9woJ3ju1ha66UA2XGScJVd93w3OWco78+giXBE96R3CebxgaWQ5Zif6nI+FJnw6OipaRgd7EyrLrQTWadvTiYLfDknlsxFZd4XVs33/3xxF3RyoVsIFO7cpEX/BLVB69v+1TJvLdiyGwSl5FUKbrcrXycZ67uTKtHyAI/vrzwwoQxYV8e32xW86blEjH4pq/Zrijm1wGw7IrD9fYVgEO7nnWpE/ac85LrDaJpGOdZ+slcVWM6THHR9boKJGLtuc8V81gDVNtZ/f4Hx5YXZWKIIfpe57BybWejdQ8ZACWK+mXOGczyXJ88B4nIvaKnRlhSszQryAZzSqJry2k3t1v73BzL48TZWJ6yu1rFmqAUk2V5DCA4XnyHfPuiG8hZfTuu1YXQ+iBgbyDipTwozQqyTv3SxLBPTFxKZLuabMn7ZTo/kLXGfVO/2va58bv6kzW6WjwZ0D481N1Nyd1kZUw1lyxXklcAzZqaHUiIsy+/5DgV/qULYFqEBMNMA7QvBfRN4VZRlnNiemgzkBQXj+JGJOWZMz5cvss291rj1fAe91s10nkZoaddDrvfgfjTq6n9XLSyGSmnrIDMLVc9+YuDtuaQ4gwuiLG2X57Jzrc/Xy7jdZ82G1j+cfT/8Pvb40i1K9aid0Z3xl/tm7jBAqQ91Ehkbo6c8jUVPaQsRcfTumtsNf+Xa5PJmQtEGEPCUlGN6F7eFB5eOLXQFdsLRL1x+SzhS7k3aDri9sTMwYQij26AexwwzAPqcOOkkfbYf0lov5Gxx0LhsZAetDZCRFlxjDRDS8jE8dKBBXkWFazF8K2rdQXKNlclwezCEDBwUWhoJs/H5ndJ38MpSPfKo1YsVvlxi4QFyOTDPJIstCCvYnCjj1r7SrkRrbcuevITRTxD4FKgPCdsYFlGfhS1zWb23DWYWo6fPQ1/zlnN01gZStxsZKepB3NnxbTSjBgTSmzG6RzZajv6BtqivtvOa1hI2KZQtVGCDU2+NGmfbJ5TTJehYiTEPeBF9TfLRP9rktQTUngj2ohv+1TDL0jL3YWiSA9TJzYonsincEVy1aRUeGVazWF2Rrq2o4hCBp12BfuMGHOdVkg9rMXdusyl2y75YyEkcBNMz4zi8i1lVhjUg16rCR48uKJ9QO2KBbjoGTx13uxIXTR8ufXx6mW7iW3qVx+6k7BQGKlMo1G64O8HQ2UrboS/tCqlP0W+7XB2C3EaZMqfKeYcuzM4MLkM6CT2GKYmJPyevXLKE749BM8zRQUcrWieAxmyD+g0QQ4T1fl0RTNEFB1/0BIg3fQQHCLGUTahXwt0EluG9iNPVgmFwwBHybH6gmIEZ4xnD8I7QPwgYY3JF407NdLkHjOuXrP+GODGEvX49MMaUigUUO2fkdw9EJbaidhx6j1EsFpQrz4Lt/5sAu5c9B/365TXtnNnmaPkaFj1q+3ezVXUroimRqxZ9BMaTm7J1hjubO+Dxjb2QlR/UApvQ0ty8aZpmIrMi0xjfoodIMiH6IYdw3VRZSqup7irWWpnJhef2qqtcpoxdiYZaFyf5u2XpZqEnAJpTupqOg+qJN/7aQt6ZmP7POFPwUwzwAsfTYk2EwMlTVAXrawZZEYu2JZ4kIjazo1LgyuuWTieEuONnye8Hr9p70RjwWUdlErlPSCKKn6JRdsM2no13F3151cfgx8I02J9vDuiNa3vfJfmRnBOly5jq6Wlnm2rJN6YYQHwbikoq3lJvkX5ZANDRKFlMWKK42+fXLBuofAZShFt6xvlY384aYsv3EcR42GOLrgYPQy0a7lr/FS4mM2ErNwNYnCz/xTuPBjgXXplbAnyA3jpKdPN1EfUM1oA4kZjECmkXZOuyEQxrndS9eOGbPM6S131zpdWEw9dWSZdkSI34+OkLfAKf6W6z4G4Z+cMRrkYLHs+BavJOum4XTjyyXHIKhQiqz9mgEf+ulodXi+LNsbq1eCcGPWrGg+GNwN1SjJHZm78gidyrlEF6xuPCaZRvGQtk59nuJULOZWkC3Ns/EcFiAql8cu37Lp842fsHHeCVOq0e8ZII4TPg9HKPwDD4HLSg4frBzyeZwK0nN30C5ATCxWdL4Q60cKtZyIEM7Kn1a/vifsAbe019Ui3ovTOCYiTCAdOLaAL/NdpgWA/fDNOsTlPvnEYkq+4+bV3Wyye9ddxICD4TnC2yvXvjw4C/WnYYceJy5R4KamIJueEGIHGp22/0DSF3H4ji3QoUDiFB/H+CA8A2q9LO9q0NYcf2P5q2MfdJGu4bd49g68mltj35pRnGQaafflXY9VmMfrlAbBYfUnsKOb3DOUpq8asveE41/6WkGcXFIuSABcbBf0cHIfBn41wRWQhoCm/JL8pfqEZC/paBdFBRW4FjKkxhbg4BPvBL0aQyGGkU8eH8tr8nm4YN1HMFF/s3s8+9FPoBxPuXLoGSg7Rvdz+g=="},"version":"0.1"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3',
82 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
85 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 PDT 2007',
87 updateDate: 'Wed Mar 14 15:46:44 PDT 2007',
88 accessDate: 'Mon Jan 19 16:10:04 PDT 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 PDT 2007',
96 updateDate: 'Wed Mar 14 15:46:44 PDT 2007',
97 accessDate: 'Mon Jan 19 16:10:04 PDT 2009'
98 }
99 }
100 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
103 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 PDT 2008',
105 updateDate: 'Mon Oct 27 08:58:49 PDT 2008',
106 accessDate: 'Mon Jan 19 16:09:39 PDT 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 PDT 2008',
114 updateDate: 'Fri Oct 17 17:00:31 PDT 2008',
115 accessDate: 'Fri Oct 17 17:00:31 PDT 2008'
116 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 PDT 2008',
122 updateDate: 'Fri Oct 17 16:49:20 PDT 2008',
123 accessDate: 'Fri Oct 17 16:54:23 PDT 2008'
124 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 PDT 2008',
130 updateDate: 'Fri Oct 17 17:00:13 PDT 2008',
131 accessDate: 'Fri Oct 17 17:00:13 PDT 2008'
132 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####',
135 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
136 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 PDT 2008',
138 updateDate: 'Fri Oct 17 16:59:31 PDT 2008',
139 accessDate: 'Fri Oct 17 16:59:31 PDT 2008'
140 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####',
143 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
144 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 PDT 2008',
146 updateDate: 'Mon Oct 27 08:58:49 PDT 2008',
147 accessDate: 'Mon Jan 19 16:09:39 PDT 2009'
148 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 PDT 2008',
154 updateDate: 'Fri Oct 17 16:57:17 PDT 2008',
155 accessDate: 'Fri Oct 17 16:57:17 PDT 2008'
156 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 PDT 2008',
162 updateDate: 'Fri Oct 17 16:58:00 PDT 2008',
163 accessDate: 'Fri Oct 17 16:58:00 PDT 2008'
164 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 PDT 2008',
170 updateDate: 'Fri Oct 17 17:01:59 PDT 2008',
171 accessDate: 'Mon Oct 27 08:57:58 PDT 2008'
172 }
173 }
174 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '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',
177 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 PDT 2007',
179 updateDate: 'Tue Apr 17 19:17:52 PDT 2007',
180 accessDate: 'Mon Jan 19 16:09:25 PDT 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 PDT 2007',
188 updateDate: 'Tue Apr 17 19:13:41 PDT 2007',
189 accessDate: 'Tue Apr 17 19:13:41 PDT 2007'
190 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 PDT 2007',
196 updateDate: 'Wed Mar 14 14:53:11 PDT 2007',
197 accessDate: 'Wed Mar 14 15:24:35 PDT 2007'
198 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 PDT 2007',
204 updateDate: 'Wed Mar 14 15:33:00 PDT 2007',
205 accessDate: 'Tue Apr 17 19:12:56 PDT 2007'
206 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 PDT 2007',
212 updateDate: 'Wed Mar 14 15:26:35 PDT 2007',
213 accessDate: 'Wed Mar 14 15:26:35 PDT 2007'
214 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 PDT 2007',
220 updateDate: 'Wed Mar 14 15:30:09 PDT 2007',
221 accessDate: 'Wed Mar 14 15:30:09 PDT 2007'
222 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 PDT 2007',
228 updateDate: 'Tue Apr 17 19:17:52 PDT 2007',
229 accessDate: 'Mon Jan 19 16:09:25 PDT 2009'
230 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 PDT 2007',
236 updateDate: 'Wed Mar 14 15:27:35 PDT 2007',
237 accessDate: 'Wed Mar 14 15:27:35 PDT 2007'
238 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 PDT 2007',
244 updateDate: 'Tue Apr 17 19:15:09 PDT 2007',
245 accessDate: 'Tue Apr 17 19:17:01 PDT 2007'
246 }
247 }
248 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 PDT 2007',
253 updateDate: 'Mon Oct 27 09:16:14 PDT 2008',
254 accessDate: 'Mon Jan 19 16:09:35 PDT 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 PDT 2007',
262 updateDate: 'Wed Mar 14 18:39:55 PDT 2007',
263 accessDate: 'Mon Oct 27 09:07:56 PDT 2008'
264 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 PDT 2008',
270 updateDate: 'Mon Oct 27 09:09:11 PDT 2008',
271 accessDate: 'Mon Oct 27 09:15:58 PDT 2008'
272 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 PDT 2007',
278 updateDate: 'Wed Mar 14 18:39:35 PDT 2007',
279 accessDate: 'Wed Mar 14 18:39:35 PDT 2007'
280 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 PDT 2008',
286 updateDate: 'Mon Oct 27 09:16:14 PDT 2008',
287 accessDate: 'Mon Jan 19 16:09:35 PDT 2009'
288 }
289 }
290 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
293 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 PDT 2007',
295 updateDate: 'Wed Mar 14 16:01:24 PDT 2007',
296 accessDate: 'Mon Jan 19 16:10:11 PDT 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 PDT 2007',
304 updateDate: 'Wed Mar 14 16:01:24 PDT 2007',
305 accessDate: 'Mon Jan 19 16:10:11 PDT 2009'
306 }
307 }
308 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 PDT 2009',
313 updateDate: 'Mon Jan 05 17:45:25 PDT 2009',
314 accessDate: 'Mon Jan 19 16:10:21 PDT 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 PDT 2009',
322 updateDate: 'Mon Jan 05 17:45:25 PDT 2009',
323 accessDate: 'Mon Jan 19 16:10:21 PDT 2009'
324 }
325 }
326 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 PDT 2007',
331 updateDate: 'Tue Apr 17 16:36:08 PDT 2007',
332 accessDate: 'Mon Jan 19 16:09:33 PDT 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 PDT 2007',
340 updateDate: 'Tue Apr 17 16:36:08 PDT 2007',
341 accessDate: 'Mon Jan 19 16:09:33 PDT 2009'
342 }
343 }
344 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 PDT 2007',
349 updateDate: 'Mon Apr 02 19:12:44 PDT 2007',
350 accessDate: 'Mon Jan 19 16:10:08 PDT 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 PDT 2007',
358 updateDate: 'Mon Apr 02 19:12:44 PDT 2007',
359 accessDate: 'Mon Jan 19 16:10:08 PDT 2009'
360 }
361 }
362 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
365 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 PDT 2007',
367 updateDate: 'Wed Mar 14 19:09:05 PDT 2007',
368 accessDate: 'Mon Jan 19 16:10:15 PDT 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 PDT 2007',
376 updateDate: 'Wed Mar 14 19:09:05 PDT 2007',
377 accessDate: 'Mon Jan 19 16:10:15 PDT 2009'
378 }
379 }
380 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 PDT 2009',
385 updateDate: 'Mon Jan 05 17:44:30 PDT 2009',
386 accessDate: 'Mon Jan 19 16:10:18 PDT 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 PDT 2009',
394 updateDate: 'Mon Jan 05 17:44:30 PDT 2009',
395 accessDate: 'Mon Jan 19 16:10:18 PDT 2009'
396 }
397 }
398 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 PDT 2007',
403 updateDate: 'Tue May 01 01:13:27 PDT 2007',
404 accessDate: 'Mon Jan 19 16:10:02 PDT 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####',
409 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
410 version: '0.2',
411 creationDate: 'Tue May 01 01:10:17 PDT 2007',
412 updateDate: 'Tue May 01 01:10:17 PDT 2007',
413 accessDate: 'Tue May 01 01:10:17 PDT 2007'
414 },
415 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
416 header: '####',
417 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
418 version: '0.2',
419 creationDate: 'Tue May 01 01:13:27 PDT 2007',
420 updateDate: 'Tue May 01 01:13:27 PDT 2007',
421 accessDate: 'Mon Jan 19 16:10:02 PDT 2009'
422 }
423 }
424 },
425 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
426 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
427 version: '0.2',
428 creationDate: 'Wed Mar 21 16:29:06 PDT 2007',
429 updateDate: 'Wed Mar 21 16:29:06 PDT 2007',
430 accessDate: 'Mon Jan 19 16:10:01 PDT 2009',
431 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
432 versions: {
433 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
434 header: '####',
435 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
436 version: '0.2',
437 creationDate: 'Wed Mar 21 16:29:06 PDT 2007',
438 updateDate: 'Wed Mar 21 16:29:06 PDT 2007',
439 accessDate: 'Mon Jan 19 16:10:01 PDT 2009'
440 }
441 }
442 },
443 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
444 data: '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',
445 version: '0.3',
446 creationDate: 'Thu Feb 12 12:45:43 PDT 2009',
447 updateDate: 'Thu Feb 12 12:54:37 PDT 2009',
448 accessDate: 'Thu Feb 12 12:54:37 PDT 2009',
449 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
450 versions: {
451 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
452 header: '####',
453 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
454 version: '0.3',
455 creationDate: 'Thu Feb 12 12:54:37 PDT 2009',
456 updateDate: 'Thu Feb 12 12:54:37 PDT 2009',
457 accessDate: 'Thu Feb 12 12:54:37 PDT 2009'
458 },
459 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
460 header: '####',
461 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
462 version: '0.3',
463 creationDate: 'Thu Feb 12 12:45:43 PDT 2009',
464 updateDate: 'Thu Feb 12 12:45:43 PDT 2009',
465 accessDate: 'Thu Feb 12 12:45:43 PDT 2009'
466 },
467 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
468 header: '####',
469 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
470 version: '0.3',
471 creationDate: 'Thu Feb 12 12:47:39 PDT 2009',
472 updateDate: 'Thu Feb 12 12:47:39 PDT 2009',
473 accessDate: 'Thu Feb 12 12:47:39 PDT 2009'
474 }
475 }
476 },
477 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
478 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
479 version: '0.2',
480 creationDate: 'Wed Mar 14 15:51:17 PDT 2007',
481 updateDate: 'Wed Apr 25 11:14:05 PDT 2007',
482 accessDate: 'Mon Jan 19 16:10:12 PDT 2009',
483 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
484 versions: {
485 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
486 header: '####',
487 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
488 version: '0.2',
489 creationDate: 'Wed Mar 14 15:51:17 PDT 2007',
490 updateDate: 'Wed Mar 14 15:51:17 PDT 2007',
491 accessDate: 'Wed Apr 25 10:37:27 PDT 2007'
492 },
493 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
494 header: '####',
495 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
496 version: '0.2',
497 creationDate: 'Wed Apr 25 10:39:26 PDT 2007',
498 updateDate: 'Wed Apr 25 10:39:26 PDT 2007',
499 accessDate: 'Wed Apr 25 10:39:26 PDT 2007'
500 },
501 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
502 header: '####',
503 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
504 version: '0.2',
505 creationDate: 'Wed Apr 25 11:14:05 PDT 2007',
506 updateDate: 'Wed Apr 25 11:14:05 PDT 2007',
507 accessDate: 'Mon Jan 19 16:10:12 PDT 2009'
508 },
509 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
510 header: '####',
511 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
512 version: '0.2',
513 creationDate: 'Wed Apr 25 10:51:49 PDT 2007',
514 updateDate: 'Wed Apr 25 10:51:49 PDT 2007',
515 accessDate: 'Wed Apr 25 10:51:49 PDT 2007'
516 },
517 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
518 header: '####',
519 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
520 version: '0.2',
521 creationDate: 'Wed Apr 25 11:01:21 PDT 2007',
522 updateDate: 'Wed Apr 25 11:01:21 PDT 2007',
523 accessDate: 'Wed Apr 25 11:01:21 PDT 2007'
524 },
525 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
526 header: '####',
527 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
528 version: '0.2',
529 creationDate: 'Wed Apr 25 10:59:57 PDT 2007',
530 updateDate: 'Wed Apr 25 10:59:57 PDT 2007',
531 accessDate: 'Wed Apr 25 10:59:57 PDT 2007'
532 },
533 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
534 header: '####',
535 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
536 version: '0.2',
537 creationDate: 'Wed Apr 25 10:38:17 PDT 2007',
538 updateDate: 'Wed Apr 25 10:38:17 PDT 2007',
539 accessDate: 'Wed Apr 25 10:38:17 PDT 2007'
540 },
541 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
542 header: '####',
543 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
544 version: '0.2',
545 creationDate: 'Wed Apr 25 10:56:58 PDT 2007',
546 updateDate: 'Wed Apr 25 10:56:58 PDT 2007',
547 accessDate: 'Wed Apr 25 10:56:58 PDT 2007'
548 },
549 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
550 header: '####',
551 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
552 version: '0.2',
553 creationDate: 'Wed Apr 25 10:58:33 PDT 2007',
554 updateDate: 'Wed Apr 25 10:58:33 PDT 2007',
555 accessDate: 'Wed Apr 25 10:58:33 PDT 2007'
556 }
557 }
558 },
559 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
560 data: '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',
561 version: '0.2',
562 creationDate: 'Wed Mar 14 16:06:54 PDT 2007',
563 updateDate: 'Tue Apr 17 19:23:41 PDT 2007',
564 accessDate: 'Mon Jan 19 16:10:23 PDT 2009',
565 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
566 versions: {
567 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
568 header: '####',
569 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
570 version: '0.2',
571 creationDate: 'Wed Mar 14 17:27:40 PDT 2007',
572 updateDate: 'Wed Mar 14 17:27:40 PDT 2007',
573 accessDate: 'Wed Mar 14 19:00:21 PDT 2007'
574 },
575 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
576 header: '####',
577 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
578 version: '0.2',
579 creationDate: 'Wed Mar 14 16:09:07 PDT 2007',
580 updateDate: 'Wed Mar 14 16:09:07 PDT 2007',
581 accessDate: 'Wed Mar 14 16:39:40 PDT 2007'
582 },
583 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
584 header: '####',
585 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
586 version: '0.2',
587 creationDate: 'Wed Mar 14 19:01:05 PDT 2007',
588 updateDate: 'Wed Mar 14 19:01:05 PDT 2007',
589 accessDate: 'Tue Apr 17 19:20:33 PDT 2007'
590 },
591 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
592 header: '####',
593 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
594 version: '0.2',
595 creationDate: 'Wed Mar 14 17:17:20 PDT 2007',
596 updateDate: 'Wed Mar 14 17:17:20 PDT 2007',
597 accessDate: 'Wed Mar 14 17:22:06 PDT 2007'
598 },
599 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
600 header: '####',
601 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
602 version: '0.2',
603 creationDate: 'Wed Mar 14 16:06:54 PDT 2007',
604 updateDate: 'Wed Mar 14 16:06:54 PDT 2007',
605 accessDate: 'Wed Mar 14 16:06:54 PDT 2007'
606 },
607 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
608 header: '####',
609 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
610 version: '0.2',
611 creationDate: 'Tue Apr 17 19:23:41 PDT 2007',
612 updateDate: 'Tue Apr 17 19:23:41 PDT 2007',
613 accessDate: 'Mon Jan 19 16:10:23 PDT 2009'
614 },
615 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
616 header: '####',
617 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
618 version: '0.2',
619 creationDate: 'Tue Apr 17 19:22:08 PDT 2007',
620 updateDate: 'Tue Apr 17 19:22:08 PDT 2007',
621 accessDate: 'Tue Apr 17 19:22:08 PDT 2007'
622 }
623 }
624 },
625 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
626 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
627 version: '0.2',
628 creationDate: 'Wed Mar 14 16:36:20 PDT 2007',
629 updateDate: 'Mon Jul 09 15:10:15 PDT 2007',
630 accessDate: 'Mon Jan 19 16:09:28 PDT 2009',
631 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
632 versions: {
633 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
634 header: '####',
635 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
636 version: '0.2',
637 creationDate: 'Wed Mar 14 16:51:02 PDT 2007',
638 updateDate: 'Wed Mar 14 16:51:02 PDT 2007',
639 accessDate: 'Wed Mar 14 16:51:02 PDT 2007'
640 },
641 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
642 header: '####',
643 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
644 version: '0.2',
645 creationDate: 'Mon Jul 09 15:10:15 PDT 2007',
646 updateDate: 'Mon Jul 09 15:10:15 PDT 2007',
647 accessDate: 'Mon Jan 19 16:09:28 PDT 2009'
648 },
649 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
650 header: '####',
651 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
652 version: '0.2',
653 creationDate: 'Wed Mar 21 12:56:43 PDT 2007',
654 updateDate: 'Wed Mar 21 12:56:43 PDT 2007',
655 accessDate: 'Wed Apr 25 09:59:58 PDT 2007'
656 },
657 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
658 header: '####',
659 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
660 version: '0.2',
661 creationDate: 'Sat May 19 11:26:44 PDT 2007',
662 updateDate: 'Sat May 19 11:26:44 PDT 2007',
663 accessDate: 'Mon Jul 09 15:08:39 PDT 2007'
664 },
665 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
666 header: '####',
667 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
668 version: '0.2',
669 creationDate: 'Wed Mar 14 16:38:54 PDT 2007',
670 updateDate: 'Wed Mar 14 16:38:54 PDT 2007',
671 accessDate: 'Wed Mar 14 16:38:54 PDT 2007'
672 },
673 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
674 header: '####',
675 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
676 version: '0.2',
677 creationDate: 'Wed Mar 14 16:36:20 PDT 2007',
678 updateDate: 'Wed Mar 14 16:36:20 PDT 2007',
679 accessDate: 'Wed Mar 14 16:38:12 PDT 2007'
680 },
681 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
682 header: '####',
683 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
684 version: '0.2',
685 creationDate: 'Wed Apr 25 10:04:29 PDT 2007',
686 updateDate: 'Wed Apr 25 10:04:29 PDT 2007',
687 accessDate: 'Sat May 19 11:22:01 PDT 2007'
688 },
689 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
690 header: '####',
691 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
692 version: '0.2',
693 creationDate: 'Wed Mar 14 16:52:12 PDT 2007',
694 updateDate: 'Wed Mar 14 16:52:12 PDT 2007',
695 accessDate: 'Wed Mar 21 12:16:29 PDT 2007'
696 }
697 }
698 },
699 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
700 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
701 version: '0.2',
702 creationDate: 'Wed Mar 14 16:20:58 PDT 2007',
703 updateDate: 'Wed Mar 14 16:47:01 PDT 2007',
704 accessDate: 'Mon Jan 19 16:10:06 PDT 2009',
705 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
706 versions: {
707 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
708 header: '####',
709 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
710 version: '0.2',
711 creationDate: 'Wed Mar 14 16:45:40 PDT 2007',
712 updateDate: 'Wed Mar 14 16:45:40 PDT 2007',
713 accessDate: 'Wed Mar 14 16:45:40 PDT 2007'
714 },
715 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
716 header: '####',
717 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
718 version: '0.2',
719 creationDate: 'Wed Mar 14 16:47:01 PDT 2007',
720 updateDate: 'Wed Mar 14 16:47:01 PDT 2007',
721 accessDate: 'Mon Jan 19 16:10:06 PDT 2009'
722 },
723 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
724 header: '####',
725 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
726 version: '0.2',
727 creationDate: 'Wed Mar 14 16:20:58 PDT 2007',
728 updateDate: 'Wed Mar 14 16:20:58 PDT 2007',
729 accessDate: 'Wed Mar 14 16:43:46 PDT 2007'
730 }
731 }
732 },
733 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
734 data: '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',
735 version: '0.2',
736 creationDate: 'Wed Mar 14 13:35:58 PDT 2007',
737 updateDate: 'Thu May 10 15:01:21 PDT 2007',
738 accessDate: 'Mon Jan 19 16:09:54 PDT 2009',
739 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
740 versions: {
741 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
742 header: '####',
743 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
744 version: '0.2',
745 creationDate: 'Wed Mar 14 13:35:58 PDT 2007',
746 updateDate: 'Wed Mar 14 13:35:58 PDT 2007',
747 accessDate: 'Wed Mar 14 13:35:58 PDT 2007'
748 },
749 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
750 header: '####',
751 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
752 version: '0.2',
753 creationDate: 'Wed Mar 14 19:24:49 PDT 2007',
754 updateDate: 'Wed Mar 14 19:24:49 PDT 2007',
755 accessDate: 'Wed Mar 14 19:24:49 PDT 2007'
756 },
757 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
758 header: '####',
759 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
760 version: '0.2',
761 creationDate: 'Wed Mar 14 17:41:15 PDT 2007',
762 updateDate: 'Wed Mar 14 17:41:15 PDT 2007',
763 accessDate: 'Wed Mar 14 17:41:15 PDT 2007'
764 },
765 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
766 header: '####',
767 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
768 version: '0.2',
769 creationDate: 'Wed Mar 14 19:25:28 PDT 2007',
770 updateDate: 'Wed Mar 14 19:25:28 PDT 2007',
771 accessDate: 'Thu May 10 15:00:47 PDT 2007'
772 },
773 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
774 header: '####',
775 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
776 version: '0.2',
777 creationDate: 'Wed Mar 14 14:46:36 PDT 2007',
778 updateDate: 'Wed Mar 14 14:46:36 PDT 2007',
779 accessDate: 'Wed Mar 14 17:40:01 PDT 2007'
780 },
781 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
782 header: '####',
783 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
784 version: '0.2',
785 creationDate: 'Thu May 10 15:01:21 PDT 2007',
786 updateDate: 'Thu May 10 15:01:21 PDT 2007',
787 accessDate: 'Mon Jan 19 16:09:54 PDT 2009'
788 },
789 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
790 header: '####',
791 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
792 version: '0.2',
793 creationDate: 'Wed Mar 14 17:43:29 PDT 2007',
794 updateDate: 'Wed Mar 14 17:43:29 PDT 2007',
795 accessDate: 'Wed Mar 14 19:23:51 PDT 2007'
796 }
797 }
798 },
799 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
800 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
801 version: '0.3',
802 creationDate: 'Wed Mar 14 17:39:39 PDT 2007',
803 updateDate: 'Wed Feb 13 15:29:04 PDT 2008',
804 accessDate: 'Mon Jan 19 16:09:41 PDT 2009',
805 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
806 versions: {
807 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
808 header: '####',
809 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
810 version: '0.2',
811 creationDate: 'Wed Mar 14 17:39:39 PDT 2007',
812 updateDate: 'Wed Mar 14 17:39:39 PDT 2007',
813 accessDate: 'Tue Apr 17 19:09:44 PDT 2007'
814 },
815 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
816 header: '####',
817 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
818 version: '0.2',
819 creationDate: 'Tue Apr 17 19:12:39 PDT 2007',
820 updateDate: 'Tue Apr 17 19:12:39 PDT 2007',
821 accessDate: 'Wed Feb 13 15:27:04 PDT 2008'
822 },
823 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
824 header: '####',
825 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
826 version: '0.3',
827 creationDate: 'Wed Feb 13 15:29:04 PDT 2008',
828 updateDate: 'Wed Feb 13 15:29:04 PDT 2008',
829 accessDate: 'Mon Jan 19 16:09:41 PDT 2009'
830 },
831 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
832 header: '####',
833 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
834 version: '0.3',
835 creationDate: 'Wed Feb 13 15:28:28 PDT 2008',
836 updateDate: 'Wed Feb 13 15:28:28 PDT 2008',
837 accessDate: 'Wed Feb 13 15:28:28 PDT 2008'
838 },
839 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
840 header: '####',
841 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
842 version: '0.2',
843 creationDate: 'Tue Apr 17 19:11:33 PDT 2007',
844 updateDate: 'Tue Apr 17 19:11:33 PDT 2007',
845 accessDate: 'Tue Apr 17 19:11:33 PDT 2007'
846 }
847 }
848 },
849 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
850 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
851 version: '0.2',
852 creationDate: 'Wed Mar 14 18:43:29 PDT 2007',
853 updateDate: 'Wed Mar 14 18:43:29 PDT 2007',
854 accessDate: 'Mon Jan 19 16:09:30 PDT 2009',
855 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
856 versions: {
857 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
858 header: '####',
859 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
860 version: '0.2',
861 creationDate: 'Wed Mar 14 18:43:29 PDT 2007',
862 updateDate: 'Wed Mar 14 18:43:29 PDT 2007',
863 accessDate: 'Mon Jan 19 16:09:30 PDT 2009'
864 }
865 }
866 }
867 }
868 }
869 }
870 },
871
872 //-------------------------------------------------------------------------
873
874 'test_test_offline_copy_data': {
875 users:{
876 'catchAllUser': {
877 __masterkey_test_value__: 'masterkey',
878 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
879 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
880 },
881 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
882 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
883 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
884 version: '0.2',
885 maxNumberOfRecords: '100',
886 userDetails: '{"records":{"index":{"8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13":"0"},"data":"Ki9chN/ker5c+7zB5NinstllVq1Vs+N5pezZIohKVVa15VLSIyre3DRilRoldy/94LbGaEM3SZsMlf28hYbWySln3ekNMIB+MItaYb8urw+8U6n8+QaRMAClHXukfi8te2d1OIlgjbrBQNMmzBorjIs="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"YgSYIsDeVT87bfiASQqXA2E9"},"version":"0.1"}',
887 statistics: '6Kupec1ZD7Dw0WzK7pPesnLE',
888 userDetailsVersion: '0.3',
889 records: {
890 '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13': {
891 data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
892 // data: 'bXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
893 version: '0.3',
894 creationDate: 'Tue May 05 01:28:36 PDT 2009',
895 updateDate: 'Tue May 05 01:28:36 PDT 2009',
896 accessDate: 'Tue May 05 01:28:36 PDT 2009',
897 currentVersion: 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d',
898 versions: {
899 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d': {
900 header: '####',
901 data: 'Pc18C1A9NwNlecbOtOOAEymNZD5oq20ZvPqMfiCyNhkcmaN9sEnifF31epZSjpDw4XM4ex3HFhhITttXlCrossDVYB8z00k6XsFruCkdwFRmBjb2PdrdZFAkGQeS/8xTarYWgiflkfGocGqVm6EUq1gh8QLE173Jzo15LOSuzuSS90BTMvcsqzzRrIEe+9jwF9/ehLyQ5yYxNImFGQQ2jkW0KiZsjyEbQAGry7B1/AiSUBaGYHYzcB3bFgXnzC3ecPwL+ENZ+azpTd143WneuVMUJrWNp3S+9ZRzboRzcYV6Ax3nOLPS7LTc+e9j9s4CrPvc1L6pG23AzNByDWst0JrqhN37yp67EVVrFQfUDWcKgZyyA/M82q1TVScx+I4A+g9ASC+PdQ3+M5+EOtEfClkgYJFqzXqwPKYwBv4CBKxikS2Vt8x40271kjmVYyGQOIRTo1UKn6u07TS5hxdEgEI+WdukG52813USiD8bQFbN0r4VhjFSqKMAJoItjqvafBNBl+OXYQ1p1zRCXP7wHS4/F7mvrK98gSuIsBgfL+/q9rExXaxIZJNSbs1HGAXR1TxYSvyKZvLa',
902 version: '0.3',
903 creationDate: 'Tue May 05 01:28:36 PDT 2009',
904 updateDate: 'Tue May 05 01:28:36 PDT 2009',
905 accessDate: 'Tue May 05 01:28:36 PDT 2009'
906 }
907 }
908 }
909 }
910 }
911 }
912 },
913
914 //-------------------------------------------------------------------------
915
916 'test_test_offline_copy_data_withExtraVersion': {
917 users:{
918 'catchAllUser': {
919 __masterkey_test_value__: 'masterkey',
920 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
921 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
922 },
923 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
924 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
925 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
926 version: '0.2',
927 maxNumberOfRecords: '100',
928 userDetails: '{"records":{"index":{"75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53":"0"},"data":"YjlNzXUO9m0EXdi5fUguA6RjR5jc2mwuHkpMsHAheExR2zpoV6OJx8tBTdUGqDBAlbIn6xUx2TT+dzgjic/XubgKNsv6JpTvnfiW6ZMWiebKXVigoZw7L5EvmcHjVLI8aoIhVEj4ADwkh9qHm0Kt1zFGQPwwJfo="},"directLogins":{"index":{},"data":"4W5csD8DxlxeXVRROk7wVbXi"},"preferences":{"data":"/DjOoFcgquxUbW5ye2LrpsKM"},"oneTimePasswords":{"data":"DEqkd74lLAGtG4YKRPniBNBU"},"version":"0.1"}',
929 statistics: 'EkRr9wEXi/WOlZfCXphn9kfx',
930 userDetailsVersion: '0.3',
931 records: {
932 '75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53': {
933 data: '/gtNfde5l2J9eeg+rlBHZtqO4RDaWNQwaMEluOVowKdUlGAYjo9FU0NwKsA9CM3ST4sTYl0mylP3C/AGybO8/9sTCkEn20wi0slharA61Rk8uB2lNjCICZB4l3ZGvD4AHKucu8YQzxpWop5dTN8f4us5eJ2VjvJPLqUzSKZL4g+6MiKbjQ==',
934 version: '0.3',
935 creationDate: 'Tue May 05 18:47:53 PDT 2009',
936 updateDate: 'Tue May 05 18:48:59 PDT 2009',
937 accessDate: 'Tue May 05 18:48:59 PDT 2009',
938 currentVersion: '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b',
939 versions: {
940 '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564': {
941 header: '####',
942 data: 'MZGx+tQAecxJNl6UbWHIM8g416Qa8DfWtGo7f2vLkPBbhsr20xnZ233oPqIGceG5/6WMssQd9c8U81urISK+4Ar8zHGUxTdIYLZaDq33Q0uF5vO7OsaBcjL7m+tX7zB+e/eu0ABbqvt+saMsZKKSdIZv2KNbAg5VTiL7GjWuowM23tWgiUBgX3eO5fnUUQWVkBygk0qy2O45oNfb1XcbsGMCfS4YPF9GB/wGSQKG8keMoy1ZWZh4nG+Pdx2ymIrYKLv8T+i7jtWEbyhvEglb7TadCMBBF0pnkYvG3F29skWooZC92dy5213o+3/uSKi0od5tAbvSYZHjT5hDulUtmjRFGq4ZRERLqvrZs9Sg8G2mjtf8Ta99Hob8WLxyGF9x7s1LcLPERtdsP9qCD+I0WtwrDiodl/sPQ/5s3G2S+M/YejKXBvG3AWwoO1gkdhec3+d3meFNvCr0hKNzotrHmDLC4tGyZIaAcBmPQ8xSD5KmNJJFU+V0QIdiEYKnPjo95oSmKyK1UtIoPrWCahfYSKXh+aW53XnzY4JKHRER9vWwdJzz',
943 version: '0.3',
944 creationDate: 'Tue May 05 18:47:53 PDT 2009',
945 updateDate: 'Tue May 05 18:47:53 PDT 2009',
946 accessDate: 'Tue May 05 18:47:53 PDT 2009'
947 },
948 '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7': {
949 header: '####',
950 data: 'Y38v4jhKwcsW8LDTigIhtdLJ2zgv+1rSutqyu0AilBQeSTe4D0rnapZZTW/mNnD5IGpWKFoEl8+WGj1zvGzleNdkOa08nWJEYDNe2h0+FjBSHBUAgH5fraezomRWzJ/Z5HHFiZuFfpjt2BHd0Y3Not6AuL3aBgjjkEai90r2o59Xr70maUwo1UqmtVg3gvX067MC3hlqhNIp390J8LFiSj8Z4US9x/WzVR5Xx069+0PFMBwipq9WJPrcfTPwvP6xVa+J8BCJk3HtboRutq1ZhhHpibm+TY3Xl3gFTTCHWDZCSJ4Rm1dWkyqpx51u/AVg2TC+ljFLKv7hq3euVZNMLNMY2BqoCkcb+w6dFLDs3WfPAW0aQN2P++GFa/eVpN90YxAeXufjsXKaArTMjGWKiHqyU1iVVI8N1QEiFYjjBV1GvkJxog5PjtAzJF++qwHDIa+gJ+NnOfenVF0wIRMCEnpGyvbg3SkUoenKFoHO0IcSP2CW2RWV/GAmiEZEuVD393mKi5B6fpjdO9JVPNyz0i0kW++dtzInwPnglhOAY1ywT0ExOBLIEr8=',
951 version: '0.3',
952 previousVersion: '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564',
953 previousVersionKey: 'f45/Sx3jMC8CgdT8cjfcC4ApA8xMXABFO48jiTh5VjJfTlVqw3NnHRO2KDBIhy0znPvP2AKlpKQHruW8LQno7YLyhEIXh4ChjMUjJsFFwB/LUg==',
954 creationDate: 'Tue May 05 18:48:11 PDT 2009',
955 updateDate: 'Tue May 05 18:48:11 PDT 2009',
956 accessDate: 'Tue May 05 18:48:11 PDT 2009'
957 },
958 '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b': {
959 header: '####',
960 data: 'tkiW41JHOfbYOt2KHx1HtDJEzxbfVS1Y2HJQqdQZ73zhvxnkWLw/X6FMiBexLeoKXO1H9NIWS884MzEO782vg8QRxTizg66Yye+q1Hox+QsaEoaD4UQ54XV1duTOB/XS5P0P9DFvtIz9msEu8GJrvizAdxu/7FG2b5XfENDkwqIzydI7JMfGC0JzDnfGvYkWqoL8jx3Joxa7TNqN4he4v771Ho1ZoUv3Pp7ZGwBU+btl6Q9mcycSf5KXdTw+6nDjfQh8qyts/u7O5xPFh2Yn8zS48x95I4SA4yFKtERU3pLAxIkcZWVb17xT8xlbPESreZ0RyYSR0CgW0wPMxkLHH1uqWycTa7yIxUhyn+JK9jCl4eDa/KUSGbN1yb6pOyjGuev1vHEZv3bOmO52RVVIdMHTe3LezCKY8xpDqtQKSfAvFg1TmabugXePXB+KvPbDDWI5otDEIwLYhDFcSn2FyqUEATSzeU2o1uXO+ffbU3QBrwr27tsreughWSP7905FQbEEshsRUc2Xt92WhTnVM6W74Y0bMLWjTrXbu+hNsjtFYYN6gtezcltnB58MVw==',
961 version: '0.3',
962 previousVersion: '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7',
963 previousVersionKey: 'XtJ8Ub99GXIkxErIPr0HaIrRqlAO0Naa/tPwUA51K2D5R6R3CR6QbHd3GpkCnu+y+bcEIRYrQqgabi3LROYT+1SZ9B9FctX6FyaTjYEazFdCvg==',
964 creationDate: 'Tue May 05 18:48:59 PDT 2009',
965 updateDate: 'Tue May 05 18:48:59 PDT 2009',
966 accessDate: 'Tue May 05 18:48:59 PDT 2009'
967 }
968 }
969 }
970 }
971 }
972 }
973 },
974
975 //-------------------------------------------------------------------------
976 'syntaxFix': ""
977}
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/index.html b/frontend/gamma/tests/tests/Components/GridLayout/index.html
new file mode 100644
index 0000000..0208a82
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/GridLayout/index.html
@@ -0,0 +1,135 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Card Dialog EDITING - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
69
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
76 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
82
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
91
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
95
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
98
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script>
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
107
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script>
111
112 <script type='text/javascript' src='./User.data.js'></script>
113 <script type='text/javascript' src='./TestPageComponent.js'></script>
114 <script type='text/javascript' src='./GridLayout_test.js'></script>
115<script>
116 Clipperz_IEisBroken = false;
117</script>
118
119<!--[if IE]><script>
120Clipperz_IEisBroken = true;
121</script><![endif]-->
122
123 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
124 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
125 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
126
127 <link rel="stylesheet" type="text/css" href="./test.css" />
128
129</head>
130<body>
131
132<div id="component"></div>
133
134</body>
135</html>
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/test.css b/frontend/gamma/tests/tests/Components/GridLayout/test.css
new file mode 100644
index 0000000..21abd07
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/GridLayout/test.css
@@ -0,0 +1,43 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29ul.testTabs {
30 list-style-type: none;
31 padding: 0px;
32 padding-bottom: 30px;
33}
34
35ul.testTabs li {
36 display: inline-table;
37 padding: 0px 10px;
38}
39
40ul.testPanels {
41 list-style-type: none;
42 padding: 0px;
43} \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Components/ProgressBar/index.html b/frontend/gamma/tests/tests/Components/ProgressBar/index.html
new file mode 100644
index 0000000..d72aae0
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/ProgressBar/index.html
@@ -0,0 +1,120 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>ProgressBar - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
74 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
78
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
87
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
89
90 <script type='text/javascript' src='./progressBar_test.js'></script>
91<script>
92 Clipperz_IEisBroken = false;
93</script>
94
95<!--[if IE]><script>
96Clipperz_IEisBroken = true;
97</script><![endif]-->
98
99 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
100 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
101 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
102
103</head>
104<body>
105
106<table border="0" cellpadding="50"><tr><td>
107 <div id="progressBar_5"></div><hr>
108 <div id="progressBar_10"></div><hr>
109 <div id="progressBar_15"></div><hr>
110 <div id="progressBar_20"></div><hr>
111 <div id="progressBar_50"></div><hr>
112</td><td>
113 <div id="progressBar_80"></div><hr>
114 <div id="progressBar_85"></div><hr>
115 <div id="progressBar_90"></div><hr>
116 <div id="progressBar_95"></div><hr>
117 <div id="progressBar_100"></div><hr>
118</td></tr>></table>
119</body>
120</html>
diff --git a/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js b/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js
new file mode 100644
index 0000000..822081a
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js
@@ -0,0 +1,125 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.ProgressBar');
30
31Clipperz.PM.Strings.Languages.initSetup();
32
33Clipperz.Tests.ProgressBar.Tester = function(args) {
34 args = args || {};
35
36 Clipperz.Tests.ProgressBar.Tester.superclass.constructor.call(this, args);
37
38 return this;
39};
40
41Clipperz.Base.extend(Clipperz.Tests.ProgressBar.Tester, Object, {
42
43 'toString': function() {
44 return "Clipperz.Tests.ProgressBar.Tester";
45 },
46
47 //-------------------------------------------------------------------------
48
49 'run': function () {
50 var progressBar;
51/*
52<div id="progressBar_5"></div><hr>
53<div id="progressBar_10"></div><hr>
54<div id="progressBar_15"></div><hr>
55<div id="progressBar_20"></div><hr>
56<div id="progressBar_50"></div><hr>
57<div id="progressBar_80"></div><hr>
58<div id="progressBar_85"></div><hr>
59<div id="progressBar_90"></div><hr>
60<div id="progressBar_95"></div><hr>
61<div id="progressBar_100"></div><hr>
62*/
63
64 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_5')});
65 progressBar.updateProgressHandler('5');
66
67 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_10')});
68 progressBar.updateProgressHandler('10');
69
70 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_15')});
71 progressBar.updateProgressHandler('15');
72
73 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_20')});
74 progressBar.updateProgressHandler('20');
75
76 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_50')});
77 progressBar.updateProgressHandler('50');
78
79 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_80')});
80 progressBar.updateProgressHandler('80');
81
82 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_85')});
83 progressBar.updateProgressHandler('85');
84
85 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_90')});
86 progressBar.updateProgressHandler('90');
87
88 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_95')});
89 progressBar.updateProgressHandler('95');
90
91 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_100')});
92 progressBar.updateProgressHandler('100');
93 },
94
95 //=========================================================================
96 __syntaxFix__: "syntax fix"
97});
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118init = function () {
119 vartester;
120
121 tester = new Clipperz.Tests.ProgressBar.Tester();
122 tester.run();
123};
124
125MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html
new file mode 100644
index 0000000..ac1585f
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html
@@ -0,0 +1,115 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Simple Message Panel - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
74 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
78
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
88
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
91
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
93
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
95
96 <script type='text/javascript' src='./simpleMessagePanel_test.js'></script>
97<script>
98 Clipperz_IEisBroken = false;
99</script>
100
101<!--[if IE]><script>
102Clipperz_IEisBroken = true;
103</script><![endif]-->
104
105 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
106 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
107 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
108
109</head>
110<body>
111
112<div id="tableWrapper"></div>
113
114</body>
115</html>
diff --git a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js
new file mode 100644
index 0000000..85128d6
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js
@@ -0,0 +1,95 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel');
30
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup();
33
34Clipperz.Tests.SimpleMessagePanel.Tester = function(args) {
35 args = args || {};
36
37 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args);
38 //this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39
40 return this;
41};
42
43Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, {
44
45 'toString': function() {
46 return "Clipperz.Tests.SimpleMessagePanel.Tester";
47 },
48
49 //-------------------------------------------------------------------------
50/*
51 'user': function () {
52 return this._user;
53 },
54*/
55 //-------------------------------------------------------------------------
56
57 'run': function () {
58 var deferredResult;
59 var confirmationDialog;
60
61 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
62 title:"Alert",
63 text:"Should lost pending changes? But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness",
64 type:'ALERT',
65 buttons: [
66 {text:"Cancel",result:'CANCEL', isDefault:true},
67 {text:"Ok", result:'OK'}
68 ]
69 });
70
71 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
72 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
73 'openFromElement': null,
74 'onOkCloseToElement': null, //this.getElement('cancelButton'),
75 'onCancelCloseToElement':null
76 });
77 deferredResult.callback();
78
79 return deferredResult;
80 },
81
82 //=========================================================================
83 __syntaxFix__: "syntax fix"
84});
85
86
87
88init = function () {
89 vartester;
90
91 tester = new Clipperz.Tests.SimpleMessagePanel.Tester();
92 tester.run();
93};
94
95MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/Tooltips/index.html b/frontend/gamma/tests/tests/Components/Tooltips/index.html
new file mode 100644
index 0000000..471eca9
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/Tooltips/index.html
@@ -0,0 +1,143 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>TOOLTIPS - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
74 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
78
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
87
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
90
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
93
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
95
96 <script type='text/javascript' src='./tooltips_test.js'></script>
97<script>
98 Clipperz_IEisBroken = false;
99</script>
100
101<!--[if IE]><script>
102Clipperz_IEisBroken = true;
103</script><![endif]-->
104
105 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
106 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
107 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
108
109<style>
110
111div.leftColumn {
112 float:left;
113}
114
115div.rightColumn {
116 float:left;
117}
118
119div.boxWrapper {
120 padding: 70px 200px;
121}
122
123div.box {
124 width: 100px;
125 height: 30px;
126 border: 1px solid red;
127}
128</style>
129
130</head>
131<body>
132
133<div class="leftColumn">
134 <div class="boxWrapper"><div id="ABOVE" class="box">above</div></div>
135 <div class="boxWrapper"><div id="BELOW" class="box">below</div></div>
136</div>
137<div class="rightColumn">
138 <div class="boxWrapper"><div id="LEFT" class="box">left</div></div>
139 <div class="boxWrapper"><div id="RIGHT" class="box">right</div></div>
140</div>
141
142</body>
143</html>
diff --git a/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js b/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js
new file mode 100644
index 0000000..37c0e71
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js
@@ -0,0 +1,117 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.Tooltips');
30
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup();
33
34Clipperz.Tests.Tooltips.Tester = function(args) {
35 args = args || {};
36
37 Clipperz.Tests.Tooltips.Tester.superclass.constructor.call(this, args);
38
39 return this;
40};
41
42Clipperz.Base.extend(Clipperz.Tests.Tooltips.Tester, Object, {
43
44 'toString': function() {
45 return "Clipperz.Tests.Tooltips.Tester";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'run': function () {
51 vartooltip;
52
53//Clipperz.log("================== ABOVE ==================");
54 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
55 'element':MochiKit.DOM.getElement('ABOVE'),
56 'text': "Tooltip displayed above the element",
57 'position':'ABOVE'
58 });
59 tooltip.show();
60
61//Clipperz.log("================== BELOW ==================");
62 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
63 'element':MochiKit.DOM.getElement('BELOW'),
64 'text': "Tooltip displayed below the element",
65 'position':'BELOW'
66 });
67 tooltip.show();
68
69//Clipperz.log("================== LEFT ==================");
70 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
71 'element':MochiKit.DOM.getElement('LEFT'),
72 'text': "Tooltip displayed to the left of the element",
73 'position':'LEFT'
74 });
75 tooltip.show();
76
77//Clipperz.log("================== RIGHT ==================");
78 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
79 'element':MochiKit.DOM.getElement('RIGHT'),
80 'text': "Tooltip displayed to the right the element",
81 'position':'RIGHT'
82 });
83 tooltip.show();
84
85 },
86
87 //=========================================================================
88 __syntaxFix__: "syntax fix"
89});
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110init = function () {
111 vartester;
112
113 tester = new Clipperz.Tests.Tooltips.Tester();
114 tester.run();
115};
116
117MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js b/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js
new file mode 100644
index 0000000..dac8b45
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js
@@ -0,0 +1,977 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29testData = {
30
31 //-------------------------------------------------------------------------
32
33 'simpleLogin_001': {
34 'users': [
35 {
36 'username': "joe",
37 'passphrase': "eoj",
38 'version': "0.2",
39 'connectionVersion':"0.2",
40 'records':{
41 'record 1': {
42 'notes':"Some notes here",
43 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"}
46 ],
47 'directLogins':{
48 "record 1 direct login": {
49 'configuration':"",
50 'bindings':[
51 ],
52 'favicon':"http://www.example.com/favicon.ico"
53 }
54 }
55 }
56 },
57 'otp':[
58 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321"
60 ]
61 }
62 ]
63 },
64
65 //-------------------------------------------------------------------------
66
67 'joe_clipperz_offline_copy_data': {
68 users:{
69 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2',
78 maxNumberOfRecords: '100',
79 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"xuiWbu5GjkueQhyH6sKg5Cn9/CSsPIjYgbhaHmjgwnnB+GL8UO5u0uURxTY6tkG2HbaFRpYZwLnqUUulEkVY6iNqJajFI0qDtrKams11cF2y9LaAalbqyv6U7EUt76d666DkXW8tf88nJ4HYfyAhhPCJ0cw5053K9BAVPbQM7fMA4MYY29k45U3HcIKNZcNqMftCc+fZB+fmZl1g7mSbrXaZyagRkwWwTdJ6/ecVOSSVOkWpckAaQWzGhwbO6zVWLtR9XQReIQZV52TwDMnV5IYJHnlw0Uvv2ZCVSu/oMN2TneW5fcIwQ0x/SRe+n4Mklzucpvasza+ZhRaRUFS53kvmbfPFI5tXqB3Z1+9S7LRLr9Ws97suTQ6G5eW6jKT2vf65ehnQJtA/gW6uwH+3IAT7ukFxO1knaRf7dRJDLuIc4Xnh+bRDnZUqfA+B+04pp6r0OS9oysD35t/HydVFeHgoyMCbL4RzduZvmu7y16WhIznn0DEfRmrYmC68C+DNcAbxeiXU8v14PgGycIg1++0v44Qor/BXfP5JW4WnYjVLW3aXN3FgI5rPuN6PqTzMn7z+eF2V28GNss5pui1xIbR2bTECAAnaRQiaz98F1LH4z5kYG1ehmyjIOLqz1nAv3Kuo7+DZKaSez4nX1oWznbXEnwd6uguukcCGpQllZoHYso/fz07e6p/9fskXPmg7LnMMHApP7Vay6XPhXV/AG0imU7uREFLbgnw3305Ey9fslmD8qCzi8LlqNALEt1TFNpAukvqodkv8V1o6zqzYNMSKaqJV4E9dWMNDpOFFTKv1FuZjZfzyPwyCcePgP7vcJGtUSYqRJwl56Ia8UA+l3FBiX8DCSW3GkG+wusf7bZ5kV6lV5DQJTScIyFxWwcECJ5S8/2QaBPTopeLo2NuMmFwjUwhBGVrDkUmtqjfb6DSfr/dR6AbmraRLXrpd/KUN7wWgp5GdLUAKNT+RdsUc0mLsLF3oT+XshfgfsQqi/pDnX9x3QfH/WuRtoywAIE5APU8Rnl+1NGsEidzeYrBnryA8VRi9vxfhuaxe3+rx1ewB1pgVSERPLF+0MYtetug01yRSxEUYJgYHxQmfnmkCoz+kKCejdpYVqKC+RzhjIMytRbFXNmS0NpRmtBxZrSIskKXjjwjUeEzMAttqAPC4IK1kt5IK+5NZPNZbf2Y8qDsWcBNXfw5sh7pJymRwPCge+S5Jy69tadeSAWpX1YMuq+By/o2KWawpokstxmE6w2RNPFhKXtGPvukoDnpV9wDFgBcoNDJctDVdIPqNolLxn6Y57HoOid6CO2s+PqQcfZSEo7V70Rk6OQ+02M0ED0/4XGq6vflc6IlQ5LO1urRT4INrAQmWdulHnmLf+HESJAc0ZICO1T73aQVaGVVHFQxDMVgaTer1UXP1xxfB1tazfJme2aycsDM1WS5lTwMRRlvgwupkzS+YwGq+nB1QFsZknKgeoacGYxQjFo6EGvszitNU+sK4U/EeAShS/nM/96c10awZVwQnal5T9sYOO31mA2pxyI4TwxkgWw2wkj38msz+8afHvPlFlqlU0UiEm7hYMj5s4L08msIY+GVc7tGgaRYklsnRFUU6s0Kql8BLPkbpdM9RAoSczy4tlGlaBAPeC6ouPgyNf1+VRfVZnqlPF063ok1KcEbd6QqQHo0kgsUMLbtdPbe752dmUo64sZXkuDKISmFEwQjn3SN4K7OOg9sk5QEz1STMvm8pazq1yb+0CE1iad5e+HoNkrGT+5GSVX+YShiItu5eyZXjZ7m8GQ2HZTA7mgv6FwGSI6o0URPIRk/UgKMCggTSat2gf3oVk+aZvRCvkGg+ISjkEKk49tQasLDAfvVjdue2JHpM1UwNhTlurHNasqnwNEzFzhflsMuM+V7dv/6/3AiJBUSC9Oyd/kWRpt5DS0nW+BkBcL5eBoofyssj0tAqxpWe+nNwCL9ljVPdytQCHWp71xEqnDxSq1KWV7u57MmBSaGStdyWtShBvEQdHQIDpXz8HVfOWOxQKttNYkupVJcbYhHNicwLzc3Ox1TaT/trfkmTXT80XXfQA83Ls1VVsYKjHDBT5/bIOx3IzjS0KNl7C5E8BuggSL69t8ogHSOKwH9CugZje3vj0BuzhZsl65k1i/pNS+vYwOifv6BhhbgWS6D2s9+a1Xi5YLGLE/EvMlw82N+o/owUluZ2vhekbYJ0HkuyrL+18l0L5B+8iJS62LzdD+hC93cGxqD9RVQA37yxzpN33l2y6teSrypYU7j2hMVv1l0Y6JU0l5itSdWT3VmWyHzdKLYNFjpA2WY3UgvsWRTJfFYzFEYUu2V6OqY7HzUiuKcVTYwB5Ky2qESzmIFiLRv0E9E+fVoYTKjk8v2gDaNwKWq7AJTabgeNaQVif3lUdZ1oQerb6aRc7PBBBKBD1YE3S8+wJ6C4MIs+XIxuJvjhhbOav5Q+G9Tk251dlt44cWQ61sCPi5pCMAgzcwRH2+ZQOZeYslt6g4XS3TorVlHveIpQkBOPvzO3fUkfUQzKPZ1QXFIBZnTLLIcsV+L/tt5kep9ucrqUjNcREPODf+nM/mQlfLGT8SLU9r2zMFkMm4zXNWswWTsXO7zm1YEErAtyggWff6gM66wz1dnNMiVXMQ=="},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3',
82 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
85 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
87 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
88 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 }
99 }
100 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
103 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
105 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
106 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
114 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
115 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
116 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
122 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
123 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
124 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
130 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
131 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
132 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####',
135 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
136 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
138 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
139 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
140 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####',
143 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
144 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
146 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
147 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
148 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
154 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
155 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
156 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
162 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
163 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
164 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
170 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
171 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
172 }
173 }
174 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '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',
177 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
179 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
180 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
188 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
189 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
190 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
196 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
197 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
198 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
204 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
205 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
206 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
212 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
213 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
214 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
220 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
221 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
222 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
228 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
229 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
230 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
236 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
237 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
238 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
244 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
245 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
246 }
247 }
248 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
253 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
254 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
262 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
263 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
264 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
270 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
271 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
272 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
278 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
279 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
280 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
286 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
287 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
288 }
289 }
290 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
293 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
295 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
296 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
304 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
305 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
306 }
307 }
308 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
313 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
314 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
322 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
323 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
324 }
325 }
326 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
331 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
332 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
340 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
341 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
342 }
343 }
344 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
349 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
350 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
358 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
359 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
360 }
361 }
362 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
365 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
367 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
368 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
376 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
377 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
378 }
379 }
380 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
385 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
386 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
394 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
395 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
396 }
397 }
398 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 CEST 2007',
403 updateDate: 'Tue May 01 01:13:27 CEST 2007',
404 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####',
409 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
410 version: '0.2',
411 creationDate: 'Tue May 01 01:10:17 CEST 2007',
412 updateDate: 'Tue May 01 01:10:17 CEST 2007',
413 accessDate: 'Tue May 01 01:10:17 CEST 2007'
414 },
415 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
416 header: '####',
417 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
418 version: '0.2',
419 creationDate: 'Tue May 01 01:13:27 CEST 2007',
420 updateDate: 'Tue May 01 01:13:27 CEST 2007',
421 accessDate: 'Mon Jan 19 16:10:02 CET 2009'
422 }
423 }
424 },
425 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
426 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
427 version: '0.2',
428 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
429 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
430 accessDate: 'Mon Jan 19 16:10:01 CET 2009',
431 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
432 versions: {
433 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
434 header: '####',
435 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
436 version: '0.2',
437 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
438 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
439 accessDate: 'Mon Jan 19 16:10:01 CET 2009'
440 }
441 }
442 },
443 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
444 data: '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',
445 version: '0.3',
446 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
447 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
448 accessDate: 'Thu Feb 12 12:54:37 CET 2009',
449 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
450 versions: {
451 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
452 header: '####',
453 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
454 version: '0.3',
455 creationDate: 'Thu Feb 12 12:54:37 CET 2009',
456 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
457 accessDate: 'Thu Feb 12 12:54:37 CET 2009'
458 },
459 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
460 header: '####',
461 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
462 version: '0.3',
463 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
464 updateDate: 'Thu Feb 12 12:45:43 CET 2009',
465 accessDate: 'Thu Feb 12 12:45:43 CET 2009'
466 },
467 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
468 header: '####',
469 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
470 version: '0.3',
471 creationDate: 'Thu Feb 12 12:47:39 CET 2009',
472 updateDate: 'Thu Feb 12 12:47:39 CET 2009',
473 accessDate: 'Thu Feb 12 12:47:39 CET 2009'
474 }
475 }
476 },
477 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
478 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
479 version: '0.2',
480 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
481 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
482 accessDate: 'Mon Jan 19 16:10:12 CET 2009',
483 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
484 versions: {
485 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
486 header: '####',
487 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
488 version: '0.2',
489 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
490 updateDate: 'Wed Mar 14 15:51:17 CET 2007',
491 accessDate: 'Wed Apr 25 10:37:27 CEST 2007'
492 },
493 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
494 header: '####',
495 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
496 version: '0.2',
497 creationDate: 'Wed Apr 25 10:39:26 CEST 2007',
498 updateDate: 'Wed Apr 25 10:39:26 CEST 2007',
499 accessDate: 'Wed Apr 25 10:39:26 CEST 2007'
500 },
501 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
502 header: '####',
503 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
504 version: '0.2',
505 creationDate: 'Wed Apr 25 11:14:05 CEST 2007',
506 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
507 accessDate: 'Mon Jan 19 16:10:12 CET 2009'
508 },
509 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
510 header: '####',
511 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
512 version: '0.2',
513 creationDate: 'Wed Apr 25 10:51:49 CEST 2007',
514 updateDate: 'Wed Apr 25 10:51:49 CEST 2007',
515 accessDate: 'Wed Apr 25 10:51:49 CEST 2007'
516 },
517 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
518 header: '####',
519 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
520 version: '0.2',
521 creationDate: 'Wed Apr 25 11:01:21 CEST 2007',
522 updateDate: 'Wed Apr 25 11:01:21 CEST 2007',
523 accessDate: 'Wed Apr 25 11:01:21 CEST 2007'
524 },
525 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
526 header: '####',
527 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
528 version: '0.2',
529 creationDate: 'Wed Apr 25 10:59:57 CEST 2007',
530 updateDate: 'Wed Apr 25 10:59:57 CEST 2007',
531 accessDate: 'Wed Apr 25 10:59:57 CEST 2007'
532 },
533 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
534 header: '####',
535 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
536 version: '0.2',
537 creationDate: 'Wed Apr 25 10:38:17 CEST 2007',
538 updateDate: 'Wed Apr 25 10:38:17 CEST 2007',
539 accessDate: 'Wed Apr 25 10:38:17 CEST 2007'
540 },
541 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
542 header: '####',
543 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
544 version: '0.2',
545 creationDate: 'Wed Apr 25 10:56:58 CEST 2007',
546 updateDate: 'Wed Apr 25 10:56:58 CEST 2007',
547 accessDate: 'Wed Apr 25 10:56:58 CEST 2007'
548 },
549 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
550 header: '####',
551 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
552 version: '0.2',
553 creationDate: 'Wed Apr 25 10:58:33 CEST 2007',
554 updateDate: 'Wed Apr 25 10:58:33 CEST 2007',
555 accessDate: 'Wed Apr 25 10:58:33 CEST 2007'
556 }
557 }
558 },
559 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
560 data: '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',
561 version: '0.2',
562 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
563 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
564 accessDate: 'Mon Jan 19 16:10:23 CET 2009',
565 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
566 versions: {
567 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
568 header: '####',
569 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
570 version: '0.2',
571 creationDate: 'Wed Mar 14 17:27:40 CET 2007',
572 updateDate: 'Wed Mar 14 17:27:40 CET 2007',
573 accessDate: 'Wed Mar 14 19:00:21 CET 2007'
574 },
575 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
576 header: '####',
577 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
578 version: '0.2',
579 creationDate: 'Wed Mar 14 16:09:07 CET 2007',
580 updateDate: 'Wed Mar 14 16:09:07 CET 2007',
581 accessDate: 'Wed Mar 14 16:39:40 CET 2007'
582 },
583 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
584 header: '####',
585 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
586 version: '0.2',
587 creationDate: 'Wed Mar 14 19:01:05 CET 2007',
588 updateDate: 'Wed Mar 14 19:01:05 CET 2007',
589 accessDate: 'Tue Apr 17 19:20:33 CEST 2007'
590 },
591 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
592 header: '####',
593 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
594 version: '0.2',
595 creationDate: 'Wed Mar 14 17:17:20 CET 2007',
596 updateDate: 'Wed Mar 14 17:17:20 CET 2007',
597 accessDate: 'Wed Mar 14 17:22:06 CET 2007'
598 },
599 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
600 header: '####',
601 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
602 version: '0.2',
603 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
604 updateDate: 'Wed Mar 14 16:06:54 CET 2007',
605 accessDate: 'Wed Mar 14 16:06:54 CET 2007'
606 },
607 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
608 header: '####',
609 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
610 version: '0.2',
611 creationDate: 'Tue Apr 17 19:23:41 CEST 2007',
612 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
613 accessDate: 'Mon Jan 19 16:10:23 CET 2009'
614 },
615 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
616 header: '####',
617 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
618 version: '0.2',
619 creationDate: 'Tue Apr 17 19:22:08 CEST 2007',
620 updateDate: 'Tue Apr 17 19:22:08 CEST 2007',
621 accessDate: 'Tue Apr 17 19:22:08 CEST 2007'
622 }
623 }
624 },
625 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
626 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
627 version: '0.2',
628 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
629 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
630 accessDate: 'Mon Jan 19 16:09:28 CET 2009',
631 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
632 versions: {
633 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
634 header: '####',
635 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
636 version: '0.2',
637 creationDate: 'Wed Mar 14 16:51:02 CET 2007',
638 updateDate: 'Wed Mar 14 16:51:02 CET 2007',
639 accessDate: 'Wed Mar 14 16:51:02 CET 2007'
640 },
641 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
642 header: '####',
643 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
644 version: '0.2',
645 creationDate: 'Mon Jul 09 15:10:15 CEST 2007',
646 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
647 accessDate: 'Mon Jan 19 16:09:28 CET 2009'
648 },
649 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
650 header: '####',
651 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
652 version: '0.2',
653 creationDate: 'Wed Mar 21 12:56:43 CET 2007',
654 updateDate: 'Wed Mar 21 12:56:43 CET 2007',
655 accessDate: 'Wed Apr 25 09:59:58 CEST 2007'
656 },
657 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
658 header: '####',
659 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
660 version: '0.2',
661 creationDate: 'Sat May 19 11:26:44 CEST 2007',
662 updateDate: 'Sat May 19 11:26:44 CEST 2007',
663 accessDate: 'Mon Jul 09 15:08:39 CEST 2007'
664 },
665 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
666 header: '####',
667 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
668 version: '0.2',
669 creationDate: 'Wed Mar 14 16:38:54 CET 2007',
670 updateDate: 'Wed Mar 14 16:38:54 CET 2007',
671 accessDate: 'Wed Mar 14 16:38:54 CET 2007'
672 },
673 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
674 header: '####',
675 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
676 version: '0.2',
677 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
678 updateDate: 'Wed Mar 14 16:36:20 CET 2007',
679 accessDate: 'Wed Mar 14 16:38:12 CET 2007'
680 },
681 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
682 header: '####',
683 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
684 version: '0.2',
685 creationDate: 'Wed Apr 25 10:04:29 CEST 2007',
686 updateDate: 'Wed Apr 25 10:04:29 CEST 2007',
687 accessDate: 'Sat May 19 11:22:01 CEST 2007'
688 },
689 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
690 header: '####',
691 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
692 version: '0.2',
693 creationDate: 'Wed Mar 14 16:52:12 CET 2007',
694 updateDate: 'Wed Mar 14 16:52:12 CET 2007',
695 accessDate: 'Wed Mar 21 12:16:29 CET 2007'
696 }
697 }
698 },
699 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
700 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
701 version: '0.2',
702 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
703 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
704 accessDate: 'Mon Jan 19 16:10:06 CET 2009',
705 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
706 versions: {
707 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
708 header: '####',
709 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
710 version: '0.2',
711 creationDate: 'Wed Mar 14 16:45:40 CET 2007',
712 updateDate: 'Wed Mar 14 16:45:40 CET 2007',
713 accessDate: 'Wed Mar 14 16:45:40 CET 2007'
714 },
715 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
716 header: '####',
717 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
718 version: '0.2',
719 creationDate: 'Wed Mar 14 16:47:01 CET 2007',
720 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
721 accessDate: 'Mon Jan 19 16:10:06 CET 2009'
722 },
723 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
724 header: '####',
725 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
726 version: '0.2',
727 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
728 updateDate: 'Wed Mar 14 16:20:58 CET 2007',
729 accessDate: 'Wed Mar 14 16:43:46 CET 2007'
730 }
731 }
732 },
733 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
734 data: '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',
735 version: '0.2',
736 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
737 updateDate: 'Thu May 10 15:01:21 CEST 2007',
738 accessDate: 'Mon Jan 19 16:09:54 CET 2009',
739 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
740 versions: {
741 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
742 header: '####',
743 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
744 version: '0.2',
745 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
746 updateDate: 'Wed Mar 14 13:35:58 CET 2007',
747 accessDate: 'Wed Mar 14 13:35:58 CET 2007'
748 },
749 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
750 header: '####',
751 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
752 version: '0.2',
753 creationDate: 'Wed Mar 14 19:24:49 CET 2007',
754 updateDate: 'Wed Mar 14 19:24:49 CET 2007',
755 accessDate: 'Wed Mar 14 19:24:49 CET 2007'
756 },
757 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
758 header: '####',
759 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
760 version: '0.2',
761 creationDate: 'Wed Mar 14 17:41:15 CET 2007',
762 updateDate: 'Wed Mar 14 17:41:15 CET 2007',
763 accessDate: 'Wed Mar 14 17:41:15 CET 2007'
764 },
765 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
766 header: '####',
767 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
768 version: '0.2',
769 creationDate: 'Wed Mar 14 19:25:28 CET 2007',
770 updateDate: 'Wed Mar 14 19:25:28 CET 2007',
771 accessDate: 'Thu May 10 15:00:47 CEST 2007'
772 },
773 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
774 header: '####',
775 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
776 version: '0.2',
777 creationDate: 'Wed Mar 14 14:46:36 CET 2007',
778 updateDate: 'Wed Mar 14 14:46:36 CET 2007',
779 accessDate: 'Wed Mar 14 17:40:01 CET 2007'
780 },
781 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
782 header: '####',
783 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
784 version: '0.2',
785 creationDate: 'Thu May 10 15:01:21 CEST 2007',
786 updateDate: 'Thu May 10 15:01:21 CEST 2007',
787 accessDate: 'Mon Jan 19 16:09:54 CET 2009'
788 },
789 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
790 header: '####',
791 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
792 version: '0.2',
793 creationDate: 'Wed Mar 14 17:43:29 CET 2007',
794 updateDate: 'Wed Mar 14 17:43:29 CET 2007',
795 accessDate: 'Wed Mar 14 19:23:51 CET 2007'
796 }
797 }
798 },
799 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
800 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
801 version: '0.3',
802 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
803 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
804 accessDate: 'Mon Jan 19 16:09:41 CET 2009',
805 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
806 versions: {
807 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
808 header: '####',
809 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
810 version: '0.2',
811 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
812 updateDate: 'Wed Mar 14 17:39:39 CET 2007',
813 accessDate: 'Tue Apr 17 19:09:44 CEST 2007'
814 },
815 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
816 header: '####',
817 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
818 version: '0.2',
819 creationDate: 'Tue Apr 17 19:12:39 CEST 2007',
820 updateDate: 'Tue Apr 17 19:12:39 CEST 2007',
821 accessDate: 'Wed Feb 13 15:27:04 CET 2008'
822 },
823 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
824 header: '####',
825 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
826 version: '0.3',
827 creationDate: 'Wed Feb 13 15:29:04 CET 2008',
828 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
829 accessDate: 'Mon Jan 19 16:09:41 CET 2009'
830 },
831 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
832 header: '####',
833 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
834 version: '0.3',
835 creationDate: 'Wed Feb 13 15:28:28 CET 2008',
836 updateDate: 'Wed Feb 13 15:28:28 CET 2008',
837 accessDate: 'Wed Feb 13 15:28:28 CET 2008'
838 },
839 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
840 header: '####',
841 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
842 version: '0.2',
843 creationDate: 'Tue Apr 17 19:11:33 CEST 2007',
844 updateDate: 'Tue Apr 17 19:11:33 CEST 2007',
845 accessDate: 'Tue Apr 17 19:11:33 CEST 2007'
846 }
847 }
848 },
849 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
850 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
851 version: '0.2',
852 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
853 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
854 accessDate: 'Mon Jan 19 16:09:30 CET 2009',
855 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
856 versions: {
857 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
858 header: '####',
859 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
860 version: '0.2',
861 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
862 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
863 accessDate: 'Mon Jan 19 16:09:30 CET 2009'
864 }
865 }
866 }
867 }
868 }
869 }
870 },
871
872 //-------------------------------------------------------------------------
873
874 'test_test_offline_copy_data': {
875 users:{
876 'catchAllUser': {
877 __masterkey_test_value__: 'masterkey',
878 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
879 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
880 },
881 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
882 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
883 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
884 version: '0.2',
885 maxNumberOfRecords: '100',
886 userDetails: '{"records":{"index":{"8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13":"0"},"data":"Ki9chN/ker5c+7zB5NinstllVq1Vs+N5pezZIohKVVa15VLSIyre3DRilRoldy/94LbGaEM3SZsMlf28hYbWySln3ekNMIB+MItaYb8urw+8U6n8+QaRMAClHXukfi8te2d1OIlgjbrBQNMmzBorjIs="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"YgSYIsDeVT87bfiASQqXA2E9"},"version":"0.1"}',
887 statistics: '6Kupec1ZD7Dw0WzK7pPesnLE',
888 userDetailsVersion: '0.3',
889 records: {
890 '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13': {
891 data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
892 // data: 'bXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
893 version: '0.3',
894 creationDate: 'Tue May 05 01:28:36 PDT 2009',
895 updateDate: 'Tue May 05 01:28:36 PDT 2009',
896 accessDate: 'Tue May 05 01:28:36 PDT 2009',
897 currentVersion: 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d',
898 versions: {
899 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d': {
900 header: '####',
901 data: 'Pc18C1A9NwNlecbOtOOAEymNZD5oq20ZvPqMfiCyNhkcmaN9sEnifF31epZSjpDw4XM4ex3HFhhITttXlCrossDVYB8z00k6XsFruCkdwFRmBjb2PdrdZFAkGQeS/8xTarYWgiflkfGocGqVm6EUq1gh8QLE173Jzo15LOSuzuSS90BTMvcsqzzRrIEe+9jwF9/ehLyQ5yYxNImFGQQ2jkW0KiZsjyEbQAGry7B1/AiSUBaGYHYzcB3bFgXnzC3ecPwL+ENZ+azpTd143WneuVMUJrWNp3S+9ZRzboRzcYV6Ax3nOLPS7LTc+e9j9s4CrPvc1L6pG23AzNByDWst0JrqhN37yp67EVVrFQfUDWcKgZyyA/M82q1TVScx+I4A+g9ASC+PdQ3+M5+EOtEfClkgYJFqzXqwPKYwBv4CBKxikS2Vt8x40271kjmVYyGQOIRTo1UKn6u07TS5hxdEgEI+WdukG52813USiD8bQFbN0r4VhjFSqKMAJoItjqvafBNBl+OXYQ1p1zRCXP7wHS4/F7mvrK98gSuIsBgfL+/q9rExXaxIZJNSbs1HGAXR1TxYSvyKZvLa',
902 version: '0.3',
903 creationDate: 'Tue May 05 01:28:36 PDT 2009',
904 updateDate: 'Tue May 05 01:28:36 PDT 2009',
905 accessDate: 'Tue May 05 01:28:36 PDT 2009'
906 }
907 }
908 }
909 }
910 }
911 }
912 },
913
914 //-------------------------------------------------------------------------
915
916 'test_test_offline_copy_data_withExtraVersion': {
917 users:{
918 'catchAllUser': {
919 __masterkey_test_value__: 'masterkey',
920 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
921 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
922 },
923 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
924 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
925 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
926 version: '0.2',
927 maxNumberOfRecords: '100',
928 userDetails: '{"records":{"index":{"75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53":"0"},"data":"YjlNzXUO9m0EXdi5fUguA6RjR5jc2mwuHkpMsHAheExR2zpoV6OJx8tBTdUGqDBAlbIn6xUx2TT+dzgjic/XubgKNsv6JpTvnfiW6ZMWiebKXVigoZw7L5EvmcHjVLI8aoIhVEj4ADwkh9qHm0Kt1zFGQPwwJfo="},"directLogins":{"index":{},"data":"4W5csD8DxlxeXVRROk7wVbXi"},"preferences":{"data":"/DjOoFcgquxUbW5ye2LrpsKM"},"oneTimePasswords":{"data":"DEqkd74lLAGtG4YKRPniBNBU"},"version":"0.1"}',
929 statistics: 'EkRr9wEXi/WOlZfCXphn9kfx',
930 userDetailsVersion: '0.3',
931 records: {
932 '75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53': {
933 data: '/gtNfde5l2J9eeg+rlBHZtqO4RDaWNQwaMEluOVowKdUlGAYjo9FU0NwKsA9CM3ST4sTYl0mylP3C/AGybO8/9sTCkEn20wi0slharA61Rk8uB2lNjCICZB4l3ZGvD4AHKucu8YQzxpWop5dTN8f4us5eJ2VjvJPLqUzSKZL4g+6MiKbjQ==',
934 version: '0.3',
935 creationDate: 'Tue May 05 18:47:53 CEST 2009',
936 updateDate: 'Tue May 05 18:48:59 CEST 2009',
937 accessDate: 'Tue May 05 18:48:59 CEST 2009',
938 currentVersion: '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b',
939 versions: {
940 '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564': {
941 header: '####',
942 data: 'MZGx+tQAecxJNl6UbWHIM8g416Qa8DfWtGo7f2vLkPBbhsr20xnZ233oPqIGceG5/6WMssQd9c8U81urISK+4Ar8zHGUxTdIYLZaDq33Q0uF5vO7OsaBcjL7m+tX7zB+e/eu0ABbqvt+saMsZKKSdIZv2KNbAg5VTiL7GjWuowM23tWgiUBgX3eO5fnUUQWVkBygk0qy2O45oNfb1XcbsGMCfS4YPF9GB/wGSQKG8keMoy1ZWZh4nG+Pdx2ymIrYKLv8T+i7jtWEbyhvEglb7TadCMBBF0pnkYvG3F29skWooZC92dy5213o+3/uSKi0od5tAbvSYZHjT5hDulUtmjRFGq4ZRERLqvrZs9Sg8G2mjtf8Ta99Hob8WLxyGF9x7s1LcLPERtdsP9qCD+I0WtwrDiodl/sPQ/5s3G2S+M/YejKXBvG3AWwoO1gkdhec3+d3meFNvCr0hKNzotrHmDLC4tGyZIaAcBmPQ8xSD5KmNJJFU+V0QIdiEYKnPjo95oSmKyK1UtIoPrWCahfYSKXh+aW53XnzY4JKHRER9vWwdJzz',
943 version: '0.3',
944 creationDate: 'Tue May 05 18:47:53 CEST 2009',
945 updateDate: 'Tue May 05 18:47:53 CEST 2009',
946 accessDate: 'Tue May 05 18:47:53 CEST 2009'
947 },
948 '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7': {
949 header: '####',
950 data: 'Y38v4jhKwcsW8LDTigIhtdLJ2zgv+1rSutqyu0AilBQeSTe4D0rnapZZTW/mNnD5IGpWKFoEl8+WGj1zvGzleNdkOa08nWJEYDNe2h0+FjBSHBUAgH5fraezomRWzJ/Z5HHFiZuFfpjt2BHd0Y3Not6AuL3aBgjjkEai90r2o59Xr70maUwo1UqmtVg3gvX067MC3hlqhNIp390J8LFiSj8Z4US9x/WzVR5Xx069+0PFMBwipq9WJPrcfTPwvP6xVa+J8BCJk3HtboRutq1ZhhHpibm+TY3Xl3gFTTCHWDZCSJ4Rm1dWkyqpx51u/AVg2TC+ljFLKv7hq3euVZNMLNMY2BqoCkcb+w6dFLDs3WfPAW0aQN2P++GFa/eVpN90YxAeXufjsXKaArTMjGWKiHqyU1iVVI8N1QEiFYjjBV1GvkJxog5PjtAzJF++qwHDIa+gJ+NnOfenVF0wIRMCEnpGyvbg3SkUoenKFoHO0IcSP2CW2RWV/GAmiEZEuVD393mKi5B6fpjdO9JVPNyz0i0kW++dtzInwPnglhOAY1ywT0ExOBLIEr8=',
951 version: '0.3',
952 previousVersion: '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564',
953 previousVersionKey: 'f45/Sx3jMC8CgdT8cjfcC4ApA8xMXABFO48jiTh5VjJfTlVqw3NnHRO2KDBIhy0znPvP2AKlpKQHruW8LQno7YLyhEIXh4ChjMUjJsFFwB/LUg==',
954 creationDate: 'Tue May 05 18:48:11 CEST 2009',
955 updateDate: 'Tue May 05 18:48:11 CEST 2009',
956 accessDate: 'Tue May 05 18:48:11 CEST 2009'
957 },
958 '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b': {
959 header: '####',
960 data: 'tkiW41JHOfbYOt2KHx1HtDJEzxbfVS1Y2HJQqdQZ73zhvxnkWLw/X6FMiBexLeoKXO1H9NIWS884MzEO782vg8QRxTizg66Yye+q1Hox+QsaEoaD4UQ54XV1duTOB/XS5P0P9DFvtIz9msEu8GJrvizAdxu/7FG2b5XfENDkwqIzydI7JMfGC0JzDnfGvYkWqoL8jx3Joxa7TNqN4he4v771Ho1ZoUv3Pp7ZGwBU+btl6Q9mcycSf5KXdTw+6nDjfQh8qyts/u7O5xPFh2Yn8zS48x95I4SA4yFKtERU3pLAxIkcZWVb17xT8xlbPESreZ0RyYSR0CgW0wPMxkLHH1uqWycTa7yIxUhyn+JK9jCl4eDa/KUSGbN1yb6pOyjGuev1vHEZv3bOmO52RVVIdMHTe3LezCKY8xpDqtQKSfAvFg1TmabugXePXB+KvPbDDWI5otDEIwLYhDFcSn2FyqUEATSzeU2o1uXO+ffbU3QBrwr27tsreughWSP7905FQbEEshsRUc2Xt92WhTnVM6W74Y0bMLWjTrXbu+hNsjtFYYN6gtezcltnB58MVw==',
961 version: '0.3',
962 previousVersion: '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7',
963 previousVersionKey: 'XtJ8Ub99GXIkxErIPr0HaIrRqlAO0Naa/tPwUA51K2D5R6R3CR6QbHd3GpkCnu+y+bcEIRYrQqgabi3LROYT+1SZ9B9FctX6FyaTjYEazFdCvg==',
964 creationDate: 'Tue May 05 18:48:59 CEST 2009',
965 updateDate: 'Tue May 05 18:48:59 CEST 2009',
966 accessDate: 'Tue May 05 18:48:59 CEST 2009'
967 }
968 }
969 }
970 }
971 }
972 }
973 },
974
975 //-------------------------------------------------------------------------
976 'syntaxFix': ""
977}
diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/index.html b/frontend/gamma/tests/tests/Components/UnlockPassword/index.html
new file mode 100644
index 0000000..5534068
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/index.html
@@ -0,0 +1,117 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>UnlockPassword - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
74 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
78
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
88
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script>
92
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
94
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
96
97 <script type='text/javascript' src='./User.data.js'></script>
98 <script type='text/javascript' src='./unlockPassword_test.js'></script>
99<script>
100 Clipperz_IEisBroken = false;
101</script>
102
103<!--[if IE]><script>
104Clipperz_IEisBroken = true;
105</script><![endif]-->
106
107 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
108 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
109 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
110
111</head>
112<body>
113
114<div id="tableWrapper"></div>
115
116</body>
117</html>
diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js b/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js
new file mode 100644
index 0000000..87f3275
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js
@@ -0,0 +1,136 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel');
30
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup();
33
34Clipperz.Tests.SimpleMessagePanel.Tester = function(args) {
35 args = args || {};
36
37 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args);
38
39 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:MochiKit.Base.method(this, 'getUserPassphrase')});
40 this._unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
41 'title':"Unlock account",
42 'text': "Insert the passprase to unlock the account",
43 'type': 'INFO',
44 'buttons': [
45 {text:"Cancel",result:'CANCEL'},
46 {text:"Unlock", result:'OK',isDefault:true}
47 ],
48 'openFromElement': null,
49 'onOkCloseToElement': null, //this.getElement('cancelButton'),
50 'onCancelCloseToElement':null
51 });
52
53 return this;
54};
55
56Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, {
57
58 'toString': function() {
59 return "Clipperz.Tests.SimpleMessagePanel.Tester";
60 },
61
62 //-------------------------------------------------------------------------
63
64 'user': function () {
65 return this._user;
66 },
67
68 'unlockPasswordComponent': function () {
69 return this._unlockPasswordComponent;
70 },
71
72 //-------------------------------------------------------------------------
73
74 'run': function () {
75 var deferredResult;
76 var proxy;
77
78 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
79
80 deferredResult = new Clipperz.Async.Deferred("unlockPassword_test.run", {trace:false});
81 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
82 deferredResult.addMethod(this.user(), 'login');
83 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
84 // deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
85 // cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
86 // cardDialogController.run();
87 // }, this));
88 deferredResult.callback();
89
90 return deferredResult;
91 },
92
93 //=========================================================================
94
95 'getUserPassphrase': function () {
96 return this.unlockPasswordComponent().getPassphrase();
97/*
98 var deferredResult;
99 var confirmationDialog;
100
101 confirmationDialog = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
102 title:"Unlock account",
103 text:"Insert the passprase to unlock the account",
104 type:'INFO',
105 buttons: [
106 {text:"Cancel",result:'CANCEL'},
107 {text:"Unlock", result:'OK',isDefault:true}
108 ]
109 });
110
111 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
112 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
113 'openFromElement': null,
114 'onOkCloseToElement': null, //this.getElement('cancelButton'),
115 'onCancelCloseToElement':null
116 });
117 deferredResult.callback();
118
119 return deferredResult;
120*/
121 },
122
123 //=========================================================================
124 __syntaxFix__: "syntax fix"
125});
126
127
128
129init = function () {
130 vartester;
131
132 tester = new Clipperz.Tests.SimpleMessagePanel.Tester();
133 tester.run();
134};
135
136MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js
new file mode 100644
index 0000000..cb80473
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js
@@ -0,0 +1,66 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29newWindow = function (anEvent) {
30 var windowURL;
31 var htmlString;
32 var newWindow;
33
34 anEvent.preventDefault();
35
36 //htmlString = '<html><head><title>TARGET WINDOW</title></head><body><h3>this is the target window</h3></body></html>';
37 // windowURL = 'data:text/html;charset=utf-8;base64,' + (new Clipperz.ByteArray(htmlString)).toBase64String();
38
39 //newWindow = window.open(windowURL, 'CrossWindowsBookmarklet_TEST');
40 newWindow = window.open('http://mail.google.com', 'CrossWindowsBookmarklet_TEST');
41 MochiKit.Signal.connect(newWindow, 'onload', targetWindowDidLoad)
42 console.log("new window", newWindow);
43
44 MochiKit.Async.callLater(2, runBookmarkletScript);
45};
46
47targetWindowDidLoad = function () {
48//console.log(">>> targetWindowDidLoad")
49 runBookmarkletScript(null);
50};
51
52runBookmarkletScript = function (anEvent) {
53 if (anEvent != null) {
54 anEvent.preventDefault();
55 }
56
57 window.open('javascript:_cble=null;ilf=function(_1){var%20_2;var%20_3;var%20i,c;_3=0;_2=_1.elements;c=_2.length;for(i=0;i%3Cc;i++){if(_2[i].type==%22password%22){_3++;}}return(_3==1);};flf=function(_6,_7){var%20_8;var%20_9;var%20i,c;_8=null;try{_9=_6.getElementsByTagName(%22form%22);c=_9.length;for(i=0;(i%3Cc)&&(_8==null);i++){if(ilf(_9[i])){_8=_9[i];}}if((_8==null)&&(_7==0)){var%20_c;_c=_6.getElementsByTagName(%22iframe%22);c=_c.length;for(i=0;(i%3Cc)&&(_8==null);i++){_8=flf(_c[i].contentDocument,(_7+1));}}}catch(e){_cble=e;}return%20_8;};iev=function(_d){var%20_e;if((_d.tagName.toLowerCase()==%22input%22)&&(_d.getAttribute(%22name%22)!=null)){_e={};_e.type=_d.getAttribute(%22type%22)||%22text%22;_e.name=_d.getAttribute(%22name%22);_e.value=_d.value;if(_d.type.toLowerCase()==%22radio%22){_e.checked=_d.checked;}}else{if((_d.tagName.toLowerCase()==%22select%22)&&(_d.getAttribute(%22name%22)!=null)){var%20_f;var%20c,i;_e={};_e.type=%22select%22;_e.name=_d.getAttribute(%22name%22);_e.options=[];_f=_d.options;c=_f.length;for(i=0;i%3Cc;i++){var%20_12;_12={};_12.selected=_f[i].selected;_12.label=_f[i].label||_f[i].innerHTML;_12.value=_f[i].value;_e.options.push(_12);}}else{_e=null;}}return%20_e;};fp=function(_13){var%20_14;var%20i,c;var%20_17;if(_13==null){_14=null;}else{var%20_18;var%20_19;_14={};_18={};_17=_13.action;if(_17.constructor!=String){_17=_13.getAttribute(%22action%22);}if(%2f^https?%5c:%5c%2f%5c%2f.*%2f.test(_17)){_17=_17;}else{if(%2f^%5c%2f.*%2f.test(_17)){_17=window.location.protocol+%22%2f%22+%22%2f%22+window.location.hostname+_17;}else{_17=window.location.href.replace(%2f%5c%2f[^%5c%2f]*$%2f,%22%2f%22+_17);}}_14.attributes={};_14.attributes.action=_17;_14.attributes.method=_13.getAttribute(%22method%22);_14.inputs=[];c=_13.elements.length;for(i=0;i%3Cc;i++){var%20_1a;var%20_1b;_1a=_13.elements[i];_1b=iev(_1a);if(_1b!=null){if(_1b.type!=%22radio%22){_14.inputs.push(_1b);}else{var%20_1c;var%20_1d;_1c=_18[_1b.name];if(_1c==null){_1c={};_1c.name=_1b.name;_1c.type=%22radio%22;_1c.options=[];_18[_1b.name]=_1c;}_1d={};_1d.value=_1b.value;_1d.checked=_1b.checked;_1c.options.push(_1d);}}}for(_19%20in%20_18){if(typeof(_18[_19])!=%22function%22){_14.inputs.push(_18[_19]);}}}return%20_14;};pp=function(){var%20_1e;_1e={};_1e[%22title%22]=document.title;return%20_1e;};rs=function(o){return(%22%5c%22%22+o.replace(%2f([%22%5c%5c])%2fg,%22%5c%5c$1%22)+%22%5c%22%22).replace(%2f[%5cf]%2fg,%22%5c%5cf%22).replace(%2f[%5cb]%2fg,%22%5c%5cb%22).replace(%2f[%5cn]%2fg,%22%5c%5cn%22).replace(%2f[%5ct]%2fg,%22%5c%5ct%22).replace(%2f[%5cr]%2fg,%22%5c%5cr%22);};sj=function(o){var%20_21=typeof(o);if(_21==%22number%22||_21==%22boolean%22){return%20o+%22%22;}else{if(o===null){return%20%22null%22;}}if(_21==%22string%22){return%20rs(o);}var%20me=arguments.callee;if(_21!=%22function%22&&typeof(o.length)==%22number%22){var%20res=[];for(var%20i=0;i%3Co.length;i++){var%20val=me(o[i]);if(typeof(val)!=%22string%22){val=%22undefined%22;}res.push(val);}return%20%22[%22+res.join(%22,%5cn%22)+%22]%22;}if(_21==%22undefined%22){throw%20new%20TypeError(%22error%22);}res=[];for(var%20k%20in%20o){if(typeof(o[k])!=%22function%22){var%20_27;if(typeof(k)==%22number%22){_27=%22%5c%22%22+k+%22%5c%22%22;}else{if(typeof(k)==%22string%22){_27=rs(k);}else{continue;}}val=me(o[k]);if(typeof(val)!=%22string%22){continue;}res.push(_27+%22:%22+%22%20%22+val);}}return%20%22{%22+res.join(%22,%5cn%22)+%22}%22;};closeBookmarklet=function(){var%20_28;_28=document.getElementById(%22clipperz_bookmarklet%22);_28.parentNode.removeChild(_28);};lfp=function(_29,_2a){var%20_2b;var%20_2c;var%20_2d;var%20_2e;var%20_2f;var%20_30;var%20_31;var%20_32;_2c=%22http%3a%2f%2fwww.clipperz.com%2f%22;_2d=_2c+%22help%2fbookmarklet%22;_2e=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAXCAYAAABOMABkAAAACXBIWXMAAAsTAAALEwEAmpwYAAANJ2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjardd5NJRv2AfwaxbGMmbGGHsY2Xcle%2fYtkWzZUpKdYSYmScqSlDVLKNoo2oQWEonqR5YkyZKtyJKlFLJkmfcPqd7feZfznvNefzzneu7nj%2ft+7nM+3%2fvcAHgNdxqNggSAwCB6sK2ZIdnJ2YWM6QQM4IAXsCDi7hFCM7C2toT%2fuhAA852AAABoV3Cn0SjwfytcsJOzCwBCHgBIPuu9PgCQDq739gBAOkKn0QEQvgBA8vB19wRARACAfLC9rREA4iYA4HzW+woAwB1c7xsAABfq4UMHQHQDMBODPP2CADBTAMy6nl4hHgA4eQDw9AzxCATApQKAVWAg1RMA9xEApD1owXQAPAsAKDg5u5DXl7w3AWAbPwCLxZ+xI5kAZXkA0rv+jIk9AuBxB8hP%2fjM2awsIAEDwtIZ4q2xd30GsIQDTAIMxKwmASQdYTWMwlvMZjNVrAKg+gFqKx+Hg0I39RrQA%2fG%2fv6%2f%2f8q1AIACQAQhxRiAxHRaAjmE4wR2FiWE6yGrPWsZ1mP4ON50jClRN8OdOIaVzppHPcmTyZvNl8dQJUwdxNuUKXhBvIh0XzN18Ta5U4Jlko1SZzQvaOXKdCjOJdpZ4tp7feV%2fmgmqRWrj6omaJVqT2qk6H7VG%2fCIMvwudFXkxzTerMZ8ys7myzmd+Vbvd79xvqNTZvtiv3tPR0OnY5dTt0u6L33XPv29e8fcPtw4ONBrMdjz2GvEe9RnzHfz37jAdyUZ4Ffgr5Sp2nfDn0PngmZo88d%2fhE6f2QhbPHoUvjPYysRK8dXI2WiOmIQJ5GxqFPoOKbTzGcw8SwJrIlsSezJ2BSOs7hUfBohnTODeI4rk5TFnc1znvcCXw5%2frsBFwUubLgtdEb4qkkfOF722+bpYgXihxA2pm1K3pG%2fL3JG9M1lEuStfrFCiVKp8b8v9LQ+2PtxWplquVj7%2fKLRC%2fbFGpVaV9pPt1duf6jxdq4ms1Xum%2f9zgheE%2fRnXouth6k5emDWaN5k3mzWzNia8sWixfW7XiWs++sW6zeWvbTmxPf2fXYd+5p4unK7vb8b1Tj0uvQG9un2u%2f68C+D8Ifrnx0GzwwJDqU%2f+ngsMeI56jEaOGY92efcd8JmYnbk%2f5TAV8oXxW+Fk8HfaN+p81smbk%2fGzwX8oM+rzpfvhC6GLZ09OfRZa3lqpVjqxFrOmtPGQwAhBgSh%2fyGakbfYcpgjsD4sNizGrFtY5fCSnHw4XjxfAQ+Tm6iJJc0SYPbkmc%2fbwhfCn+JQLPguBCXsJqID%2fm86EsxhLiOxCHJe1LTMtKyFLkqBZSigVKa8uBWGZW4bV1qsuo0jTotXu2w7a90efSo+s8NxY2OGbeZCpuF7ag2X7LYYum1K9OqzRpnY2YbZldg%2f86BzVHf6ZDzJZf6vdP7RPbvdgs%2fkO9ed3Dck9tLz9vJ54TvVb9a%2f%2f6ApUCuIDmqMc33UERwakg+vexwQ2jvkYmw+XDUMc4I8nH5E6qR+lEW0btj9p48EOt1ihJHPx18Jio+KuFkYnxSenJiSs7ZC6nZaWnpFzPSz2Vlns+6mX3jfPGFmzl3cksuPrn05HLdlVdX2%2fLa89uvtV%2fvLRguHLsxdHPk1vTt73emi77enSmeLpksnbo3dn%2fwwdDDnrK28sZHtRWPHpdUXqxKfxJVHfh0b41F7fZnss+Jz5defPynqe5hfcbL4Aa7RrUmwSZGc8+rhy0Jr11axVpH3zxoO%2f7WpB3X3v%2fuaod%2fp0rnaldLd8b7fT0yPbO9lX0x%2fRYDpIGBD7c+hgxqD6GHmj6dG94%2fIjUyNVo5Fv155zj3eP%2fE9UnKlOrU2pfGr+nTe7+Jf5v6%2fmAmYtZsjjjX%2faNgnrqguYhafLmU9nPvstjyl5Xy1ag1cwYPgwEAJxFhyHCUNqoSfZxJj6mGORpzisWUpY41ju00ewJ2J7aZIxmXjE8h7Ca0cqYS07kySBnc9tzveLJ4s%2fjO8+cI5Armbroo5CrUL3xF5Co5TzRvc57YNfHrEgWShVI3pG%2fK3JL1k52Quy1fpHBXsVipRLl0y72t91UebHuoWq5Wrl6uEaaxqFmpValdtf2JTrXuCd01vRr9WoNnhs+NXhjHmqBN6kzrzV7uaDBv3NlkkWiJtXy1q8Xq9e5W61Qbgk2b7Vu7dvt3ezodshx5HLucup3fu%2fTszXUVdO3b17%2f%2fg9vHAx%2fd8w6KHhzy+OQ57DXiXegjuZ4g%2fhMBdyjylKn%2flCKzv1Ok4qjG0aXwn8eWI1aOr55Yi2REQwzyd5JgzmDiWeIbE3Ymsidhk7EpHGfxqYQ0zt9ZwpPNe57vV5Zs+jtL8oeueVwXKxAvlLwhuZEmRfJ3FYoV%2f8oSlbJt5aqP1CvUH2tUalZpP9Gu3v5Ut0b3rxwxqTd9adpg1rijybzZ4lXo682tVm+s26zf2rQf75DtdOhy7I7pUep16YsbUPkQP6g6lDTsOao9ljbuN+n%2fhTJN%2fZ4w5zJ%2fdilx1ZbBAFg%2f+wAAmNUAsuQAHHIA7PIB4uQApNwAeG4CWHMA2GsCkkkYkDo0QOzU2Tg%2fAAEEEAJFMARnCIFUKIVFBBlhgQhD3ES8Rowh8UgzZDSyGrmC0kFFo+pRK2hRtDO6EP2DyZTpFFMJ0zSzGXMe8yiGG+OKqWbBsGiyxLJMsmqxUllr2RTYotgq2HHs0ezvsSRsEPYzhwnHSY5BnDvuOR6F98ZPEWwIWYRVznjOGaIWsYBLnauAa5rkRlrg9uMu55HjecnrzYfhu80vwX+Ef07gkqCZ4Oymq0LiQhHCCOEyEX+yKLlH9NzmzZujxPBireJpEnskBSSHpO5IG0nfkjGU5ZQdlHsgf1rBVVFFCas0pvzPlvytMSqe28xU5dW41FbURzWyNXGatVql2nnbz+mc0Y3UO6J%2fyIBi6Gfka+xrEmAaZEbfccw8dudZi1zLW7sqrBp391l%2ft8XYCdtr7LFzoDmmOBU7v3GZdeXbp7vf2y31QJX7Zw9eTzOvo95Ffnz+1gEJlLogJNWAFn3oRQgz3eJwepj4UWr4kwi24y4niiIZ0faxyFOucY%2fOcMUfSmhLzkxZSnVLq89QOpeTHXL+U45dbt3l4qsSeZeu8RYSbqTcwt0+eze7RKj0+n2FMuPytgr3x9+reZ8W1Rq+oNfh64sadjYntCi8bnsT2l7fQesS7G7ok+zv%2fpAwqDdcNOr5WWS854vDNM+3rpmcObeFqaWy5UgGH4MBAEhgA16QAT1wgsOQCRUwgMAglBFuiBREDWIWKYt0Q+Yg36HwqF2oJFQLmgO9G52J7mUiM%2fkxlTItMhsxn2V+j5HAHMa8YCGyeLJUsLKzurIWs6HZ9rM9ZGdj92CvwXJjadgWDlmOZI4pnCWuBM+Bp+I7CfqE65w4zlDOXqIp8R4XmSuda40UQvrC7c89wUPhmeGl887zhfMj+JMEBARuC2oK1m9y2DQuFCXML1wuYiMyQY4TlRRt2Bwkxiv2VNxDAivxTDJISkTqrXS8jKHMqmyVXIS8jvyCQo3iGSV7ZVHl6S01W9NU%2fLcZqwqrLqt1qD%2fWuKQZreWj7bhdR0dJV1SPqI82QBnMGH43mjaeNBk1nTWb3PFjJ9KCZMm7a4uV7u7d1rY2AbZH7XLt7+955dDruOJMclHaa+V6aN+F%2fXVuY+6sB5U9fD1zvGq8v%2fnK+Hn5Zwd0BAoG7aHm0j4HS4eE0htDhY6EhDWFix1LiZg44RzZEK0WUxBLPJVymngmK4EvMTdZNeV1qlfaz4zkTPWskfOXc%2fwv7rksc5Upb+ra84KyGxduxd3xuOtaYnpP48G2MsVHCo+lqySqpWuUn+m92FFn85LSeKg5reVq65O2gXZGp0i3To9nX+JA5cepT%2fwjhmNR4zcnh78KfPOeuTw3uiC9FLRcvoZgMACAGQggBIbgDKlQCm837G+4X1ePxqOd0T+YTJlyfnlfw7iyiLDEskyy2rPWsimwXWTHsUezL2CDsJ85PHHuuE94b%2fwUIYSwyhlP5CEWcKlzNZHcSAvcqb9NW%2fHP%2ffJsLYwQLvtl2WZd8i%2fHoTKGfxv+I%2fiX37eatVqlf+z+kfvfu%2f2f1PoM+vH5W%2f9bbWjPv93G3P5bbtLWP3KzmDfsXtLc0Hs9Y8NvEXFD8IOKDcNVJ9cVP+vZcNw43pzw6p+WrNdtb0LfCrXXd9A6S7viuht6Qvsk+wMGjD8kDOoNnf50cLhoZH60%2fbPIeMCE+aT0FOaLw9fC6bhvPt93zMjOss9+nXvz48F81oL9wtRi7JLhT6mfo8uRK3wrl1c5V2NXF9auMxIZDID1+xIAALAZUSnUYLKlkTH8%2f1Yg5fDGHEgAwHoF7bEDACIASPvRze0BgAQAWmAEVKAAFYKBDJZgBMa%2fnmTw+P3FD2D9LgcAwEwAuOgIAFCzeCzq3%2fPSvcLoAABGVNrRYD8fXzrZgEajeJGNqIG0w3SvYHmyeZCHojx5q7KyKgDAfwBYjP%2fgNJJdnQAAAARnQU1BAADY6%2fUcFKoAAAAgY0hSTQAAbZgAAHOOAADeVAAAgmQAAHjTAADDvAAAMucAABx04zkiNwAACnFJREFUeNrsnHts1FUWxz+%2f32%2fenemL0sLQ0kIfUh5ioQiCQGtFRNmCWElFWFwDEohgQNmwJVAx+pcEWERJLFZFDQ93eSgiAtsl8iyV1LYLpaWtpVBK2Q6lj5npvH6zf7QMjFOUxXUTy++bTGZy55x7z9w53zn3nHMzgtfr9aJAgYJuofo1yuXldaxZ8zEej0zv3qGsXbsQg0HL9u0F7NjxTwDS01NYsmSGstMK7j+CtLfbKSmpRpZloqN74%2fHIANTXN3Hy5FkkSSQmJkrZZQX3J0FEUUCrVSPLXtTqW1PFxvYhLe0hRFEiObm%2fsssK7k+C3AlZWRPIypqg7K6CnkmQ8vI6jhz5gZqaBjwemX79evHww4MYM2YIarX0i5NWV1+hqqoeALM5gmHDBgBQUlJNWVkNXi+MHp1MbGwUu3cfpbi4GpfLTXx8X6ZMGc3AgX395jt1qpyqqssApKWlEBxsYM+eo5SV1QKQmNiPp54aQ3R0RLf2uFweTp06y4kTZ6mvtxAcbGDo0DgefzyViIhgP9mqqnqf7QMHmklKiubs2Vr27j1Oc3M7K%2f+STWhHIdhugCB2vwFeGdRGiJkEolrxsp5CEJfLw7p1O9m27R+0t9vxeGQ8HhmNRkV+%2fn5GjnyAN998ibi47vMKQeh8%2fvLL46xduwNJkpg+fTwbN74CwOHDZ1i%2f%2fgtEUWT+%2fKnU1l7l0KHvAdBoVEiSyNat37J8eTZZWRN98+7efYzPPz+IWq1iyZIZFBaWc+LE2QC93Ny5TJqU6mdTXd01cnM%2f5tSpszidLlwuD5IkIkkieXn7eOONFxk%2f%2fkGf%2fJ49x9iw4W8AvPbaTMrLzeTmfkR7ux2tXseSRZMJPf4qNJyH238rhK4HgAcINcPsMtCGK17WUwjyzjvbyc%2ffT1CQjtBQI6mpgzAYdBQXV2CxtFFYeI6lSzexdWsOJpP+jpNqNGqCgw2AgF6vvW1chcmkJyhIz969x7Ba7aSlPURUVDjl5bVcvHiVjg4na9Z8TEREKGlpwwHQ6dSYTAaMRh2ffnoQh8PFpEmphIQYKSur5upVC62tNlas+ICIiFBSUhIAaGpqZdGi9Vy4cBmNRsWgQfEkJfWnoaGJ0tJqrl69ztKl7%2fHhh39m+PB4n+0mkx6tVsOZMxfYvr2gkxxaNSqpixHGEDAZQKXrSsYk8AKO64AIHhdIkuJdPYkgJSXV7NhRgNGoRxQF3n57HpMnjwKgtraR+fPfoa6ukaKi8+za9R1z507+VQvb7U4WL36WRYumAWCzOVi27H2OHy9Flr1s2fK1jyA3Icte3G6ZlSvnMGtWBgDXr7fxyisbKSurwmZz8dFHB0hJ6YxYmzfv9ZFjxoyJrF79RySp81i0adNuNm%2fei9XawaZNe8jLe81vLbVaorS0Go1GxUsvPcUjjwxGlr2E946EJ%2feBx9EZMgSh8xh1+EX48evOqOIGBk5TokcPgO8QfeDAaTo6nLhcbjIyUn3kAIiLi2LhwmlkZIwkM3OcX8XqXuB0uhk8OJZ58572jRkMWl599VkMBh1qtYqKiotUV1%2f5iZ6LUaMG+cgBEB5uYvHiZxBFEa1Www8%2fVHL9ehs2m4MjR4rRaFSEhZlYsOAPPnIAzJ07mZiYSFQqkeLiSl%2fecTsZvV6ZnJzZ5OS8QHp6ChkZIwgyGkAXAUH9IMgMhr5QtrmLHBI4PDDoGZiwQfGunhRBzp+%2fhEolIcteRo16IEBwxozxzJgx%2fn+yqMvlZtiwAWg0%2fkRLSOiH2RxBVdVlXC43dXWNxMebfe+73R5GjEgMmG%2fw4FgiI8O4dq2ZlhYrjY3NSJKAxdKKWq3C7fbw1lufBujZbB1IkoTV2kFFxSUSEvr55WOxsX2YMuXhn%2f8wJX+FE6tBJYLTA3ETYdJW%2fBMUBb9rgng8MnZ7B6IoIIoCvXoF%2f8bLejGZDAGjarVEUJDeR4bWVluATHBwUMBYUJAOrVbti052uwNBEHA4XBiNOhwOFwcPFvHTWzU6nRZRhI4OJ42NzX7veTweoqMj%2fXKoAFTthGPLOsnhliFqKEzeBiqj4lk9iSCSJKLRqJFlkGUZi6U1QLClxUp9fVNnjmrU079%2f5K9YVuDGDWu35Vir1d5pmErCYAh0zhs32gLGrNYOHA5XF8lUaLVq37PT6SYiIoS1axd2fUbZp6fValCpJJxON9HRvbstNtwRlwvg8J%2fg5nwhMTDli84jl4Ked8RKSDBTWHgOlUqiqKiCmTPT%2fATz8%2ffzwQf7AC+zZk1i1ao597yoWq2itLQam83hR4Iff2zgypUmJElCq5WIje3jb2yXbV6vF+FmTRmoqLiExdKCIAiYTHqiosLR6dT06hXMtWvN2O0OBgwwB5Sna2oasFhakSQxoB%2fys7CUwLfZ4LJ1lnZ14fD0bggdpHhUT03Sp04di0ajQq1WUVBwhq++OukTKiqqYPfuo77k%2fPa+wb1Ao1FRWXmJd9%2fdhdvt8VWj1q37AputA5fLTVJSf5KSov30tFoNxcWV5OV97Ru7csXChg1%2fx+Vy43A4efDBeCIigjEa9UycOByn001bm42NG3fR1mb36R05UsLs2W8xc+Yb5OTkIct3eanZWg%2f7n4P2f3cm5YIIo9+EsEFgvXLbox7cVsXDekoEGTEikdmznyAvbx8Gg47c3Hy2bStApRKpqKjDbndis3WQmfloQPn1XmA06snP38%2fRo6VERYVTW9vAtWvNiKIIyLz88tRu9QwGHevX7+SbbwoJDw%2fmwoVLNDe3IQgiBoOa+fNv6S1YkElhYTlVVfUcOnSasrJq+vePwmq1U1l5CbvdiU6nYdmy57o9znV%2ftPoOLBdAowZkECT4%2fm0oXP2TUl0bpL0Pg+cpXtYTCAKwfHk2JpOBzz47iMXSysmT%2f+JmjmI06snOzmDFiudvS2RlX8fdZgvyJcFOp4vWVhuSJGG3OwIWdTicTJ06DoNByyefHKC0tMbXEe%2fVK5jXX8%2fuloQOh5Pnn3+clhYbO3cW4PHI6PUaAMzmXqxcOcfXJASIigrjvfeWsmbNJ5w+fY6amltXYDQaFVFRYSxZ8ixTpoy+5ddOF21tdkRR9OVD%2fumTt7NT7nTd3AXoaAiUcwIuJYL0KIKIosCiRdPIzBzHsWOlXLzYCECfPuGkpj7AkCFxfsqJidFs3ry0qyKk8VV8MjPHkZwciyAImM2B96Pcbhm9Xs2qVXPIyBhBYeE57HYnMTGRpKen3PFOldvtISQkiJycF3jyyVTOnKnE6XQzcGBfHntsBJGRoQE6cXFRbNnyOkVFFZSWVtPU1IJGoyIxMZqxY4fSu3eIn%2fz06Y8ydOgABEEgMjIs0AjzeJi24873sHy%2fHk7oM1rxsJ5EkJuIjo4gO%2fuxX1QOCzMG3H0CiI83+%2fUvuvUfT2e0GTt2CGPHDrlrg29WodLTU0hPT7krHUkSGTMmmTFjkn9RNiGhn18%2fJPBsGAMJMYrn3G9JugIFCu4ygvxWcDrdWK0O3+v%2fTq%2fjv9ZToOB3RZAnnhhFTEwkoigwYMDdN9SysiYwcmQisuwlOTlW+dYU%2fN8gKP9qokDBnfGfAQA9nOAwz2UemwAAAABJRU5ErkJgggo=%22;_2f=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAGlCAYAAABAwstlAAANMWlDQ1BJQ0MgUHJvZmlsZQAAeJyV13k0lG0fB%2fDfLIxlzDDGHkb2XWQPWSJL9mwpMXbDTAyplCUpRJZQtKBoU5RIJKqHLAnJklBUZCmFSJZ5%2f5Dqfc553ue81x%2f3+d2%2f+9znuu77nM%2f3OhcAXsuTRqMgASA4hB5qb2ZEcnF1I2F6AAM44AMsiHqSw2iGtrZW8I9jvgcQAABdip40GiUc3ZFJftCtapBvLz7n36D0z+8BAAAu1MXVDQChAABEv7V6KwAQvdZqRwAg7qfT6AAIfwAgkv09vQEQUQCgEOpobwyAuAoAOL+1ugoAcF5rdRMA4CLIfnQARB8AMyHEOyAEADMFwKzv7RNGBsApAIC3dxg5GACXBgDWwcFUbwDcWwCQIdNC6QB4FgBQdHF1I60teVcSwGYBABbL3739WQAVBQAyO373xO8B8HoCFKb87s3aAwIAELztYb5qqgAAgMAaATANMRizUgCYDICVdAZjqZDBWLkEgBoAqKeQw0Mjfv4vBKIN4N%2fu177550AhAJAACAlEMfIgKgodxXSEOQYTx3KU1YS1ge04+wlsIsdJXCWnP1c6IZ07g3iaJ4s3iy+Hv0GQKpS3IU%2f4vEgTKVyscOMl8XbJQ1LF0p2yR+RuyPcoxindVO7fdFz1jtob9ZMalZrD2qk61bqjepn6Dw0mDLONHht%2f3pZr2mg2Y37RosVyfkeh9XObDtsOu077ZcfrO7udepx7Xfrc0Ltuuw%2fsHtwz5PFm71svLPm+93ufD76jfmP+HwPGg3goj4I%2fhXymTtO+7PsaOhM2R58L%2fxYxv38h8vuBxYM%2fDi1HLR9eiZaN6Y5DHEXGo46hE5iOM5%2fAJLIksSaznWRPwaZynMKl4dM5M7gyCae5s4jZPDm8Z%2fjO8ucK5AmeEzq%2f4YLwRZF80QJSodiljZfFiySKJa9IX5W+JnNd9obcjckSyk2FW4qlymUqtzfd2VSuendzhXqlRuX8vYgqzfta1To1ug+21G55qPdwtS663uDR1seGT4z+Mm5AN8Q3bntq2mTWbN5i3srWmvzMss3quXU7rv1Uh22n3Qv7LkJXxkuHbseenb28vTl9zq9c+t1eC77OG3AfdB%2fa%2fUbkzcW3HsN7R8RGCt95vSd%2f8B6VHC0e8%2f3oN+4%2fITtxfTJwKugT5bPi51vTIV+oX2kzm2buzIbOhX2jz6vPVy5EfI9cPPDjwJLOUs3yoZWoVb3VhwwGAEIciUN+QbWibzBlMkdh%2fFgcWY3ZNrNLY6U5+HF8eH5Ofi4eghS3DFGLx4p3D18Yf6pAqWCr0Lgwt4iGqB%2fpjNhTcYSEnuQ+qdvS07IychT5GkWUkqFyusqwqqxawuZeDTlNmlaDDp9u5JZn+rwG1K2PjSSMD5l0moqYRW6vNV+03GTlsyPLutMWZ2dmH+lQ5PjSic15q8s+1%2fNujbumd4vusfE4uLfQs8Fr3JvHx8DXxe+If35AfeBg0GIwd4g81YTmvy8qNC2skF4R3hTxev9E5PxB1CGuKNJhhSPq0VtjLGNt4nYd3Rvvc4ySQD8eeiImMSbpaHLiyYyU5NTcU2fTctLTM85lZpzOzjqTfTXnyplbZ6%2fm3sgrPffg%2fIMLDRef5XcWdBV2Xeq6%2fLroffHYlZGrH65NX%2f96Y7rk882ZW9Olk2VTt8fuDJeP3O2v6Kxsvldfde9+afW5mowHMbXBD3fVWdZveST3mPB48cnbv1oa7jZmPg1tcmjWaBFqYbT2P7vblvTcrV28fbSjvPPwi21duK7Bl%2fndgT1qPSu9bX2Zr3b3y%2fbPvq4eiBu0HCIODb259jZsWHcEPdLy7vT7PR+kP0yNVo%2fFfrQY5xkfnLg8SZlSn1r91Pw5Y3rXF4kvU1%2fLZ6JmzeYIc33fiuapC9rfUd+fLqb%2f2LUkvvRpuXIlZtWcwctgAMBRRCTyIEoXVY0+zGTAVMcciznGYsrSwJrAdpw9CWuBbeVIwaXgUzltONu50ggZ3JnETB5Hnpe82XzZ%2fGcEcgXzhPI2nBN2Fx4UuSiaTyoQK9hYIH5J4rJkkVSx9BWZq7LX5ALkJuSvK5Qo3lS6pVyqUrbptuodtfLNd9UrNSo1K7Uitb5rV+tU69ZseaBXq39Ef9Wgbmu94SOjx8ZPTOK3obc1mDaaPd3eZN5s0WKZbIW1erajzfq5Tbttmh2nXaf9C4cux5c7e5yynXmde136XF+59e%2fKcxdyH9g9uOeNx9u9bz0LvMS8RsjvvN%2f7fPAt9pNaS5DAiaAbFAXK1H+lyOyvFKk6oHVg8eCPQ0tRy4dXjqxGM2IhDvkrSTAnMIksic1JFsnsJ7Ep2FSOU%2fg0znSuX1nCm8N3hv9nlmz4M0sKRy6RL4sXSRRLXZFaT5MShZuKt5T+yBK1is2V6vc0qzTva1Vr1+g+0K3d8lC%2fTv+PHNnWaPrUtMmseXuLeavls4jnG9utO2w7bV%2fYdR3ulutx6nXui+tXfu02kDCk9iZxWH3k5HvvUd2x9PGAycBPlGnq16Q5t%2flTi8kr9gwGwNreBwDArAGQLQ%2fglAvgUAiQIA8g7QHAexXAlgPAURuQTCKA1KMBwkJvff8ABHCCMCiBEbhCGKRBGXxHkBCWiEjEVcRzxBgSjzRDxiJrkcsoPVQsqhG1jBZDu6KL0d+YTJmOMZUyTTObMRcwj2J4MO6YWhYMizZLPMskqw4rlbWeTZEthq2KHccey%2f4KS8SGYD9ybOM4yjGM88Q9xqPwvvgpTjvObM4VrkSuGYIOoYhbk7uIe5roQVzgCeCp5JXnfcrny4%2fhvy4gKbBfYE7wvJCZ0OyGfGEJ4SgRhEiFaCBJjNQvdnrjxo0x4njxdol0yZ1SglIj0jdkjGWuyRrJcckNy5crHFd0V1JTxiqPqfy1qVA1Ts17s5m6gga3xrLmqFaONk67XqdMt2DLab0T+tEG+7fuM6QYBRj7m%2fhvCzINMaNvP2Qeb3HKMs%2fq2o4q62abAduv9hgHEUetnQ5ONOdUl1uuHW6z7vy79ff4eqTtrfH8SObzNvM54FsSwB9oG5REaQhBUg1psfuehDHTLcMzIiUOUA8+iGI77HakJJoR6xiPPOaecO8Ed+K+pM6UrNTFNI%2f0xkzl07k5YWfe5TrkNVy4lS9ZcP4SXzHnldRruOunbuaUCpddvqNYYVLZWeV5%2f2st38OSeqMn9AZ8Y0mTRWtSm+Lzzo6IrsZuWq9QX9OA1GDfm6Rhg%2fclo94fRcf7PzlN837pncmd81iYWqxYimbwMxgAgAQ24ANZMAAXCIcsqIIhBAahgvBApCLqELNIOaQHMhf5EoVH7UCdRLWhOdA26Cz0ayYSUwBTGdN3ZmPmU8yvMJKYcMwTFgKLN0sVKzurO+stNjTbHra77GzsZPY6LA+Whm3jkONI4ZjCWeFK8Rx4Kr6HcyvnZS4cVwTXa4Ip4TY3iTuDe5UYRvzEE8gzwUvhneGj883zHxRACJwUFBS8LqQt1LjBacO4cIyIgEilqJ3oBClBTEqsaWOIOJ%2f4QwmyJFbykVSItKj0C5lEWSPZFbka+SgFPYUFxTqlE8qOKmIq05vqVNPVAjebqIuoL2l0a97XOq8dq+On67xFT09ZX8yAsBVtiDKcMfpqPG0yuW3UdNZscvs3C6Ql0YpvxyZrfRsbW3u7IPsDDnmOd3Y+c3rtvOxKdFPeZe2+b%2ffZPQ0eY56sXipkf+9cnzrfL%2f6yAT6BOUHdwUIhO6l5tI+hMmER9OYI4f1hkS0HxQ+lRk0ccY1uitWIK4onHEs9TjiRncSfnJeinvo8zSf9R2ZKlmb2hzMXcgPP7bwgm89UMHXpcVHFlbPXEm6Qb7qXmt7WKt9coXRP8b5MjWStTJ3KI4Mn2xvsnlKa97Wmt+W3P+gc6mL0iPbp9XsPJA9Vv516J%2fDBaCxm%2fOrk+8+CX3xnLsyNLsgshixVriIYDABgBk4QBiNwhTQogxfr9tfdr6lH49Gu6G9Mpky5P72vYtxZRFniWSZZHVnr2RTZzrHj2GPZF7Ah2I8c3jhP3Du8L36KM4xzhSuRwEso4tbkbiF6EBd40n6ZthaY++nZVgQhUvHTst2a5J+OI2SN%2fjT8W%2fBPvy+063XKftv9Lfef3f4vtX7DAfyBtn9XG9H%2fd7dx1%2f+Ue1L1t9xs5nW757XX9V7OXPdbQlgXXF61brjm6JriR%2f3rjpvHW5Oe%2fdWW%2fbyzI+KFcFdjN62nrDehr6k%2fYkBqMGjI5E3SsMHI8Xde70s+zI92fRQdD5own5SZwnxy+lw8nfDF7+v2GblZ9tnPcx3fyuezFxwXpr7HLxr9kP4xuhS9zL98YYVrJX5lYfUyI5nBAFg7LwEAAJsxlUINJVkZm%2fzL4e7%2fHcGU8PU5kACA9QnZ6QAABACQCaCbOwIAEQB0wBioQAEqhAIJrMAYTH5eSUD+9SQAYO0sBwDAzAlwzhkAoO77oZi%2fz0v3iaQDABhTaQdCA%2fz86SRDGo3iQzKmBtPC6T6hCiTzELKSAklVRUUdAOA%2f67wHk5DqTvYAAA7ISURBVHic7d1NjNz3Xcfx78w+2Y7tJo5rjEOVh6YoNaWAcqgSIiFURYVWEEJIT9wRF4SK4AZCQoJLIwWJCxcuHCo1TaJIqE3CgyrIg+K2qKVpm0DzUMWpHSdO4ti7ftjdGQ6zf+9%2f%2f95N7Zm1vZ%2fk9ZL+mp3Z2ZnxYd%2f6%2fn7z33EVAAAAAAAAAAAAAABsJb0P2fMCm2d4pZ%2fwSoSj+xy9DW7f6P7A1deN00bXL2vELlccuo%2fbX7mtHavu9cv5eoDJDda5Pqy1sepe31SbHYj247Uj1V%2fnst%2f6md4GjwFsDetFqTkGrWO9729auKY364HqwumpX1VTtRqnqc71dtDWm7aAq2%2fY+bq53o7Ucufr5noTs+7jjG2zgtVEph2n5uuZqpo6cOCOj+39yK2fn5nZ8dler39Tr9ff1+v1rtmk5weukOFwOD8cDo4NB4OfnFta+Pe33n3x8SNHDh2uUagWazVayzVqQzdeY9uMaaY9ITWxml45Zm644c4b9u05+Bcz03NfrOpNbcLzAVvKcHlx8czXjh7%2f%2fpePHDn0eo2itdQ6lmvt0nFskwarvYxrh2q6quYO3vrFz+%2fc+dG%2fr15v54TPA2xxw+Fw%2fuTJo1964aWHH6+qszUKV3O0l41jLw8nmXg2itVMVW3%2f9ME%2f%2fKPt26%2f%2fcq%2fXm5vgOYAQvV5vdnZ21xf2XPfx08feev75zrc3ZQ9rkgmrvQxsQjVTVdtu+%2fh9X9i1a%2f8%2f9nq9NY9%2f8y37655776zP3HFb7d+%2fp3bs0DJIs7Bwto4efbuee%2faFeuzRZ+qVl4+u+f5wWIMTJ177k%2f995bFvVNWZGk1bZ2t1edhMW5ds3GB196xmaxSruX37fu2mGw%2fc+a%2ftDfXp6an60z%2f7%2fbrv%2fruq3++v%2f4hAnMFgUA8%2f9FQ9+MAjtbS0fP724XA4%2f%2fJr3%2fzd48d%2f8GqNonWmqs7V6r7WWPtZ4y4Jm2A1pyrM1Cha2z9x02%2f%2f1fT07K82d5yenqoH%2f+GP6+7P3V6dgQsI1+v16pc+dWN9+lduricf%2f04NBsPm9tkd266%2f9o03v%2feftbpv1d58rxpjmThJsJpTF2aqaq6q5vbu%2feWb9u659e+qeufHqC%2f9+R%2fU3Z+7fcynARLccMPe2r17Rz3z9A%2fP3zY9PfuJhbMnvnHmzPH3au27hGOf4jDO+qx7GkOz2T67b89tv9U+deHmW%2fbXffffNc7rAsLcd%2f9ddfMt+1u39Kb2XX%2fw7qraXqvbRu1zNC95yTXJhlL77PWZqpqdm939G+073HPvnfas4EOi3+%2fXPffeuea27XPX%2fXqNVmCztTrcTNWFf5J3cc8x5mtb7x3CuX5%2f+hfad%2frMHbeN+fBAou7vfH9q5kBVbatRsGZr7YR1ycYNVvtPcM4vCfv9qb3tO+3fv2fMhwcSdX%2fnp3pT19dowmpOe2omrO4nuFyUcfewmssmXNNVNdPr9be37+g8K%2fhw6f7O9%2fpTzXTV7F+NHauqyZaE7T2sZsoC6Gomq+a4Ypvu3Y+D6XcOgK7uR0t1+3HRJt10735CA0BX+93Bsaerqsmmom4lncYOrGe9yeqKB6vqwkkLoGviUDUmnbAAfpaN3hG8ome6t1+ICQvYyHr%2fW9ZVWRIC%2fCybthoTLCDGJKc1AIzrii4Ju2tRAQPez0a9uGJ%2fSwhwsd6vGxfdFHtYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEmCRYw84BsJFN6cU4wRIo4FJ1mzF8n+9taNwJS7CAzXBJLbGHBcTYzGCZuoD1bFobNnXCGg6Wz7SvLyyc3cyHB7a47u%2f8YLB8trZQsAY1ejGDqhouD5beaX%2fz6NG3J3x4IEn3d355sHhi5cvmzbpBTfDG3STBGrReSFXVcHn53BvtOzz37AsTPDyQpvs7v7R05q26MFLdy4u2GUvCwcqxPL9w7L%2fb33js0WdqMBis%2f1PAB8pgMKjHHn1mzW2n5o8+X1XLreOKnofVPflr0D6OvvU%2fh4bD4flCvfLy0Xr4oafGfW1AkIcfeqpeefno+evD4XBw7Pj3v1udTrSOS47XJOdhtZ94qaqWTp16%2fY35hWNPt+%2f44AOP1LcOvTjm0wAJvnXoxXrwgUfW3HZq%2fsi35+ffOFYrfajVKasdrEsyNebr61fV9MrPz6wcs1U1d%2frsu0f2XveLv9nr9aerqgaDYT35+Hdq9+4d9cmDH6terzfmUwJbzWAwqK999b%2fqr%2f%2fyn2tpabl1+%2fLZH7%2f6xD8tLs6%2fXVWnqmqhqs5U1dmqOldVi7Uar4s2TrB6K0d%2f5ZiqUbxmq2rm3LmTg15v+p1dOw%2fc3utVb%2fTih%2fXM0z+s%2f%2fi379bi4nJds3Nbzc3N1szM9BhPD1xNCwtn67XX3qzHv%2f7t+tu%2f+Up9%2fV8O1WCwOiwNh8Ph60cOfeWdd%2f%2fvxaqabx1nVo52sC5pyhpn3OnV6mQ1W1XbqmpnVe2qqo9U1bVVteeWGz%2f7O9dfd9vv9YxU8KExHA6Hbx7%2fwROvvvbNJ6vqnap6d+XyRFW9V6NJ63SNJq1mmXjR0Rp3wqoaTVdNvJpjujneOfHK4RrU8Z07f%2f6TzfIQ+OAaDJbOHf7pcw8fPvLsszVaBp6q1emqvSRcrFGsmr2sizbuHlbV6rKwuZyq1YD1q6p%2fcv6nx989+ZPnt81du3N2dtfPmbbgg2c4HA7eO3n4+R+%2f+sRX3z3x0ks1CtXJ1uXCytGOVROsSzJuQJowNRPVtqrasXLsWjl2ty6v2b597%2f6P7jn4qd07D9w6PbP9uumpuWv6%2femZMZ8fuEoGg6XFpeWz84uLp0+cPHX45Tff%2ftGPTp8+%2fmaNlnpNqN5rHfMrtzVLwXO19rysizZJsLob7ttWjmtqtKe1s1ZitfL19pVjbuX+zbuMzZRW5dMjYCtqn5nenNK0XKNpabFGETpTq0u%2f9nTVLAtP1yhUzZQ11qkN4+4tNS+613rh7eVhr%2fWPa8a%2fsyvHbK0Ga7rzc1XjRxS4fAaty2Y6WqrR736zN7VQq9NU83V7qmqfyjDWeViTboZ3a9trHe1gnavRP+p0rR+s9pQlWLD1dKerQY1+55upqZmymv2qM63Lc7X6juBYoWpMEqzmxW%2f0vabCzT%2fqdI2WjLM1OiWiWU62gyVWsDW1%2fySv2TBvJqxmgmomrTO19iTRJljt0xjGitZmTVhVo9gsdm5vV3i2RtGaqbXTVfPuYjtW9rLg6lvv0xWaCamJTxOi9v5Uc9nEqrnfRB8tUzV5sKounLQWa+3oOFOre1hNrJrztjaarkxacPWtF5b23xA3IWoum32q9qkL7VhNtBys2pxgNdqbcu1gNWNjO1TN0d5sb09VggVbR3sqan7P25vn3T9ubp9n1XSgasJYVW1+GLonk645kbTWn6zaobIUhK2ne1pD1doYtb9u9qgm+hiZjVyOSaZ7TlW%2fLlz6rffOoKkKtrbup4a2V1ODdW6rWrtdNLHLGYn1YtTdrxIqyNKelNofk77esemuVCy6z7NRqMQLtq71%2fvfmsf4H53FttUBstdcD+D9HAQAAAAAAAAAAAAAAIN3%2fA%2fPNWgCA%2fF3MAAAAAElFTkSuQmCCCg==%22;_30=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAIAAAC0D9CtAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGiSURBVHjaYvz%2f%2fz8DiYAFU+jhg5cXLtx9%2f+4LLy+nlpa8hpYsIyMjTj03rj%2fu71l74fxdZEEFRfG8wkBrG224CCPcbfv2XKivWfjr1x+s7snM8U1IcoOwmeA24NEABNOnbN698yyKHqCTIBrcPU2WrKiIjHYEsh2c9BctK0tMcYeomdC37sePXyAW0G0P7r8wM8yBoFs3n%2fwHgwP7L%2f79+xfI+Pnzl6VpHkR27+7zQBGQPcie3rr5JIRh76DHxASS3bHtzN8%2f%2fyCCF87fgbrt%2ffsvcD3Ll+4%2feOASnPvg%2fsuO1hVwLjACoHqA8QAXBfrB1k4HOaDjEl3hXF4+LqgeYMTBRZNS3CFOAtoAEUlIdGNmgQaVlrYcVA8wpoHmQUT377v469fvTRuOR4W1zZi25cf3X6DAAPuHi4vd1l4XEadHj1wtypsB0QY0Fe5pZHZOvn9svAsifoBJAxjTEDZcETLbw8s0Js4ZPe0AATCmgRH35vUn5BQAdFJSqgdQAzylMqLlBWBMHztyDRgPoHTNxwX0NNAP%2fPzcyGoYycg%2fAAEGABYVzxqE3YcJAAAAAElFTkSuQmCCCg==%22;_2b=document.createElement(%22div%22);_2b.setAttribute(%22id%22,%22clipperz_bookmarklet%22);_32=%22%22;_32+=%22%3Cstyle%3Ediv#ClipperzBackgroundDIV{width:290px;height:420px;padding:20px%200px%200px%2020px;margin:0px;border:0px;background-color:transparent;background-repeat:no-repeat;position:absolute;z-index:20000;top:40px;left:40px;background-image:url(%22+_2f+%22)}%3C%2fstyle%3E%22;_32+=%22%3Cdiv%20style=%5c%22border:0px;margin:0px;padding:0px;padding-left:10px;%5c%22%3E%22+%22%3Cimg%20style=%5c%22padding-top:5px;%5c%22%20src=%5c%22%22+_2e+%22%5c%22%3E%22+%22%3Ca%20href=%5c%22javascript:closeBookmarklet();%5c%22%3E%22+%22%3Cimg%20style=%5c%22padding-left:28px;padding-bottom:10px;%5c%22%20border=0%20src=%5c%22%22+_30+%22%5c%22%3E%22+%22%3C%2fa%3E%22+%22%3C%2fdiv%3E%22;if((_29!=null)&&(_2a==null)){_32+=%22%3Cdiv%20style=%5c%22width:255px;border-top:1px%20dotted%20%23336;%5c%22%3E%22+%22%3Cdiv%20style=%5c%22line-height:10pt;margin-right:10px;margin-top:5px;padding:5px%2010px;color:%23666;text-align:left;font-family:sans-serif;%5c%22%3E%22+%22%3Cp%20style=%5c%22margin:0px;font-weight:bold;font-size:10pt;font-family:sans-serif;%5c%22%3EHow%20to%20add%20a%20new%20card%20or%20a%20direct%20login%20to%20an%20existing%20card%20for%20this%20website:%3C%2fp%3E%22+%22%3Col%20style=%5c%22padding:0px%200px%200px%2020px;font-size:9pt;font-family:sans-serif;%5c%22%3E%22+%22%3Cli%3ECopy%20the%20content%20of%20the%20text%20area%20below(Ctrl-C)%3C%2fli%3E%22+%22%3Cli%3EGo%20to%20your%20Clipperz%20account%3C%2fli%3E%22+%22%3Cli%3EClick%20%5c%22Add%20new%20card%5c%22%20or%20select%20the%20related%20card%3C%2fli%3E%22+%22%3Cli%3EPaste%20the%20direct%20login%20configuration(Ctrl-V)%3C%2fli%3E%22+%22%3Cli%3EComplete%20and%20review%20the%20details,then%20click%20%5c%22Save%5c%22%3C%2fli%3E%22+%22%3C%2fol%3E%22+%22%3C%2fdiv%3E%22+%22%3C%2fdiv%3E%22;_32+=%22%3Ctextarea%20id=%5c%22bookmarklet_textarea%5c%22%20style=%5c%22border:2px%20solid%20%23333366;font-family:sans-serif;font-size:8pt;color:%23336;width:240px;height:135px;padding:4px;background-color:white;margin:0px%2010px;%5c%22%3E%22+sj(_29)+%22%3C%2ftextarea%3E%22;}else{if((_29==null)&&(_2a==null)){_32+=%22%3Cdiv%3ENo%20login%20form%20has%20been%20found%20on%20the%20page%3C%2fdiv%3E%3Cdiv%3EGet%20some%20help%20%3Ca%20href=%5c%22%23%5c%22%3Ehere%3C%2fa%3E%3C%2fdiv%3E%22;}else{_32+=%22%3Cdiv%3EAn%20error%20happened%20while%20processing%20the%20page%3C%2fdiv%3E%3Cdiv%3EGet%20some%20help%20%3Ca%20href=%5c%22%23%5c%22%3Ehere%3C%2fa%3E%3C%2fdiv%3E%3Cdiv%3E%22+_2a.name+%22%20-%20%22+_2a.message+%22%3C%2fdiv%3E%22;}}_2b.innerHTML=%22%3Cdiv%20id=%5c%22ClipperzBackgroundDIV%5c%22%3E%22+_32+%22%3C%2fdiv%3E%22;document.body.appendChild(_2b);if((_29!=null)&&(_2a==null)){_31=document.getElementById(%22bookmarklet_textarea%22);_31.focus();_31.select();}};getLoginFormConfiguration=function(){var%20_33;try{_33={};_33.page=pp();_33.form=fp(flf(document,0));_33.version=%220.2.3%22;lfp(_33,_cble);}catch(e){lfp(_33,e);}};getLoginFormConfiguration();', 'CrossWindowsBookmarklet_TEST');
58 console.log("runBookmarkletScript");
59};
60
61init = function () {
62 MochiKit.Signal.connect('newWindow', 'onclick', newWindow);
63 MochiKit.Signal.connect('runBookmarkletScript', 'onclick', runBookmarkletScript);
64};
65
66MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html
new file mode 100644
index 0000000..10e2f2e
--- a/dev/null
+++ b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html
@@ -0,0 +1,73 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Cross Window Bookmarklet execution - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49
50 <script type='text/javascript' src='./CrossWindowsBookmarklet_test.js'></script>
51<script>
52 Clipperz_IEisBroken = false;
53</script>
54
55<!--[if IE]><script>
56Clipperz_IEisBroken = true;
57</script><![endif]-->
58
59 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
60 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
61 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
62
63</head>
64<body>
65
66<div id="tableWrapper"></div>
67
68<ul>
69 <li><a href="#" id="newWindow">open window</a></li>
70 <li><a href="#" id="runBookmarkletScript">run bookmarklet script</a></li>
71</ul>
72</body>
73</html>
diff --git a/frontend/gamma/tests/tests/index.html b/frontend/gamma/tests/tests/index.html
new file mode 100644
index 0000000..75b8e95
--- a/dev/null
+++ b/frontend/gamma/tests/tests/index.html
@@ -0,0 +1,48 @@
1<!--
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27-->
28
29<html>
30<head>
31 <title>Complete TEST suite</title>
32 <script type="text/javascript" src="../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../SimpleTest/TestRunner.js"></script>
34</head>
35<body>
36<script>
37TestRunner.runTests(
38 'Clipperz/index.html',
39 'Clipperz/Crypto/index.html',
40 'Clipperz/PM/index.html',
41 'Clipperz/PM/DataModel/index.html',
42 'Clipperz/PM/UI/index.html',
43 'Clipperz/PM/UI/Web/index.html',
44 'Clipperz/PM/UI/Web/Controllers/index.html'
45);
46</script>
47</body>
48</html> \ No newline at end of file