<!DOCTYPE html> <html xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" lang="en-us" xml:lang="en-us" class="_Skins_HTML5___Top_Navigation" data-mc-search-type="Stem" data-mc-help-system-file-name="Default.xml" data-mc-path-to-help-system="../../../" data-mc-has-content-body="True" data-mc-conditions="Spryker.B2B,Spryker.B2C" data-mc-target-type="WebHelp2" data-mc-runtime-file-type="Topic;Default" data-mc-preload-images="false" data-mc-in-preview-mode="false" data-mc-toc-path="Features|Development"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="msapplication-config" content="../../../Skins/Favicons/browserconfig.xml" /> <link rel="apple-touch-icon" sizes="180x180" href="../../../Skins/Favicons/apple-touch-icon.png" /> <link rel="shortcut icon" href="../../../Skins/Favicons/favicon-32x32.png" /> <link rel="icon" sizes="96x96" href="../../../Skins/Favicons/favicon-96x96.png" /> <link rel="icon" sizes="32x32" href="../../../Skins/Favicons/favicon-32x32.png" /> <link rel="icon" sizes="16x16" href="../../../Skins/Favicons/favicon-16x16.png" /> <meta charset="utf-8" /> <meta name="description" content="" /> <meta name="author" content="" /><title>File System </title> <!-- Google Tag Manager --> <script>/* <![CDATA[ */(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-NP24S2');/* ]]> */</script> <!-- End Google Tag Manager --> <script>/* <![CDATA[ */ var s = document.createElement("script"); s.type = "text/javascript"; s.src = "https://www.googletagmanager.com/gtag/js?id==UA-56589105-4"; document.getElementsByTagName('head').item(0).appendChild(s); /* ]]> */</script> <script>/* <![CDATA[ */ window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-56589105-4'); /* ]]> */</script> <link href="../../../Skins/Default/Stylesheets/Slideshow.css" rel="stylesheet" /> <link href="../../../Skins/Default/Stylesheets/TextEffects.css" rel="stylesheet" /> <link href="../../../Skins/Default/Stylesheets/Topic.css" rel="stylesheet" /> <link href="../../../Skins/Default/Stylesheets/Components/Styles.css" rel="stylesheet" /> <link href="../../../Skins/Default/Stylesheets/Components/Tablet.css" rel="stylesheet" /> <link href="../../../Skins/Default/Stylesheets/Components/Mobile.css" rel="stylesheet" /> <link href="../../../Skins/Fluid/stylesheets/foundation.6.2.3.css" rel="stylesheet" /> <link href="../../../Skins/Fluid/stylesheets/styles.css" rel="stylesheet" /> <link href="../../../Skins/Fluid/stylesheets/tablet.css" rel="stylesheet" /> <link href="../../../Skins/Fluid/stylesheets/mobile.css" rel="stylesheet" /> <link href="../../../resources/stylesheets/perfect-scrollbar.css" rel="stylesheet" /> <link href="../../../resources/stylesheets/prism.css" rel="stylesheet" /> <style>/*<meta />*/ .button.previous-topic-button { -pie-background: url('../../../Skins/Default/Stylesheets/Images/navigate-previous.png') no-repeat center center, linear-gradient(#ffffff, #ececec); } .button.next-topic-button { -pie-background: url('../../../Skins/Default/Stylesheets/Images/navigate-next.png') no-repeat center center, linear-gradient(#ffffff, #ececec); } .button.print-button { -pie-background: url('../../../Skins/Default/Stylesheets/Images/printer.png') no-repeat center center, linear-gradient(#ffffff, #ececec); } .button.expand-all-button { -pie-background: url('../../../Skins/Default/Stylesheets/Images/expand.png') no-repeat center center, linear-gradient(#ffffff, #ececec); } .button.collapse-all-button { -pie-background: url('../../../Skins/Default/Stylesheets/Images/collapse.png') no-repeat center center, linear-gradient(#ffffff, #ececec); } .needs-pie { behavior: url('../../../resources/scripts/PIE-no-motw.htc'); } </style> <link href="../../../resources/stylesheets/mainstyles.css" rel="stylesheet" /> <link href="../../../resources/tablestyles/patternedrows.css" rel="stylesheet" /> <script src="../../../resources/scripts/custom.modernizr.js"> </script> <script src="../../../resources/scripts/jquery.min.js"> </script> <script src="../../../resources/scripts/require.min.js"> </script> <script src="../../../resources/scripts/require.config.js"> </script> <script src="../../../resources/scripts/foundation.6.2.3_custom.js"> </script> <script src="../../../resources/scripts/plugins.min.js"> </script> <script src="../../../resources/scripts/MadCapAll.js"> </script> </head> <body> <div class="foundation-wrap off-canvas-wrapper"> <div class="off-canvas-wrapper-inner" data-off-canvas-wrapper=""> <aside class="off-canvas position-right" id="offCanvas" data-off-canvas="" data-position="right" data-mc-ignore="true"> <ul class="off-canvas-drilldown vertical menu off-canvas-list" data-drilldown="" data-mc-back-link="Back" data-mc-css-tree-node-expanded="is-drilldown-submenu-parent" data-mc-css-tree-node-collapsed="is-drilldown-submenu-parent" data-mc-css-sub-menu="vertical menu slide-in-right is-drilldown-submenu" data-mc-include-indicator="False" data-mc-include-icon="False" data-mc-include-parent-link="True" data-mc-include-back="True" data-mc-defer-expand-event="True" data-mc-expand-event="click.zf.drilldown" data-mc-toc="True"> </ul> </aside> <div class="off-canvas-content inner-wrap" data-off-canvas-content=""> <div data-sticky-container="" class="title-bar-container"> <nav class="title-bar tab-bar sticky" data-sticky="" data-options="marginTop:0" style="width:100%" data-sticky-on="small" data-mc-ignore="true"> <div class="middle title-bar-section outer-row clearfix"> <div class="menu-icon-container relative clearfix"> <button class="menu-icon" data-toggle="offCanvas"><span></span> </button> </div> </div> <div class="title-bar-layout outer-row"> <div class="logo-wrapper"><a class="logo" href="../../../home.htm" alt="Logo"></a> </div> <div class="navigation-wrapper nocontent"> <ul class="navigation clearfix" data-mc-css-tree-node-has-children="has-children" data-mc-css-sub-menu="sub-menu" data-mc-expand-event="mouseenter" data-mc-top-nav-menu="True" data-mc-max-depth="3" data-mc-include-icon="False" data-mc-include-indicator="False" data-mc-include-children="True" data-mc-include-siblings="True" data-mc-include-parent="True" data-mc-toc="True"> <li class="placeholder" style="visibility:hidden"><a>placeholder</a> </li> </ul> </div> <div class="nav-search-wrapper"> <div class="nav-search row"> <form class="search" action="#"> <div class="search-bar search-bar-container needs-pie"> <input class="search-field needs-pie" type="search" placeholder="Search the Academy" /> <div class="search-filter-wrapper"> <div class="search-filter"> <div class="search-filter-content"> <ul> <li>All Files</li> </ul> </div> </div> </div> <div class="search-submit-wrapper" dir="ltr"> <div class="search-submit" title="Search"> </div> </div> </div> </form> </div> </div> </div> </nav> </div> <section class="main-section"> <div class="row outer-row sidenav-layout"> <div class="sidenav-wrapper"> <div class="sidenav-container"> <ul class="off-canvas-accordion vertical menu sidenav" data-accordion-menu="" data-mc-css-tree-node-expanded="is-accordion-submenu-parent" data-mc-css-tree-node-collapsed="is-accordion-submenu-parent" data-mc-css-sub-menu="vertical menu accordion-menu is-accordion-submenu nested" data-mc-include-indicator="False" data-mc-include-icon="False" data-mc-include-parent-link="False" data-mc-include-back="False" data-mc-defer-expand-event="True" data-mc-expand-event="click.zf.accordionMenu" data-mc-toc="True" data-mc-side-nav-menu="True"> </ul> </div> </div> <div class="body-container" data-mc-content-body="True"> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NP24S2" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <!-- End Google Tag Manager (noscript) --> <div class="search-container"> <form class="search" action="#"> <div class="search-bar search-bar-container needs-pie _Skins_SearchTopics mc-component"> <input class="search-field needs-pie" type="search" placeholder="Search" /> <div class="search-filter-wrapper"> <div class="search-filter"> <div class="search-filter-content"> <ul> <li>All Files</li> </ul> </div> </div> </div> <div class="search-submit-wrapper" dir="ltr"> <div class="search-submit" title="Search"> </div> </div> </div> </form> </div> <div class="row collapse"> <div class="top-bar"> <div class="breadcrumbs-block"> <div class="nocontent"> <div class="MCBreadcrumbsBox_0 breadcrumbs" data-mc-breadcrumbs-divider=" > " data-mc-breadcrumbs-count="3" data-mc-toc="True"><span class="MCBreadcrumbsPrefix">You are here: </span> </div> </div> </div> <div> </div> <form class="search" action="#"> <div class="search-bar search-bar-container needs-pie _Skins_SearchHome mc-component"> <input class="search-field needs-pie" type="search" placeholder="Search" /> <div class="search-filter-wrapper"> <div class="search-filter"> <div class="search-filter-content"> <ul> <li>All Files</li> </ul> </div> </div> </div> <div class="search-submit-wrapper" dir="ltr"> <div class="search-submit" title="Search"> </div> </div> </div> </form> </div> <div class="topic-layout"> <div> <div class="side-menu"> <div data-sticky-container="" id="QxZgxd57Gk2XnFHXQeLCEA"> <div class="sticky sticky-menu" style="width:100%" data-sticky="" data-top-anchor="QxZgxd57Gk2XnFHXQeLCEA:top" data-bottom-anchor="contentBody:bottom" data-sticky-on="small" data-scroll-container-on="small"> <ul class="nocontent menu _Skins_SideMenu mc-component" data-mc-is-context-sensitive="True" data-mc-linked-toc="Data/Tocs/master.js" data-mc-side-menu="True" data-mc-max-depth="1" data-mc-include-icon="False" data-mc-include-indicator="False" data-mc-include-children="True" data-mc-include-siblings="True" data-mc-include-parent="True" data-mc-toc="True"> </ul> </div> </div> </div> </div> <div> <div class="side-menu"> <div class="toolbar-wrapper"> <div class="widget-github js-widget-github"><a class="widget-github-link js-widget-github-link" href="https://github.com/spryker/spryker-documentation" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 26 26"><path d="M13.5 0C6.057 0 0 6.057 0 13.5c0 5.888 3.791 10.905 9.058 12.745a.463.463 0 0 0 .258.088c1.316.43 2.724.667 4.184.667C20.943 27 27 20.943 27 13.5S20.943 0 13.5 0zm0 .931c6.93 0 12.569 5.639 12.569 12.569 0 5.428-3.459 10.061-8.287 11.818a1.903 1.903 0 0 1-.092-.527v-2.446c0-.975-.477-2.037-.946-2.75 2.584-.436 5.537-1.776 5.537-6.779 0-1.37-.429-2.58-1.275-3.598.186-.611.415-1.9-.225-3.52a.47.47 0 0 0-.291-.272c-.13-.04-1.326-.35-3.806 1.277a12.921 12.921 0 0 0-6.36 0c-2.481-1.63-3.68-1.319-3.809-1.277a.47.47 0 0 0-.29.273C5.582 7.319 5.811 8.607 6 9.218c-.85 1.018-1.279 2.227-1.279 3.598 0 4.957 2.9 6.323 5.463 6.778-.322.407-.66.934-.81 1.47-.661.184-2.018.19-2.929-1.37-.032-.06-.829-1.475-2.4-1.584-.25.002-.882.042-1.035.525-.169.537.424.944.679 1.117l.058.034c.029.015.707.371 1.213 1.644.105.333 1.03 2.84 4.353 2.399.002.367 0 .552-.004.7v.26c0 .15-.045.378-.096.525C4.386 23.558.931 18.924.931 13.5.931 6.57 6.57.931 13.5.931zm6.51 5.375c.5 1.471.158 2.537.035 2.839a.468.468 0 0 0 .089.49c.805.883 1.214 1.952 1.214 3.181 0 4.72-2.796 5.666-5.535 5.97a.464.464 0 0 0-.253.815c.368.314 1.199 1.68 1.199 2.744v2.446c0 .009.001.414.134.809a12.513 12.513 0 0 1-6.792-.002c.135-.396.139-.802.139-.81l.001-.248c.002-.211.006-.497 0-1.266a.473.473 0 0 0-.174-.362.47.47 0 0 0-.391-.09c-3.126.681-3.802-1.576-3.828-1.67l-.016-.047c-.448-1.135-1.037-1.713-1.388-1.975.759.267 1.182 1.007 1.193 1.024 1.231 2.107 3.264 2.162 4.328 1.685a.463.463 0 0 0 .27-.36c.095-.665.826-1.545 1.196-1.87a.464.464 0 0 0 .136-.488.461.461 0 0 0-.39-.324c-2.73-.31-5.524-1.266-5.524-5.98 0-1.228.41-2.3 1.219-3.181a.464.464 0 0 0 .087-.491c-.124-.302-.467-1.364.031-2.837.396.013 1.362.182 2.988 1.286.112.076.256.1.387.063.973-.27 2.058-.416 3.135-.421 1.08.005 2.166.15 3.14.421.131.037.273.013.386-.063 1.635-1.11 2.6-1.275 2.984-1.288z" /></svg></a> </div> <div class="buttons popup-container clearfix topicToolbarProxy _Skins_TopicToolbar mc-component nocontent" style="mc-topic-toolbar-items: PreviousTopic NextTopic Print ExpandAll CollapseAll;"> <div class="button-group-container-left"> <button class="button needs-pie previous-topic-button" title="Navigate previous"> <img src="../../../Skins/Default/Stylesheets/Images/transparent.gif" alt="previous topic" /> </button> <button class="button needs-pie next-topic-button" title="Navigate next"> <img src="../../../Skins/Default/Stylesheets/Images/transparent.gif" alt="next topic" /> </button> <button class="button needs-pie print-button" title="Print"> <img src="../../../Skins/Default/Stylesheets/Images/transparent.gif" alt="print" /> </button> <button class="button needs-pie expand-all-button" data-state1-class="expand-all-button" data-state2-class="collapse-all-button" data-state2-title="Collapse all" title="Expand all" data-state1-title="Expand all"> <img src="../../../Skins/Default/Stylesheets/Images/transparent.gif" alt="expand all" /> </button> </div> </div> </div> <div class="js-anchorer main-content"> <h1>File System <img src="../../../resources/images/shoptype/b2b_shop.png" /> <img src="../../../resources/images/shoptype/b2c_shop.png" /></h1> <p>The FileSystem Service provides an abstraction for file systems. It uses the same interface to access different types of file systems, regardless of their location or protocol.</p> <p>The Flysystem module provides plugins for <a href="https://github.com/thephpleague/flysystem" target="_blank">thephpleague/flysystem</a> vendor package and implement FileSystem's plugin interfaces. For more details, see <a href="../flysystem.htm" class="MCXref xref">Flysystem </a>.</p> <h2>FileSystem Module</h2> <p>The FileSystem module uses the <var>FileSystemReaderPluginInterface</var> to execute read operations, the <var>FileSystemWriterPluginInterface</var> to execute write operations and the <var>FileSystemStreamPluginInterface</var> to handle big read or write operations.</p> <p> <img src="../../../resources/images/file_system_dependencies.png" title="File System Dependencies" /> </p> <h3>FileSystem Plugin Interfaces system</h3> <table style="mc-table-style: url('../../../resources/tablestyles/patternedrows.css');margin-left: 0;margin-right: auto;width: 100%;" class="TableStyle-PatternedRows" cellspacing="0"> <col class="TableStyle-PatternedRows-Column-Regular" /> <col class="TableStyle-PatternedRows-Column-Regular" /> <thead> <tr class="TableStyle-PatternedRows-Head-Header1"> <th class="TableStyle-PatternedRows-HeadE-Regular-Header1">Plugin Interface</th> <th class="TableStyle-PatternedRows-HeadD-Regular-Header1">Description </th> </tr> </thead> <tbody> <tr class="TableStyle-PatternedRows-Body-LightRows"> <td class="TableStyle-PatternedRows-BodyE-Regular-LightRows">FileSystemReaderPluginInterface</td> <td class="TableStyle-PatternedRows-BodyD-Regular-LightRows">Reading operations</td> </tr> <tr class="TableStyle-PatternedRows-Body-DarkerRows"> <td class="TableStyle-PatternedRows-BodyE-Regular-DarkerRows">FileSystemWriterPluginInterface</td> <td class="TableStyle-PatternedRows-BodyD-Regular-DarkerRows">Writing operations</td> </tr> <tr class="TableStyle-PatternedRows-Body-LightRows"> <td class="TableStyle-PatternedRows-BodyB-Regular-LightRows">FileSystemWriterPluginInterface</td> <td class="TableStyle-PatternedRows-BodyA-Regular-LightRows">Stream handling operations</td> </tr> </tbody> </table> <h3><a name="Plugin"></a>Plugin Configuration</h3> <p>The FileSystem plugins are loaded via <var>FileSystemDependencyProvider</var> by the methods: <var>addFileSystemReaderPlugin()</var>, <var>addFileSystemWriterPlugin()</var> and <var>addFileSystemStreamPlugin()</var>.</p><pre><code class="language-PHP line-numbers"><?php namespace Spryker\Service\FileSystem; use Spryker\Service\Flysystem\Plugin\FileSystem\FileSystemReaderPlugin; use Spryker\Service\Flysystem\Plugin\FileSystem\FileSystemStreamPlugin; use Spryker\Service\Flysystem\Plugin\FileSystem\FileSystemWriterPlugin; use Spryker\Service\Kernel\AbstractBundleDependencyProvider; use Spryker\Service\Kernel\Container; class FileSystemDependencyProvider extends AbstractBundleDependencyProvider { /** * @param \Spryker\Service\Kernel\Container $container * * @return \Spryker\Service\Kernel\Container */ protected function addFileSystemReaderPlugin(Container $container) { $container[static::PLUGIN_READER] = function (Container $container) { return new FileSystemReaderPlugin(); }; return $container; } /** * @param \Spryker\Service\Kernel\Container $container * * @return \Spryker\Service\Kernel\Container */ protected function addFileSystemWriterPlugin(Container $container) { $container[static::PLUGIN_WRITER] = function (Container $container) { return new FileSystemWriterPlugin(); }; return $container; } /** * @param \Spryker\Service\Kernel\Container $container * * @return \Spryker\Service\Kernel\Container */ protected function addFileSystemStreamPlugin(Container $container) { $container[static::PLUGIN_STREAM] = function (Container $container) { return new FileSystemStreamPlugin(); }; return $container; }</code></pre> <h3>Service Configuration</h3> <p>You can use multiple <var>FileSystems</var> at once. They are identified by name, and contain all the configurations required by the specific <var>FileSystem</var> adapter and type defined under <var>sprykerAdapterClass</var>.</p> <p class="note">The <var>sprykerAdapterClass</var> should point to the builder plugin used to create the <var>FileSystem</var>.</p> <h4>Separate FileSystems for media and documents</h4> <p>It is entirely possible to create separate file systems for media content and documents. </p> <p>For example, you can define two <var>FileSystems</var>. One called "media", that only contains media specific content like: images, video and audio and another called "customer" that contains customer-sensitive information that should not be stored in the cloud.</p> <p>We use local file systems for development purposes, but config for staging or production environments. Therefore, you could for example provide, an AWS3 adapter without having to change any code. More precisely, with only configuration you can read/write files from AWS3 no need to change any code mirroring your development environment's logic for writing to the local file system.</p> <p><strong>Development environment example</strong>:</p><pre><code class="language-PHP line-numbers"><?php use Spryker\Shared\FileSystem\FileSystemConstants; use Spryker\Service\FlysystemLocalFileSystem\Plugin\Flysystem\LocalFilesystemBuilderPlugin; $config[FileSystemConstants::FILESYSTEM_SERVICE] = [ 'media' => [ 'sprykerAdapterClass' => LocalFilesystemBuilderPlugin::class, 'root' => APPLICATION_ROOT_DIR . '/data/DE/media/', 'path' => 'images/categories/', ], 'customer' => [ 'sprykerAdapterClass' => LocalFilesystemBuilderPlugin::class, 'root' => APPLICATION_ROOT_DIR . '/data/DE/customer_storage/', 'path' => 'documents/', ], ];</code></pre> <p><strong>Staging/Production environment example</strong>:</p><pre><code class="language-PHP line-numbers"><?php use Spryker\Shared\FileSystem\FileSystemConstants; use Spryker\Service\FlysystemAws3v3FileSystem\Plugin\Flysystem\Aws3v3FilesystemBuilderPlugin; use Spryker\Service\FlysystemFtpFileSystem\Plugin\Flysystem\FtpFilesystemBuilderPlugin; $config[FileSystemConstants::FILESYSTEM_SERVICE] = [ 'media' => [ 'sprykerAdapterClass' => Aws3v3FilesystemBuilderPlugin::class, 'root' => '/DE/', 'path' => 'media/', 'key' => '..', 'secret' => '..', 'bucket' => '..', 'version' => '..', 'region' => '..', ], 'customer' => [ 'sprykerAdapterClass' => FtpFilesystemBuilderPlugin::class, 'host' => '..', 'username' => '..', 'password' => '..', ], ];</code></pre> <h2>FileSystem Usage</h2> <p>Now that we have defined some <var>FileSystems</var>, we can start using them. For example, getting metedata information of a media file stored under "foo/bar.jpg".</p><pre><code class="language-PHP line-numbers"><?php use Generated\Shared\Transfer\FileSystemQueryTransfer; $fileSystemQueryTransfer = new FileSystemQueryTransfer(); $fileSystemQueryTransfer->setFileSystemName('media'); $fileSystemQueryTransfer->setPath('/foo/bar.jpg'); $metadataTransfer = $fileSystemService->getMetadata($fileSystemQueryTransfer);</code></pre> <p><strong>To get metadata</strong>:</p> <p>Define the <var>FileSystem</var> name provided in the configuration and set the path to the filename you want to extract metadata from.</p> <p class="note">The read methods use mostly <var>FileSystemQueryTransfer</var>, the write methods use mostly <var>FileSystemContentTransfer </var>and stream methods use <var>FileSystemStreamTransfer</var>.</p> <p> </p> <p><b>See also</b>:</p> <ul> <li value="1"><a href="filesystem-api.htm">Learn about Filesystem API</a> </li> </ul> <p> </p> </div> </div> </div> </div> </div><a class="scroll-top js-scroll-top" href="#"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 0 12 16"><path fill="#FFF" fill-rule="nonzero" d="M11.82 5.22a.54.54 0 0 1 0 .806.636.636 0 0 1-.852 0L6.607 1.937v13.49a.587.587 0 0 1-.602.573c-.336 0-.611-.258-.611-.573V1.937L1.04 6.026a.647.647 0 0 1-.86 0 .54.54 0 0 1 0-.807L5.573.163a.636.636 0 0 1 .852 0L11.82 5.22z" /></svg></a> <script>/* <![CDATA[ */ function createGithubUrl() { var GITHUB_CONTENT_PATH = '/blob/master/public'; var link = document.querySelector('.js-widget-github-link'); var href = link.getAttribute('href') + GITHUB_CONTENT_PATH + window.location.pathname; link.setAttribute('href', href); } createGithubUrl(); /* ]]> */</script> <script>/* <![CDATA[ */ requirejs.config({ appDir: '', paths: { 'clipboard': ['https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.1/clipboard.min'] } }); require(['clipboard'], function(Clipboard) { console.log(Clipboard); window.Clipboard = Clipboard; }); /* ]]> */</script> <script src="../../../resources/scripts/perfect-scrollbar.js"> </script> <script src="../../../resources/scripts/imagemapster.js"> </script> <script src="../../../resources/scripts/script.js"> </script> <script src="../../../resources/scripts/prism.js"> </script> </div> </div> </section><a data-close="true"></a> </div> </div> <script>/* <![CDATA[ */$(document).foundation();/* ]]> */</script> </div> </body> </html>