diff --git a/src/git/GithubURLs.ts b/src/git/GithubURLs.ts index 93829ae..f716cb7 100644 --- a/src/git/GithubURLs.ts +++ b/src/git/GithubURLs.ts @@ -15,12 +15,10 @@ class GithubURLs extends URLManager { private _base: string = 'https://github.com/{owner}/{project}'; private _apiBase: string = 'https://api.github.com'; private _api: string = 'https://api.github.com/repos/{owner}/{project}'; - private _raw: string = 'https://raw.githubusercontent.com/{owner}/{project}'; private _enterpriseBase: string = 'https://{githubHost}/{owner}/{project}'; private _enterpriseApiBase: string = 'https://{githubHost}/api/v3'; private _enterpriseApi: string = 'https://{githubHost}/api/v3/repos/{owner}/{project}'; - private _enterpriseRaw: string = 'https://{githubHost}/{owner}/{project}/raw'; private _repo: GithubRepo; constructor(repo: GithubRepo) { @@ -29,22 +27,17 @@ class GithubURLs extends URLManager { this._repo = repo; var base: string = this._base; - var raw: string = this._raw; var api: string = this._api; var apiBase: string = this._apiBase; if (this._repo.config.githubHost !== 'github.com') { // We are working with an enterprise github base = this._enterpriseBase; - raw = this._enterpriseRaw; api = this._enterpriseApi; apiBase = this._enterpriseApiBase; } // externalise later this.addTemplate('base', base); - this.addTemplate('raw', raw); - this.addTemplate('rawFile', raw + '/{+ref}/{+path}'); - this.addTemplate('htmlFile', base + '/blob/{ref}/{+path}'); this.addTemplate('api', api); @@ -54,6 +47,7 @@ class GithubURLs extends URLManager { this.addTemplate('apiCommit', api + '/commits/{commit}'); this.addTemplate('apiPathCommits', api + '/commits?path={path}'); this.addTemplate('apiBlob', api + '/git/blobs/{blob}'); + this.addTemplate('apiContents', api + '/contents/{+path}?ref={ref}'); this.addTemplate('rateLimit', apiBase + '/rate_limit'); } @@ -74,15 +68,11 @@ class GithubURLs extends URLManager { return this.getURL('base'); } - raw(): string { - return this.getURL('raw'); - } - rawFile(ref: string, path: string): string { assertVar(ref, 'string', 'ref'); assertVar(path, 'string', 'path'); - return this.getURL('rawFile', { + return this.getURL('apiContents', { ref: ref, path: path }); diff --git a/src/git/loader/GithubRaw.ts b/src/git/loader/GithubRaw.ts index c673e06..15f356a 100644 --- a/src/git/loader/GithubRaw.ts +++ b/src/git/loader/GithubRaw.ts @@ -52,8 +52,9 @@ class GithubRaw extends GithubLoader { var url = this.urls.rawFile(ref, filePath); - var headers = {}; - var request = new CacheRequest(url, headers); + var request = new CacheRequest(url); + this.copyHeadersTo(request.headers); + request.headers['accept'] = 'application/vnd.github.v3.raw'; if (typeOf.isSha(ref)) { request.localMaxAge = this.options.getDurationSecs('localMaxAge') * 1000; diff --git a/src/spec/git/GithubURLs.ts b/src/spec/git/GithubURLs.ts index fa7af0b..e5656b6 100644 --- a/src/spec/git/GithubURLs.ts +++ b/src/spec/git/GithubURLs.ts @@ -58,9 +58,8 @@ describe('GithubRepo / GithubURLs', () => { it('should return replaced urls', () => { urls = new GithubRepo({repoOwner: 'foo', repoProject: 'bar', githubHost: 'github.com'}, 'baz', gitTest.opts).urls; var api = 'https://api.github.com/repos/foo/bar'; - var raw = 'https://raw.githubusercontent.com/foo/bar'; var base = 'https://github.com/foo/bar'; - var rawFile = raw + '/2ece23298f06d9fb45772fdb1d38086918c80f44/sub/folder/file.txt'; + var rawFile = api + '/contents/sub/folder/file.txt?ref=2ece23298f06d9fb45772fdb1d38086918c80f44'; assert.strictEqual(urls.api(), api, 'api'); assert.strictEqual(urls.base(), base, 'base'); assert.strictEqual(urls.rawFile('2ece23298f06d9fb45772fdb1d38086918c80f44', 'sub/folder/file.txt'), rawFile, 'rawFile'); @@ -71,7 +70,6 @@ describe('GithubRepo / GithubURLs', () => { repoConfig.repoOwner = 'correctOwner'; repoConfig.repoProject = 'correctProject'; var api = 'https://api.github.com/repos/correctOwner/correctProject'; - var raw = 'https://raw.githubusercontent.com/correctOwner/correctProject'; var base = 'https://github.com/correctOwner/correctProject'; assert.strictEqual(urls.api(), api, 'api'); assert.strictEqual(urls.base(), base, 'base'); @@ -86,7 +84,7 @@ describe('GithubRepo / GithubURLs', () => { var api = 'https://github.mycompany.com/api/v3/repos/foo/bar'; var raw = 'https://github.mycompany.com/foo/bar/raw'; var base = 'https://github.mycompany.com/foo/bar'; - var rawFile = raw + '/2ece23298f06d9fb45772fdb1d38086918c80f44/sub/folder/file.txt'; + var rawFile = api + '/contents/sub/folder/file.txt?ref=2ece23298f06d9fb45772fdb1d38086918c80f44'; assert.strictEqual(urls.api(), api, 'api'); assert.strictEqual(urls.base(), base, 'base'); assert.strictEqual(urls.rawFile('2ece23298f06d9fb45772fdb1d38086918c80f44', 'sub/folder/file.txt'), rawFile, 'rawFile'); diff --git a/src/tsd/logic/Core.ts b/src/tsd/logic/Core.ts index d4273c6..00178c6 100644 --- a/src/tsd/logic/Core.ts +++ b/src/tsd/logic/Core.ts @@ -75,6 +75,7 @@ class Core { var token = process.env.TSD_GITHUB_TOKEN || this.context.settings.getValue('/token'); if (typeOf.isString(token)) { this.repo.api.headers['authorization'] = 'token ' + token; + this.repo.raw.headers['authorization'] = 'token ' + token; } else { delete this.repo.api.headers['authorization']; diff --git a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/9a/9aedb9357f0e835ea1df6092ed4fedd5e793b126.json b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/94/9475d358a03312943fd546c6b7ce2f74748514d0.json similarity index 65% rename from test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/9a/9aedb9357f0e835ea1df6092ed4fedd5e793b126.json rename to test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/94/9475d358a03312943fd546c6b7ce2f74748514d0.json index 704064f..62a0c01 100644 --- a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/9a/9aedb9357f0e835ea1df6092ed4fedd5e793b126.json +++ b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/94/9475d358a03312943fd546c6b7ce2f74748514d0.json @@ -1,6 +1,6 @@ { - "url": "https://raw.githubusercontent.com/borisyankov/DefinitelyTyped/master/jquery/jquery.d.ts", - "key": "9aedb9357f0e835ea1df6092ed4fedd5e793b126", + "url": "https://api.github.com/repos/borisyankov/DefinitelyTyped/contents/jquery/jquery.d.ts?ref=master", + "key": "9475d358a03312943fd546c6b7ce2f74748514d0", "contentType": "video/mp2t", "cacheCreated": "2014-06-21T03:12:54.355Z", "cacheUpdated": "2014-06-21T04:11:57.073Z", diff --git a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/9a/9aedb9357f0e835ea1df6092ed4fedd5e793b126.raw b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/94/9475d358a03312943fd546c6b7ce2f74748514d0.raw similarity index 100% rename from test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/9a/9aedb9357f0e835ea1df6092ed4fedd5e793b126.raw rename to test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/94/9475d358a03312943fd546c6b7ce2f74748514d0.raw diff --git a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/22/2271dafd800fb0437db21c63217a3ba8407b7c55.json b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/bd/bd6bd1beef3497d75dcfdb27dfb5c041b045c50c.json similarity index 65% rename from test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/22/2271dafd800fb0437db21c63217a3ba8407b7c55.json rename to test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/bd/bd6bd1beef3497d75dcfdb27dfb5c041b045c50c.json index e28563b..1a00645 100644 --- a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/22/2271dafd800fb0437db21c63217a3ba8407b7c55.json +++ b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/bd/bd6bd1beef3497d75dcfdb27dfb5c041b045c50c.json @@ -1,6 +1,6 @@ { - "url": "https://raw.githubusercontent.com/borisyankov/DefinitelyTyped/master/async/async.d.ts", - "key": "2271dafd800fb0437db21c63217a3ba8407b7c55", + "url": "https://api.github.com/repos/borisyankov/DefinitelyTyped/contents/async/async.d.ts?ref=master", + "key": "bd6bd1beef3497d75dcfdb27dfb5c041b045c50c", "contentType": "video/mp2t", "cacheCreated": "2014-06-21T03:12:50.808Z", "cacheUpdated": "2014-06-21T04:11:53.749Z", diff --git a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/22/2271dafd800fb0437db21c63217a3ba8407b7c55.raw b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/bd/bd6bd1beef3497d75dcfdb27dfb5c041b045c50c.raw similarity index 100% rename from test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/22/2271dafd800fb0437db21c63217a3ba8407b7c55.raw rename to test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/bd/bd6bd1beef3497d75dcfdb27dfb5c041b045c50c.raw diff --git a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/11/1166d8058295930735943069d75369fd520c8a76.json b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/c0/c038a3295cd6fc9104b0acdfe260e5f28f4e7613.json similarity index 64% rename from test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/11/1166d8058295930735943069d75369fd520c8a76.json rename to test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/c0/c038a3295cd6fc9104b0acdfe260e5f28f4e7613.json index 3fa7384..06f5c0b 100644 --- a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/11/1166d8058295930735943069d75369fd520c8a76.json +++ b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/c0/c038a3295cd6fc9104b0acdfe260e5f28f4e7613.json @@ -1,6 +1,6 @@ { - "url": "https://raw.githubusercontent.com/borisyankov/DefinitelyTyped/master/bootstrap/bootstrap.d.ts", - "key": "1166d8058295930735943069d75369fd520c8a76", + "url": "https://api.github.com/repos/borisyankov/DefinitelyTyped/contents/bootstrap/bootstrap.d.ts?ref=master", + "key": "c038a3295cd6fc9104b0acdfe260e5f28f4e7613", "contentType": "video/mp2t", "cacheCreated": "2014-06-21T03:12:52.361Z", "cacheUpdated": "2014-06-21T04:11:55.329Z", diff --git a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/11/1166d8058295930735943069d75369fd520c8a76.raw b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/c0/c038a3295cd6fc9104b0acdfe260e5f28f4e7613.raw similarity index 100% rename from test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/11/1166d8058295930735943069d75369fd520c8a76.raw rename to test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/c0/c038a3295cd6fc9104b0acdfe260e5f28f4e7613.raw diff --git a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/3a/3ade19e775aa771afa43579727d13495e1502a0a.json b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/f7/f74eeece0a10c145464cec52f43e9ea3d72e75c5.json similarity index 65% rename from test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/3a/3ade19e775aa771afa43579727d13495e1502a0a.json rename to test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/f7/f74eeece0a10c145464cec52f43e9ea3d72e75c5.json index 32913d7..9f6f7a8 100644 --- a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/3a/3ade19e775aa771afa43579727d13495e1502a0a.json +++ b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/f7/f74eeece0a10c145464cec52f43e9ea3d72e75c5.json @@ -1,6 +1,6 @@ { - "url": "https://raw.githubusercontent.com/borisyankov/DefinitelyTyped/master/chai/chai.d.ts", - "key": "3ade19e775aa771afa43579727d13495e1502a0a", + "url": "https://api.github.com/repos/borisyankov/DefinitelyTyped/contents/chai/chai.d.ts?ref=master", + "key": "f74eeece0a10c145464cec52f43e9ea3d72e75c5", "contentType": "video/mp2t", "cacheCreated": "2014-06-21T03:12:55.458Z", "cacheUpdated": "2014-06-21T04:11:58.057Z", diff --git a/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/3a/3ade19e775aa771afa43579727d13495e1502a0a.raw b/test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/f7/f74eeece0a10c145464cec52f43e9ea3d72e75c5.raw similarity index 100% rename from test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/3a/3ade19e775aa771afa43579727d13495e1502a0a.raw rename to test/fixtures/tsd-cache/borisyankov-DefinitelyTyped/git-raw-fmt1.0/f7/f74eeece0a10c145464cec52f43e9ea3d72e75c5.raw diff --git a/test/spec/git/fixtures/async-blob.json b/test/spec/git/fixtures/async-blob.json index 9bf158c..33478b3 100644 --- a/test/spec/git/fixtures/async-blob.json +++ b/test/spec/git/fixtures/async-blob.json @@ -1,7 +1,7 @@ { "sha": "5ba56e0dbb7cc433d5b98ab3cbbf5e0d92954ff1", "size": 5060, - "url": "https://api.github.com/repos/borisyankov/DefinitelyTyped/git/blobs/5ba56e0dbb7cc433d5b98ab3cbbf5e0d92954ff1", + "url": "https://api.github.com/repos/DefinitelyTyped/DefinitelyTyped/git/blobs/5ba56e0dbb7cc433d5b98ab3cbbf5e0d92954ff1", "content": "Ly8gVHlwZSBkZWZpbml0aW9ucyBmb3IgQXN5bmMgMC4xLjIzDQovLyBQcm9q\nZWN0OiBodHRwczovL2dpdGh1Yi5jb20vY2FvbGFuL2FzeW5jDQovLyBEZWZp\nbml0aW9ucyBieTogQm9yaXMgWWFua292IDxodHRwczovL2dpdGh1Yi5jb20v\nYm9yaXN5YW5rb3YvPg0KLy8gRGVmaW5pdGlvbnM6IGh0dHBzOi8vZ2l0aHVi\nLmNvbS9ib3Jpc3lhbmtvdi9EZWZpbml0ZWx5VHlwZWQNCg0KaW50ZXJmYWNl\nIEFzeW5jTXVsdGlwbGVSZXN1bHRzQ2FsbGJhY2s8VD4geyAoZXJyOiBzdHJp\nbmcsIHJlc3VsdHM6IFRbXSk6IGFueTsgfQ0KaW50ZXJmYWNlIEFzeW5jU2lu\nZ2xlUmVzdWx0Q2FsbGJhY2s8VD4geyAoZXJyOiBzdHJpbmcsIHJlc3VsdDog\nVCk6IGFueTsgfQ0KaW50ZXJmYWNlIEFzeW5jVGltZXNDYWxsYmFjazxUPiB7\nIChuOiBudW1iZXIsIGNhbGxiYWNrOiBBc3luY011bHRpcGxlUmVzdWx0c0Nh\nbGxiYWNrPFQ+KTogdm9pZDsgfQ0KaW50ZXJmYWNlIEFzeW5jSXRlcmF0b3I8\nVD4geyAoaXRlbTogVCwgY2FsbGJhY2s6IEFzeW5jTXVsdGlwbGVSZXN1bHRz\nQ2FsbGJhY2s8VD4pOiB2b2lkOyB9DQppbnRlcmZhY2UgQXN5bmNNZW1vSXRl\ncmF0b3I8VD4geyAobWVtbzogVCwgaXRlbTogVCwgY2FsbGJhY2s6IEFzeW5j\nU2luZ2xlUmVzdWx0Q2FsbGJhY2s8VD4pOiB2b2lkOyB9DQppbnRlcmZhY2Ug\nQXN5bmNXb3JrZXI8VD4geyAodGFzazogVCwgY2FsbGJhY2s6IEZ1bmN0aW9u\nKTogdm9pZDsgfQ0KDQppbnRlcmZhY2UgQXN5bmNRdWV1ZTxUPiB7DQogICAg\nbGVuZ3RoKCk6IG51bWJlcjsNCiAgICBjb25jdXJyZW5jeTogbnVtYmVyOw0K\nICAgIHB1c2godGFzazogVCwgY2FsbGJhY2s6IEFzeW5jTXVsdGlwbGVSZXN1\nbHRzQ2FsbGJhY2s8VD4pOiB2b2lkOw0KICAgIHNhdHVyYXRlZDogQXN5bmNN\ndWx0aXBsZVJlc3VsdHNDYWxsYmFjazxUPjsNCiAgICBlbXB0eTogQXN5bmNN\ndWx0aXBsZVJlc3VsdHNDYWxsYmFjazxUPjsNCiAgICBkcmFpbjogQXN5bmNN\ndWx0aXBsZVJlc3VsdHNDYWxsYmFjazxUPjsNCn0NCg0KaW50ZXJmYWNlIEFz\neW5jIHsNCg0KICAgIC8vIENvbGxlY3Rpb25zDQogICAgZm9yRWFjaDxUPihh\ncnI6IFRbXSwgaXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8VD4sIGNhbGxiYWNr\nOiBBc3luY011bHRpcGxlUmVzdWx0c0NhbGxiYWNrPFQ+KTogdm9pZDsNCiAg\nICBmb3JFYWNoU2VyaWVzPFQ+KGFycjogVFtdLCBpdGVyYXRvcjogQXN5bmNJ\ndGVyYXRvcjxUPiwgY2FsbGJhY2s6IEFzeW5jTXVsdGlwbGVSZXN1bHRzQ2Fs\nbGJhY2s8VD4pOiB2b2lkOw0KICAgIGZvckVhY2hMaW1pdDxUPihhcnI6IFRb\nXSwgbGltaXQ6IG51bWJlciwgaXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8VD4s\nIGNhbGxiYWNrOiBBc3luY011bHRpcGxlUmVzdWx0c0NhbGxiYWNrPFQ+KTog\ndm9pZDsNCiAgICBtYXA8VD4oYXJyOiBUW10sIGl0ZXJhdG9yOiBBc3luY0l0\nZXJhdG9yPFQ+LCBjYWxsYmFjazogQXN5bmNNdWx0aXBsZVJlc3VsdHNDYWxs\nYmFjazxUPik7DQogICAgbWFwU2VyaWVzPFQ+KGFycjogVFtdLCBpdGVyYXRv\ncjogQXN5bmNJdGVyYXRvcjxUPiwgY2FsbGJhY2s6IEFzeW5jTXVsdGlwbGVS\nZXN1bHRzQ2FsbGJhY2s8VD4pOw0KICAgIGZpbHRlcjxUPihhcnI6IFRbXSwg\naXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8VD4sIGNhbGxiYWNrOiBBc3luY011\nbHRpcGxlUmVzdWx0c0NhbGxiYWNrPFQ+KTsNCiAgICBzZWxlY3Q8VD4oYXJy\nOiBUW10sIGl0ZXJhdG9yOiBBc3luY0l0ZXJhdG9yPFQ+LCBjYWxsYmFjazog\nQXN5bmNNdWx0aXBsZVJlc3VsdHNDYWxsYmFjazxUPik7DQogICAgZmlsdGVy\nU2VyaWVzPFQ+KGFycjogVFtdLCBpdGVyYXRvcjogQXN5bmNJdGVyYXRvcjxU\nPiwgY2FsbGJhY2s6IEFzeW5jTXVsdGlwbGVSZXN1bHRzQ2FsbGJhY2s8VD4p\nOw0KICAgIHNlbGVjdFNlcmllczxUPihhcnI6IFRbXSwgaXRlcmF0b3I6IEFz\neW5jSXRlcmF0b3I8VD4sIGNhbGxiYWNrOiBBc3luY011bHRpcGxlUmVzdWx0\nc0NhbGxiYWNrPFQ+KTsNCiAgICByZWplY3Q8VD4oYXJyOiBUW10sIGl0ZXJh\ndG9yOiBBc3luY0l0ZXJhdG9yPFQ+LCBjYWxsYmFjazogQXN5bmNNdWx0aXBs\nZVJlc3VsdHNDYWxsYmFjazxUPik7DQogICAgcmVqZWN0U2VyaWVzPFQ+KGFy\ncjogVFtdLCBpdGVyYXRvcjogQXN5bmNJdGVyYXRvcjxUPiwgY2FsbGJhY2s6\nIEFzeW5jTXVsdGlwbGVSZXN1bHRzQ2FsbGJhY2s8VD4pOw0KICAgIHJlZHVj\nZTxUPihhcnI6IFRbXSwgbWVtbzogVCwgaXRlcmF0b3I6IEFzeW5jTWVtb0l0\nZXJhdG9yPFQ+LCBjYWxsYmFjazogQXN5bmNTaW5nbGVSZXN1bHRDYWxsYmFj\nazxUPik7DQogICAgaW5qZWN0PFQ+KGFycjogVFtdLCBtZW1vOiBULCBpdGVy\nYXRvcjogQXN5bmNNZW1vSXRlcmF0b3I8VD4sIGNhbGxiYWNrOiBBc3luY1Np\nbmdsZVJlc3VsdENhbGxiYWNrPFQ+KTsNCiAgICBmb2xkbDxUPihhcnI6IFRb\nXSwgbWVtbzogVCwgaXRlcmF0b3I6IEFzeW5jTWVtb0l0ZXJhdG9yPFQ+LCBj\nYWxsYmFjazogQXN5bmNTaW5nbGVSZXN1bHRDYWxsYmFjazxUPik7DQogICAg\ncmVkdWNlUmlnaHQ8VD4oYXJyOiBUW10sIG1lbW86IFQsIGl0ZXJhdG9yOiBB\nc3luY01lbW9JdGVyYXRvcjxUPiwgY2FsbGJhY2s6IEFzeW5jU2luZ2xlUmVz\ndWx0Q2FsbGJhY2s8VD4pOw0KICAgIGZvbGRyPFQsIFU+KGFycjogVFtdLCBt\nZW1vOiBULCBpdGVyYXRvcjogQXN5bmNNZW1vSXRlcmF0b3I8VD4sIGNhbGxi\nYWNrOiBBc3luY1NpbmdsZVJlc3VsdENhbGxiYWNrPFQ+KTsNCiAgICBkZXRl\nY3Q8VD4oYXJyOiBUW10sIGl0ZXJhdG9yOiBBc3luY0l0ZXJhdG9yPFQ+LCBj\nYWxsYmFjazogQXN5bmNNdWx0aXBsZVJlc3VsdHNDYWxsYmFjazxUPik7DQog\nICAgZGV0ZWN0U2VyaWVzPFQ+KGFycjogVFtdLCBpdGVyYXRvcjogQXN5bmNJ\ndGVyYXRvcjxUPiwgY2FsbGJhY2s6IEFzeW5jTXVsdGlwbGVSZXN1bHRzQ2Fs\nbGJhY2s8VD4pOw0KICAgIHNvcnRCeTxUPihhcnI6IFRbXSwgaXRlcmF0b3I6\nIEFzeW5jSXRlcmF0b3I8VD4sIGNhbGxiYWNrOiBBc3luY011bHRpcGxlUmVz\ndWx0c0NhbGxiYWNrPFQ+KTsNCiAgICBzb21lPFQ+KGFycjogVFtdLCBpdGVy\nYXRvcjogQXN5bmNJdGVyYXRvcjxUPiwgY2FsbGJhY2s6IEFzeW5jTXVsdGlw\nbGVSZXN1bHRzQ2FsbGJhY2s8VD4pOw0KICAgIGFueTxUPihhcnI6IFRbXSwg\naXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8VD4sIGNhbGxiYWNrOiBBc3luY011\nbHRpcGxlUmVzdWx0c0NhbGxiYWNrPFQ+KTsNCiAgICBldmVyeTxUPihhcnI6\nIFRbXSwgaXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8VD4sIGNhbGxiYWNrOiAo\ncmVzdWx0OiBib29sZWFuKSA9PiBhbnkpOw0KICAgIGFsbDxUPihhcnI6IFRb\nXSwgaXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8VD4sIGNhbGxiYWNrOiAocmVz\ndWx0OiBib29sZWFuKSA9PiBhbnkpOw0KICAgIGNvbmNhdDxUPihhcnI6IFRb\nXSwgaXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8VD4sIGNhbGxiYWNrOiBBc3lu\nY011bHRpcGxlUmVzdWx0c0NhbGxiYWNrPFQ+KTsNCiAgICBjb25jYXRTZXJp\nZXM8VD4oYXJyOiBUW10sIGl0ZXJhdG9yOiBBc3luY0l0ZXJhdG9yPFQ+LCBj\nYWxsYmFjazogQXN5bmNNdWx0aXBsZVJlc3VsdHNDYWxsYmFjazxUPik7DQoN\nCiAgICAvLyBDb250cm9sIEZsb3cNCiAgICBzZXJpZXM8VD4odGFza3M6IFRb\nXSwgY2FsbGJhY2s/OiBBc3luY011bHRpcGxlUmVzdWx0c0NhbGxiYWNrPFQ+\nKTogdm9pZDsNCiAgICBzZXJpZXM8VD4odGFza3M6IFQsIGNhbGxiYWNrPzog\nQXN5bmNNdWx0aXBsZVJlc3VsdHNDYWxsYmFjazxUPik6IHZvaWQ7DQogICAg\ncGFyYWxsZWw8VD4odGFza3M6IFRbXSwgY2FsbGJhY2s/OiBBc3luY011bHRp\ncGxlUmVzdWx0c0NhbGxiYWNrPFQ+KTogdm9pZDsNCiAgICBwYXJhbGxlbDxU\nPih0YXNrczogVCwgY2FsbGJhY2s/OiBBc3luY011bHRpcGxlUmVzdWx0c0Nh\nbGxiYWNrPFQ+KTogdm9pZDsNCiAgICB3aGlsc3QodGVzdDogRnVuY3Rpb24s\nIGZuOiBGdW5jdGlvbiwgY2FsbGJhY2s6IEZ1bmN0aW9uKTogdm9pZDsNCiAg\nICB1bnRpbCh0ZXN0OiBGdW5jdGlvbiwgZm46IEZ1bmN0aW9uLCBjYWxsYmFj\nazogRnVuY3Rpb24pOiB2b2lkOw0KICAgIHdhdGVyZmFsbDxUPih0YXNrczog\nVFtdLCBjYWxsYmFjaz86IEFzeW5jTXVsdGlwbGVSZXN1bHRzQ2FsbGJhY2s8\nVD4pOiB2b2lkOw0KICAgIHdhdGVyZmFsbDxUPih0YXNrczogVCwgY2FsbGJh\nY2s/OiBBc3luY011bHRpcGxlUmVzdWx0c0NhbGxiYWNrPFQ+KTogdm9pZDsN\nCiAgICBxdWV1ZTxUPih3b3JrZXI6IEFzeW5jV29ya2VyPFQ+LCBjb25jdXJy\nZW5jeTogbnVtYmVyKTogQXN5bmNRdWV1ZTxUPjsNCiAgICAvLyBhdXRvKHRh\nc2tzOiBhbnlbXSwgY2FsbGJhY2s/OiBBc3luY011bHRpcGxlUmVzdWx0c0Nh\nbGxiYWNrPFQ+KTogdm9pZDsNCiAgICBhdXRvKHRhc2tzOiBhbnksIGNhbGxi\nYWNrPzogQXN5bmNNdWx0aXBsZVJlc3VsdHNDYWxsYmFjazxhbnk+KTogdm9p\nZDsNCiAgICBpdGVyYXRvcih0YXNrczogRnVuY3Rpb25bXSk6IEZ1bmN0aW9u\nOw0KICAgIGFwcGx5KGZuOiBGdW5jdGlvbiwgLi4uYXJndW1lbnRzOiBhbnlb\nXSk6IHZvaWQ7DQogICAgbmV4dFRpY2s8VD4oY2FsbGJhY2s6IEZ1bmN0aW9u\nKTogdm9pZDsNCg0KICAgIHRpbWVzPFQ+IChuOiBudW1iZXIsIGNhbGxiYWNr\nOiBBc3luY1RpbWVzQ2FsbGJhY2s8VD4pOiB2b2lkOw0KICAgIHRpbWVzU2Vy\naWVzPFQ+IChuOiBudW1iZXIsIGNhbGxiYWNrOiBBc3luY1RpbWVzQ2FsbGJh\nY2s8VD4pOiB2b2lkOw0KDQogICAgLy8gVXRpbHMNCiAgICBtZW1vaXplKGZu\nOiBGdW5jdGlvbiwgaGFzaGVyPzogRnVuY3Rpb24pOiBGdW5jdGlvbjsNCiAg\nICB1bm1lbW9pemUoZm46IEZ1bmN0aW9uKTogRnVuY3Rpb247DQogICAgbG9n\nKGZuOiBGdW5jdGlvbiwgLi4uYXJndW1lbnRzOiBhbnlbXSk6IHZvaWQ7DQog\nICAgZGlyKGZuOiBGdW5jdGlvbiwgLi4uYXJndW1lbnRzOiBhbnlbXSk6IHZv\naWQ7DQogICAgbm9Db25mbGljdCgpOiBBc3luYzsNCn0NCg0KZGVjbGFyZSB2\nYXIgYXN5bmM6IEFzeW5jOw0KDQpkZWNsYXJlIG1vZHVsZSAiYXN5bmMiIHsN\nCglleHBvcnQgPSBhc3luYzsNCn0=\n", "encoding": "base64", "meta": {