kosmos 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +15 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +21 -0
  6. data/Rakefile +2 -0
  7. data/bin/kosmos +93 -0
  8. data/kosmos.gemspec +24 -0
  9. data/lib/kosmos.rb +54 -0
  10. data/lib/kosmos/download_url.rb +76 -0
  11. data/lib/kosmos/git_adapter.rb +61 -0
  12. data/lib/kosmos/package.rb +119 -0
  13. data/lib/kosmos/package_dsl.rb +10 -0
  14. data/lib/kosmos/packages/active_texture_management.rb +20 -0
  15. data/lib/kosmos/packages/astronomers_visual_pack.rb +54 -0
  16. data/lib/kosmos/packages/b9_aerospace_pack.rb +22 -0
  17. data/lib/kosmos/packages/better_atmospheres.rb +41 -0
  18. data/lib/kosmos/packages/cacteye.rb +10 -0
  19. data/lib/kosmos/packages/deadly_reentry.rb +9 -0
  20. data/lib/kosmos/packages/distant_object_enhancement.rb +8 -0
  21. data/lib/kosmos/packages/docking_port_alignment_indicator.rb +8 -0
  22. data/lib/kosmos/packages/enhanced_navball.rb +8 -0
  23. data/lib/kosmos/packages/environmental_visual_enhancements.rb +22 -0
  24. data/lib/kosmos/packages/ferram_aerospace_research.rb +11 -0
  25. data/lib/kosmos/packages/firespitter.rb +8 -0
  26. data/lib/kosmos/packages/hot_rockets.rb +11 -0
  27. data/lib/kosmos/packages/infernal_robotics.rb +8 -0
  28. data/lib/kosmos/packages/kerbal_alarm_clock.rb +8 -0
  29. data/lib/kosmos/packages/kerbal_attachment_system.rb +9 -0
  30. data/lib/kosmos/packages/kerbal_engineer_redux.rb +8 -0
  31. data/lib/kosmos/packages/kerbal_joint_reinforcement.rb +8 -0
  32. data/lib/kosmos/packages/kethane_pack.rb +9 -0
  33. data/lib/kosmos/packages/ksp_interstellar.rb +10 -0
  34. data/lib/kosmos/packages/kw_rocketry.rb +8 -0
  35. data/lib/kosmos/packages/mechjeb.rb +8 -0
  36. data/lib/kosmos/packages/mk2_cockpit_interior.rb +8 -0
  37. data/lib/kosmos/packages/nova_punch.rb +10 -0
  38. data/lib/kosmos/packages/procedural_fairings.rb +8 -0
  39. data/lib/kosmos/packages/real_chute.rb +9 -0
  40. data/lib/kosmos/packages/remote_tech.rb +18 -0
  41. data/lib/kosmos/packages/safe_chute.rb +8 -0
  42. data/lib/kosmos/packages/scansat.rb +8 -0
  43. data/lib/kosmos/packages/spaceplane_plus.rb +9 -0
  44. data/lib/kosmos/packages/tac_fuel_balancer.rb +8 -0
  45. data/lib/kosmos/packages/tac_life_support.rb +9 -0
  46. data/lib/kosmos/packages/toolbar.rb +9 -0
  47. data/lib/kosmos/packages/vanguard_technologies.rb +18 -0
  48. data/lib/kosmos/page_fetcher.js +47 -0
  49. data/lib/kosmos/post_processors/module_manager_resolver.rb +30 -0
  50. data/lib/kosmos/util.rb +7 -0
  51. data/lib/kosmos/version.rb +3 -0
  52. data/lib/kosmos/versioner.rb +65 -0
  53. data/spec/download_url_spec.rb +64 -0
  54. data/spec/fixtures/example_box.html +165 -0
  55. data/spec/fixtures/example_dropbox.html +114 -0
  56. data/spec/fixtures/example_mediafire.html +101 -0
  57. data/spec/package_spec.rb +77 -0
  58. data/spec/spec_helper.rb +22 -0
  59. data/spec/versioner_spec.rb +87 -0
  60. metadata +166 -0
@@ -0,0 +1,9 @@
1
+ class SpacePlanePlus < Kosmos::Package
2
+ title 'Spaceplane Plus'
3
+ url 'https://www.dropbox.com/s/xkaelclfjzzoicn/SpaceplanePlus.zip'
4
+
5
+ def install
6
+ merge_directory 'SpaceplanePlus v1.0.0/GameData'
7
+ merge_directory 'SpaceplanePlus v1.0.0/Ships'
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ class TACFuelBalancer < Kosmos::Package
2
+ title 'TAC Fuel Balancer'
3
+ url 'https://github.com/taraniselsu/TacFuelBalancer/releases/download/Release_v2.3/TacFuelBalancer_2.3.0.2.zip'
4
+
5
+ def install
6
+ merge_directory 'GameData'
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ class TACLifeSupport < Kosmos::Package
2
+ title 'TAC Life Support (WIP)'
3
+ aliases 'tac life support'
4
+ url 'https://github.com/taraniselsu/TacLifeSupport/releases/download/Release_v0.8/TacLifeSupport_0.8.0.4.zip'
5
+
6
+ def install
7
+ merge_directory 'GameData'
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class Toolbar < Kosmos::Package
2
+ title 'Toolbar Plugin'
3
+ aliases 'toolbar'
4
+ url 'http://blizzy.de/toolbar/Toolbar-1.7.1.zip'
5
+
6
+ def install
7
+ merge_directory 'Toolbar-1.7.1/GameData'
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ class VanguardTechnologies < Kosmos::Package
2
+ title 'Vanguard Technologies'
3
+ url 'http://kerbalspaceport.com/wp/wp-content/themes/kerbal/inc/download.php?f=uploads/2013/12/VNG-Plugin_0.7.2.zip'
4
+
5
+ def install
6
+ merge_directory 'VNG-Plugin/GameData'
7
+ end
8
+ end
9
+
10
+ class VanguardTechnologiesEVAParachutes < Kosmos::Package
11
+ title 'Vanguard Technologies - EVA Parachutes'
12
+ aliases 'eva parachutes'
13
+ url 'http://kerbalspaceport.com/wp/wp-content/themes/kerbal/inc/download.php?f=uploads/2013/10/VNG-Parachute_1.2.zip'
14
+
15
+ def install
16
+ merge_directory 'VNG-Parachute/GameData'
17
+ end
18
+ end
@@ -0,0 +1,47 @@
1
+ /**
2
+ * A PhantomJS script to help find where to download a package's zipfile from.
3
+ * Execute it is:
4
+ *
5
+ * phantomjs page_fetcher.js <url>
6
+ *
7
+ * This script will "return" a value by sending it to STDOUT.
8
+ *
9
+ * There are two possible outputted values for this script.
10
+ *
11
+ * 1. If an external resource is received, and this external resource is a zip
12
+ * file (as determined from the HTTP contentType header), then the URL to
13
+ * that resource is returned.
14
+ * 2. If no external resource is found, then the HTML of the url provided,
15
+ * after all Javascript has been loaded, is outputted and another script
16
+ * must take care of determining where the URL of interest is found.
17
+ */
18
+
19
+ var system = require('system');
20
+ var page = require('webpage').create();
21
+
22
+ var target = system.args[1];
23
+
24
+ var externalResourceProvidedUrl = false;
25
+
26
+ page.onResourceReceived = function(resource) {
27
+ if (resource.contentType === 'application/x-zip-compressed' &&
28
+ !externalResourceProvidedUrl) {
29
+ externalResourceProvidedUrl = true;
30
+
31
+ console.log(resource.url);
32
+ }
33
+ }
34
+
35
+ page.open(target, function() {
36
+ // If this is set to true, then an external resource already provided the
37
+ // desired URL, and nothing more needs to be done -- the URL has already been
38
+ // sent to STDOUT.
39
+ //
40
+ // If done is still false, then the page itself contains the desired URL, so
41
+ // we output the HTML and let Ruby-side Kosmos determine the target URL.
42
+ if (!externalResourceProvidedUrl) {
43
+ console.log(page.content);
44
+ }
45
+
46
+ phantom.exit();
47
+ });
@@ -0,0 +1,30 @@
1
+ module Kosmos
2
+ module PostProcessors
3
+ class ModuleManagerResolver
4
+ def self.post_process(ksp_path)
5
+ game_data = File.join(ksp_path, 'GameData')
6
+
7
+ module_managers = Dir[File.join(game_data, '*')].select do |file|
8
+ File.basename(file).start_with?('ModuleManager')
9
+ end
10
+
11
+ most_recent_manager = module_managers.max_by do |file|
12
+ # Converts a string like this:
13
+ #
14
+ # ModuleManager.5.2.3
15
+ #
16
+ # Into this:
17
+ #
18
+ # [5, 2, 3]
19
+ File.basename(file).scan(/\d+/).map(&:to_i)
20
+ end
21
+
22
+ (module_managers - [most_recent_manager]).each do |file|
23
+ Util.log "Detected and deleting outdated version of ModuleManager: #{file}"
24
+
25
+ File.delete(file)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ module Kosmos
2
+ module Util
3
+ def self.log(msg)
4
+ puts msg if Kosmos.config.verbose
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Kosmos
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,65 @@
1
+ require 'rugged'
2
+
3
+ module Kosmos
4
+ class Versioner
5
+ class << self
6
+ INIT_COMMIT_MESSAGE = "INIT: Initialize Kosmos"
7
+
8
+ def init_repo(path)
9
+ GitAdapter.init_repo(path)
10
+ GitAdapter.commit_everything(path, INIT_COMMIT_MESSAGE)
11
+ end
12
+
13
+ def mark_preinstall(path, package)
14
+ GitAdapter.commit_everything(path, pre_install_message(package))
15
+ end
16
+
17
+ def mark_postinstall(path, package)
18
+ GitAdapter.commit_everything(path, post_install_message(package))
19
+ end
20
+
21
+ def installed_packages(path)
22
+ commits = GitAdapter.list_commits(path)
23
+
24
+ postinstalls = commits.select(&:post?).map(&:subject)
25
+ uninstalls = commits.select(&:uninstall?).map(&:subject)
26
+
27
+ # The packages that have actually been installed are those that have a
28
+ # 'post-install' without any corresponding 'uninstall'. We can find
29
+ # these packages by getting post-installs, and removing the first
30
+ # instance of each package also found in uninstall.
31
+ #
32
+ # Note that we can't use Array#delete because that method will delete
33
+ # *all* instances of a package, which won't work because it's possible
34
+ # for a user to install, uninstall, then re-install a package.
35
+ uninstalls.each do |package|
36
+ postinstalls.delete_at(postinstalls.index(package))
37
+ end
38
+
39
+ postinstalls
40
+ end
41
+
42
+ def uninstall_package(path, package)
43
+ to_revert = GitAdapter.list_commits(path).find do |commit|
44
+ commit.post? && commit.subject == package.title
45
+ end
46
+
47
+ GitAdapter.revert_commit(path, to_revert, uninstall_message(package))
48
+ end
49
+
50
+ private
51
+
52
+ def pre_install_message(package)
53
+ "PRE: #{package.title}"
54
+ end
55
+
56
+ def post_install_message(package)
57
+ "POST: #{package.title}"
58
+ end
59
+
60
+ def uninstall_message(package)
61
+ "UNINSTALL: #{package.title}"
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kosmos::DownloadUrl do
4
+ it 'detects mediafire links' do
5
+ url = 'http://www.mediafire.com/download/some-random-stuff/whatever.zip'
6
+ expect(Kosmos::DownloadUrl.new(url)).to be_mediafire
7
+ end
8
+
9
+ it 'correctly resolves mediafire download urls' do
10
+ url = 'file://' + File.absolute_path('spec/fixtures/example_mediafire.html')
11
+ target_url = 'http://download1690.mediafire.com/qny71y9k6kvg/o6cbe03iitggj1p/B9+Aerospace+Pack+R4.0c.zip'
12
+
13
+ expect(Kosmos::DownloadUrl.new(url).resolve_download_url).to eq target_url
14
+ end
15
+
16
+ it 'detects box links' do
17
+ url = 'https://app.box.com/s/89skim2e3simjwmuof4c'
18
+ expect(Kosmos::DownloadUrl.new(url)).to be_box
19
+ end
20
+
21
+ it 'correctly resolves box download urls' do
22
+ url = 'https://app.box.com/s/89skim2e3simjwmuof4c'
23
+ target_url = 'https://app.box.com/index.php?rm=box_download_shared_file&shared_name=89skim2e3simjwmuof4c&file_id=f_13860854981'
24
+
25
+ stub_request(:get, url).
26
+ to_return(body: File.read('spec/fixtures/example_box.html'))
27
+
28
+ expect(Kosmos::DownloadUrl.new(url).resolve_download_url).to eq target_url
29
+ end
30
+
31
+ it 'detects dropbox links' do
32
+ url = 'https://www.dropbox.com/s/some-random-stuff/whatever.zip'
33
+ expect(Kosmos::DownloadUrl.new(url)).to be_dropbox
34
+ end
35
+
36
+ it 'correctly resolves dropbox download urls' do
37
+ url = 'file://' + File.absolute_path('spec/fixtures/example_dropbox.html')
38
+ target_url = 'https://dl.dropboxusercontent.com/s/od4kickxt92jpo2/BetterAtmosphereV4%5BREL%5D.zip?dl=1&token_hash=AAFn5emxuVXLw_RfjDgQs0Hn7-YZ-vejn3m8zLgOj2tTFA&expiry=1401095304'
39
+
40
+ expect(Kosmos::DownloadUrl.new(url).resolve_download_url).to eq target_url
41
+ end
42
+
43
+ it 'detects curseforge links' do
44
+ url = 'http://kerbal.curseforge.com/plugins/123123-whatever'
45
+ expect(Kosmos::DownloadUrl.new(url)).to be_curseforge
46
+ end
47
+
48
+ # This is commented out until I mock this out -- I don't want to send useless
49
+ # queries to Curseforge.
50
+ #
51
+ # it 'correctly resolves curseforge download urls' do
52
+ # # TODO: Use VCR or something on this
53
+ # url = 'http://kerbal.curseforge.com/plugins/220207-hotrockets-particle-fx-replacement'
54
+ # target_url = 'http://addons.cursecdn.com/files/2201%5C918/HotRockets_7.1_Nazari.zip'
55
+
56
+ # expect(Kosmos::DownloadUrl.new(url).resolve_download_url).to eq target_url
57
+ # end
58
+
59
+ it 'just returns the url if no built-in tool available' do
60
+ url = 'https://github.com/rbray89/ActiveTextureManagement/releases/download/3-1-basic/ActiveTextureManagement-Basic-3-1.zip'
61
+
62
+ expect(Kosmos::DownloadUrl.new(url).resolve_download_url).to eq url
63
+ end
64
+ end
@@ -0,0 +1,165 @@
1
+
2
+ <!DOCTYPE html>
3
+ <html lang="en-US" style="overflow: hidden;">
4
+ <head>
5
+ <meta charset="utf-8"><meta name="referrer" content="never"><title>CactEyeTelescope_v0-1.zip - File Shared from Box</title><meta property="og:description" content="" /><meta property="og:image" content="https://e1.boxcdn.net/_assets/thumbs/242x286/application/zip-uMvcd1.png?shared_name=89skim2e3simjwmuof4c" /><meta name="twitter:card" content="player"><meta name="twitter:site" content="@boxhq"><meta name="twitter:title" content="CactEyeTelescope_v0-1.zip"><meta name="twitter:description" content="CactEyeTelescope_v0-1.zip"><meta name="twitter:image" content="https://e1.boxcdn.net/_assets/thumbs/242x286/application/zip-uMvcd1.png?shared_name=89skim2e3simjwmuof4c"><meta name="twitter:player" content="https://app.box.com/embed_widget/ca35e91x0v68/s/89skim2e3simjwmuof4c"><meta name="twitter:player:width" content="500"><meta name="twitter:player:height" content="400"><meta name="keywords" content="free online storage, online storage, online file storage, share files online, photo sharing online, store documents online, retrieve documents, internet storage, online data backup, file storage, file sharing, photo sharing, online photo gallery, photos online, data backup, online backup, mobile data access, data networking, storage solution, virtual hard drive, remote backup, internet uploading, share files online, file hosting, save files, thumb drive, storage disk, remote access, web hosting, group collaboration, gigabyte of storage, gigabyte of space, group access, online disk storage, online data storage, file storage online, personal online space, secure file sharing, online photo sharing, online photos, backup data, online backup services, mobile media browser, networking &amp; data, network storage solution, internet file storage, backup remote, online file hosting." /><link rel="icon" href="https://e1.boxcdn.net/_assets/img/favicon-ok6l5R.png"><meta name="robots" content="noindex, nofollow"/><link rel="stylesheet" href="https://e1.boxcdn.net/_assets/css/section_application-GxG5XL.css" type="text/css" media="screen" /><link rel="stylesheet" href="https://e1.boxcdn.net/_assets/css/section_templ_box_show_shared_file_lightbox-pGmCsi.css" type="text/css" media="screen" /> <link rel="stylesheet" type="text/css" href="https://e1.boxcdn.net/dynamic/theme_default_1EkNJ4a40775.css" />
6
+ <script type="text/javascript"> var site_root = '/'
7
+ ,https_root = 'https://app.box.com/';</script>
8
+
9
+ <script type="text/javascript"> var script_url = 'https://app.box.com/'
10
+ ,images_path = '/img/'
11
+ ,images_box_path = '/img/box/'
12
+ ,css_path = '/css/'
13
+ ,js_path = '/js/'
14
+ ,assets_index_file = 'assets-index'
15
+ ,assets_index_mini_file = 'assets-index-mini'
16
+ ,assets_base = '_assets'
17
+ ,assets_url = 'https://%s/_assets%s';</script>
18
+ <script>var is_safari = '1';var request_token = '76969d6382a5aeb096ae81c0a07529033d2fb491142f5c4f06096377a8616860';var waiting_on_user_input = false;window.onreadyList = [];</script><script type="text/javascript">
19
+ var widget_theme = ''
20
+ ,is_embed_widget = ''
21
+ ,widget_view = ''
22
+ ,widget_sort = ''
23
+ ,widget_direction = ''
24
+ ,widget_original_url = ''
25
+ ,widget_show_item_feed_actions = ''
26
+ ,widget_show_parent_path = ''
27
+ ,widget_root_folder_id = ''
28
+ ,widget_view_file_only = ''
29
+ ,widget_shared_name = ''
30
+ ,path_prefix = ''
31
+ ,open_link_in_new_window = 0 ,promoted_app_ids = '';
32
+ </script>
33
+
34
+ </head>
35
+
36
+
37
+ <!--[if IE 7]> <body class="ie ie7 lte_ie9 lte_ie8 lte_ie7" id="site_body"> <![endif]-->
38
+ <!--[if IE 8]> <body class="ie ie8 lte_ie9 lte_ie8" id="site_body"> <![endif]-->
39
+ <!--[if IE 9]> <body class="ie ie9 lte_ie9" id="site_body"> <![endif]-->
40
+ <!--[if gt IE 9]> <body id="site_body"> <![endif]-->
41
+ <!--[if !IE]><!--> <body id="site_body"> <!--<![endif]-->
42
+ <div class="head fw module" style="position: fixed; z-index: 52" data-module="preview-shared-file"> <div class="header" role="navigation">
43
+ <div class="phl">
44
+ <div class="line nav share-header-cntr">
45
+ <div class="header share-action-bar pll mls">
46
+ <ul class="inline_list module header-shared" data-module="header-shared" data-sharedname="89skim2e3simjwmuof4c" data-fileid="13860854981"><li class="nav_content pvm ignore_mouseover"><button id="download_button" data-type="download-file-btn" class="man pts primary_button fw"><ul class="inline_list inline_list_icon_aligned lh20"><li class="icon sprite_preview_20x20_download ignore_mouseover preview_icon shared-file-page-download-icon"></li><li class="ignore_mouseover shared-file-download-text mhs">Download&nbsp;<span class="file_size">(1.8MB)</span></li></ul></button></li><li class="shared-file-page-signup-link mll"><a id="sign_up" class="highlight ignore_mouseover nav_content" href="https://app.box.com/ref/singlefileshare2">Sign up</a></li><li class="nav_content lowlight ignore_mouseover shared-file-page-link-separator">|</li><li class="shared-file-page-login-link"><a id="log_in" class="highlight ignore_mouseover nav_content" href="https://app.box.com/login">Log in</a></li></ul> </div>
47
+ <div class="logo_cntr ptm">
48
+ <a href="https://app.box.com/">
49
+ <span id="themed_main_logo" style="display: none;"></span>
50
+ <div id="default_main_logo" class="img logo standard_logo mrm"></div>
51
+ <div id="default_main_logo_glow" class="img logo standard_logo_glow"></div>
52
+
53
+ </a>
54
+ </div>
55
+
56
+ <div class="nav_content file-name" data-type="file-name" data-hover="tooltip" aria-label="CactEyeTelescope_v0-1.zip" data-tooltipid="shared-file-name-tooltip">
57
+ CactEyeTelescope_v0-1.zip
58
+ </div>
59
+ </div> </div> </div> </div>
60
+ <div class="body shared_file" data-page-type="shared-file">
61
+ <div class="page">
62
+ <div id="top_notification" class="module top-notification" data-module="notifications">
63
+ </div>
64
+ <script type="text/x-template" id="jst-notification">
65
+ <div class="cntr notification_container fx notification_<%=type%> " data-type="<%=type%>" role="alert">
66
+ <div class="notification_outer fw">
67
+ <div class="notification_inner ram table pll prm">
68
+ <div class="notification_message table_cell txt_m lh16 pvm phn">
69
+ <strong class="notification_title">
70
+ <%=title%>
71
+ </strong>
72
+ <span class="notification_description <%=descriptionClass%> mrn mls">
73
+ <%=description%>
74
+ </span>
75
+ </div>
76
+ <div class="notification_actions table_cell txt_m">
77
+ <button class="notification_action mvs mhn <%=actionClass%>">
78
+ <%=actionText%>
79
+ </button>
80
+ <button class="notification_close ban mrn">
81
+ <div class="sprite_16x16_black_close"></div>
82
+ <div class="sprite_16x16_white_close"></div>
83
+ </button>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ </div></script> <div id="box_confirmation" class="module cntr feature confirmation confirmation_v2 disable_selectable" data-module="legacy-confirmations" style="display: none;">
88
+ <div class="media">
89
+ <a id="box_confirmation_close" class="img_ext icon sprite_14x14_close mrn" href="#"></a>
90
+ <div class="bd">
91
+ <div id="box_confirmation_content"></div>
92
+ <div id="box_confirmation_description" class="pts" style="display:none;"></div>
93
+ </div>
94
+ </div>
95
+ </div>
96
+
97
+
98
+ <div id="lightbox" class="dark_background" tabindex="-1" style="box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.4) inset;">
99
+ <div class="content_container curtain">
100
+ <div class="content">
101
+ </div>
102
+ </div>
103
+ </div>
104
+ <div class="module" data-module="preview-main" data-sharedname="89skim2e3simjwmuof4c" data-vanityname=""></div>
105
+ <script type="text/x-template" id="jst-preview_loading_module_template"><div class="preview_content_wrapper">
106
+ <span class="vertical-alignment-helper"></span><img src="https://e1.boxcdn.net/_assets/img/box/spinner_big-e70dos.gif" class="preview_error_icon">
107
+ </div>
108
+ </script> </div>
109
+ </div>
110
+
111
+ <script type="text/javascript"> var enable_shared_file_preview = '1';</script>
112
+
113
+
114
+ <script type="text/x-template" id="jst-tooltip_prototype"> <div id="tooltip_prototype" class="tooltip_wrapper">
115
+ <div class="tooltip">
116
+ <div class="inner">
117
+ <h4></h4>
118
+ <p></p>
119
+ </div>
120
+ <b class="beak"></b>
121
+ </div>
122
+ </div>
123
+ </script>
124
+
125
+
126
+ <script src="https://e2.boxcdn.net/_assets/js/section_templ_box_show_shared_file_lightbox-TTSumI.js"></script>
127
+
128
+ <script>
129
+
130
+
131
+
132
+ (function() {
133
+
134
+ window.initialConfig = {"userId":2,"userLogin":""} || {};
135
+ window.initialConfig.debug = 0;
136
+ window.initialConfig.browser_is_old = 1;
137
+
138
+ window.initialConfig.initialJSHashes = ["Z7FrE","LQtj7","MXAgT","ZemMA","WVErW","1og2L","814jR","17mWD","Vzz3y","dsMXg","PVUTd","iqwp9","moLuV","7eG3i","CJhaJ","Mw4Yi","LpTtj","ezipH","Dcoi1","uBNkr","D5Aw2","Giz2i","5gXUm","12TCV","X5sgw","jhYBA","AQ6GK","efsXP","upa2L","eBJ2B","Ca33W","dchdW","jZ7J4","JPUup","CTEG1","uqRrS","28GkN","Vx9Be","8dkN1","jmMHL","4vNPE","oQiJ9","dN4fQ","CL2Ge","GiJuK","oJGED","nWK8N","3SFpr","QPP9V","aqm5J","mt4XP","inboP","MeD7P","qW5xE","4KMsF"];
139
+ window.initialConfig.initialCSSHashes = ["UNQqU","gaaw7","kTotX","sS96u","R7FcL","2GqF2","F6BD3","QXN1V","NSUU1","8zaCt","JWAZW","F5PHY","x7AzE","xy3uc","6RxB9","LSPpz","yzArW","RwK6q","BAcwt","Xdd9J","QBXBf","QBXBf","TXxWj","cFkEX","T6Ye2"];
140
+
141
+ window.initialConfig.cookieDomain = '.box.com';
142
+
143
+ })();
144
+
145
+
146
+ window.onreadyList.push(function() {
147
+ Box.Application.broadcast('previewaction',
148
+ {
149
+ action: "show",
150
+
151
+ itemTypedID: "f_13860854981",
152
+ itemExtension: "zip",
153
+
154
+ allItems: []
155
+ }
156
+ );
157
+ });
158
+
159
+ </script>
160
+
161
+
162
+
163
+
164
+ </body>
165
+ </html>